手把手教你aosp13/14上实现PRODUCT_BOOT_JARS/boot jar(有源码)-千里马framework

本文主要是介绍手把手教你aosp13/14上实现PRODUCT_BOOT_JARS/boot jar(有源码)-千里马framework,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

经常设备厂商可能开发一些功能时候会有一些和芯片厂商打交道,比如mtk,海思,amlogic,高通啥的。这些芯片商一些相关功能比如Tv啥的,可能接口各不一样。但是对于设备厂商肯定想要统一的接口对于上层,不可能让设备厂商app根据每个平台出个不一样app。

在这里插入图片描述
这种会大大增加app维护成本,故是不推荐的方案。

是否可以把Tv相关app需要接口都做成公共接口jar,然后这个接口jar自己去实现各个平台差异,即每个平台都会有不同的实现,但是对于Tv这个app来说并不关心,因为他只依赖一个公共接口jar就行,至于你这个接口jar具体实现自己根据平台自己来实现。类似依赖是中间件jar,中间层,apk只依赖中间层接口,具体差异中间层自己去平台对接。

在这里插入图片描述
但是这个中间件怎么集成好呢?如果依旧编译到apk里面那就和老方案就没啥大差别,一样会让Tv这个apk需要频繁打包,如果中间件的jar放到公共framework的部分,那么这个时候apk就不需要进行针对平台单独打包,所以这个时候就需要学习今天问题重点:
手把手教你实现aosp14上的boot jar。

先直观认识boot jar:
字面意思理解就是一开机启动系统就已经自动加载好了的jar包
具体验证方式:输入$BOOTCLASSPATH命令

emulator_x86_64:/system/etc/permissions # $BOOTCLASSPATH
/system/bin/sh: /apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/framework-graphics.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/boot_jar.jar:/system/framework/ims-common.jar:/apex/com.android.i18n/javalib/core-icu4j.jar:/apex/com.android.adservices/javalib/framework-adservices.jar:/apex/com.android.adservices/javalib/framework-sdksandbox.jar:/apex/com.android.appsearch/javalib/framework-appsearch.jar:/apex/com.android.btservices/javalib/framework-bluetooth.jar:/apex/com.android.configinfrastructure/javalib/framework-configinfrastructure.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.devicelock/javalib/framework-devicelock.jar:/apex/com.android.healthfitness/javalib/framework-healthfitness.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar:/apex/com.android.media/javalib/updatable-media.jar:/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:/apex/com.android.ondevicepersonalization/javalib/framework-ondevicepersonalization.jar:/apex/com.android.os.statsd/javalib/framework-statsd.jar:/apex/com.android.permission/javalib/framework-permission.jar:/apex/com.android.permission/javalib/framework-permission-s.jar:/apex/com.android.scheduling/javalib/framework-scheduling.jar:/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:/apex/com.android.tethering/javalib/framework-connectivity.jar:/apex/com.android.tethering/javalib/framework-connectivity-t.jar:/apex/com.android.tethering/javalib/framework-tethering.jar:/apex/com.android.uwb/javalib/framework-uwb.jar:/apex/com.android.virt/javalib/framework-virtualization.jar:/apex/com.android.wifi/javalib/framework-wifi.jar: inaccessible or not found

实现业务jar包和预制到system/framework目录

framework/base路径下做一个简单的接口实现jar包

commit 10f6d3189f290820f1f7d2b2f88a8ca66855cd56 (HEAD -> android-14.0.0_r15)
Author: Your Name <you@example.com>
Date:   Wed Mar 27 22:58:39 2024 +0800add boot  jar modifyChange-Id: I27645a05b65c743c8200b4a3b190d6d6908caeeediff --git a/cmds/boot_jar/Android.bp b/cmds/boot_jar/Android.bp
new file mode 100644
index 000000000000..0ca613d3b077
--- /dev/null
+++ b/cmds/boot_jar/Android.bp
@@ -0,0 +1,10 @@
+// Copyright 2008 The Android Open Source Project
+//
+
+java_library {
+    name: "boot_jar",
+    srcs: [
+        "src/**/*.java",
+    ],
+    installable: true,
+}
\ No newline at end of file
diff --git a/cmds/boot_jar/src/com/hello/BootTest.java b/cmds/boot_jar/src/com/hello/BootTest.java
new file mode 100644
index 000000000000..9f1a90d774ec
--- /dev/null
+++ b/cmds/boot_jar/src/com/hello/BootTest.java
@@ -0,0 +1,7 @@
+package  com.hello;
+
+public  class BootTest {
+    public void testBootJar(){
+        android.util.Log.i("lsm","testBootJar --- realPart");
+    }
+}
\ No newline at end of file

接下来还有关键步骤预制成bootjar
路径build/make/target/product/default_art_config.mk

test@test:~/disk2/aosp14/build/make/target/product$ git diff
diff --git a/target/product/default_art_config.mk b/target/product/default_art_config.mk
index d970203470..72033c1b77 100644
--- a/target/product/default_art_config.mk
+++ b/target/product/default_art_config.mk
@@ -45,6 +45,7 @@ PRODUCT_BOOT_JARS += \ext \telephony-common \voip-common \
+    boot_jar \ims-common# APEX boot jars. Keep the list sorted by module names and then library names.

到这里boot_jar这个jar包就被放入到system/framework目录了

需要添加相关的白名单

build/soong下面对package_allowed_list进行相关包名添加

test@test:~/disk2/aosp14/build/soong$ git diff
diff --git a/scripts/check_boot_jars/package_allowed_list.txt b/scripts/check_boot_jars/package_allowed_list.txt
index 869fd3f83..c00aa29b5 100644
--- a/scripts/check_boot_jars/package_allowed_list.txt
+++ b/scripts/check_boot_jars/package_allowed_list.txt
@@ -254,3 +254,7 @@ com\.google\.i18n\.phonenumbers# Packages used for Android in Chrome OSorg\.chromium\.arcorg\.chromium\.arc\..*
+###################################################
+# Packages used for com.hello
+com\.hello
+com\.hello\..*
\ No newline at end of file

测试程序

上面只是写好了一个bootjar需要开始验证是否可以使用这个bootjar

1、验证一下系统启动后是否已经有了这个jar

emulator_x86_64:/system/etc/permissions # $BOOTCLASSPATH
/system/bin/sh: /apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/framework-graphics.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/boot_jar.jar:/system/framework/ims-common.jar:/apex/com.android.i18n/javalib/core-icu4j.jar:/apex/com.android.adservices/javalib/framework-adservices.jar:/apex/com.android.adservices/javalib/framework-sdksandbox.jar:/apex/com.android.appsearch/javalib/framework-appsearch.jar:/apex/com.android.btservices/javalib/framework-bluetooth.jar:/apex/com.android.configinfrastructure/javalib/framework-configinfrastructure.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.devicelock/javalib/framework-devicelock.jar:/apex/com.android.healthfitness/javalib/framework-healthfitness.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar:/apex/com.android.media/javalib/updatable-media.jar:/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:/apex/com.android.ondevicepersonalization/javalib/framework-ondevicepersonalization.jar:/apex/com.android.os.statsd/javalib/framework-statsd.jar:/apex/com.android.permission/javalib/framework-permission.jar:/apex/com.android.permission/javalib/framework-permission-s.jar:/apex/com.android.scheduling/javalib/framework-scheduling.jar:/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:/apex/com.android.tethering/javalib/framework-connectivity.jar:/apex/com.android.tethering/javalib/framework-connectivity-t.jar:/apex/com.android.tethering/javalib/framework-tethering.jar:/apex/com.android.uwb/javalib/framework-uwb.jar:/apex/com.android.virt/javalib/framework-virtualization.jar:/apex/com.android.wifi/javalib/framework-wifi.jar: inaccessible or not found

看看是否包含上面设置的boot_jar.jar的这个包
确定有了之后在进入下一步进行app层面调用,注意这里调用又分为系统应用和普通第三方应用:

1、系统应用的情况,这种最为简单,因为不需要考虑相关权限访问的问题
路径packages/apps/Launcher3:
修改patch如下

diff --git a/Android.bp b/Android.bp
index a7edf2a9b9..1be5c49586 100644
--- a/Android.bp
+++ b/Android.bp
@@ -295,6 +295,7 @@ android_library {resource_dirs: [],libs: ["framework-statsd",
+        "boot_jar",],// Note the ordering here is important when it comes to resource// overriding. We want the most specific resource overrides defined
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 66690431ec..a0e0fe6eb4 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -591,7 +591,6 @@ public class Launcher extends StatefulActivity<LauncherState>setTitle(R.string.home_screen);mStartupLatencyLogger.logEnd(LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE);}
-/*** Create {@link StartupLatencyLogger} that only collects launcher startup latency metrics* without sending them anywhere. Child class can override this method to create logger
@@ -2120,6 +2119,8 @@ public class Launcher extends StatefulActivity<LauncherState>mTouchInProgress = false;break;}
+        android.util.Log.i("lsm","Launcher dispatchTouchEvent event = " + ev);
+        new com.hello.BootTest().testBootJar();TestLogging.recordMotionEvent(TestProtocol.SEQUENCE_MAIN, "Touch event", ev);return super.dispatchTouchEvent(ev);}
(END)

这里只要触摸了Launcher就会有相关的打印如下

03-27 23:33:16.197  1216  1216 I lsm     : testBootJar --- realPart
03-27 23:33:16.339  1216  1216 I lsm     : Launcher dispatchTouchEvent event = MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=836.9385, y[0]=1386.8682, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=315711, downTime=315567, deviceId=4, source=0xd002, displayId=0, eventId=973480578 }
03-27 23:33:16.340  1216  1216 I lsm     : testBootJar --- realPart

2、第三方应用情况
这种相比系统应用主要会多一个访问系统hidden api的权限问题,这里的话就可以参考另一个文章:
https://blog.csdn.net/learnframework/article/details/124440160

本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

这篇关于手把手教你aosp13/14上实现PRODUCT_BOOT_JARS/boot jar(有源码)-千里马framework的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855790

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代