引言
通常我们进行Android应用开发的时候,需要导入Android SDK,也就是android.jar,是一个动态jar包。android.jar提供了framework层的接口能力,其中framework.jar和services.jar是两个重要的jar包,分别做接口暴露和接口实现。
通过adb连接手机,分别输入$BOOTCLASSPATH和$SYSTEMSERVERCLASSPATH可以查看framework.jar和services.jar的实际路径。
$BOOTCLASSPATH
$SYSTEMSERVERPATH
简单理解:
导入的android.jar提供接口声明,应用工程里导入和实现接口调用,在App编译打包的时候骗过编译机制(使编译打包通过),其实接口代码实现并不在App的代码中,而等到App在系统中运行时,调用接口的真正实现在系统的framework.jar和services.jar里面。这也是动态jar包的概念。
我们是否也可以添加自定义的framework.jar和services.jar?如my-framework.jar和my-services.jar。
答案是肯定的,而且好处甚多。
- 打包自己的jar包提供给第三方应用导入,实现接口暴露。
- 自己的代码和原生代码分开管理。
那么下面就参考原生的做法,在Android 9工程源码上添加自己的系统jar包。
1. 添加my-framework和my-services模块
1.1 代码目录结构
我们可以在aosp的任意目录下构建自己的jar包路径,一般在frameworks或者vendor目录下。
以下是在vendor目录下定义myjar模块。
vendor/myjar/
└── source
└── frameworks
├── Android.bp
├── core
│ └── java
│ └── android
│ └── content
│ └── ContextEx.java
└── services
├── Android.bp
└── core
└── java
└── com
└── android
└── server
└── MyManagerService.java
1.2 添加Android.bp
一、在vendor/myjar/source/frameworks/Android.bp中定义my-framework
java_library {
name: "my-framework",
srcs: [
// EX-FRAMEWORK_BASE_SUBDIRS
"core/java/**/*.java",
"core/java/**/*.aidl",
],
exclude_srcs: [
],
static_libs: [
],
dxflags: [
"--core-library",
"--multi-dex",
],
}
二、在vendor/myjar/source/frameworks/services/Android.bp中定义my-services
java_library {
name: "my-services",
srcs: [
// From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
"core/java/**/*.java"
],
exclude_srcs: [
],
libs: [
"my-framework",
"services",
],
// Loaded with System.loadLibrary by android.view.textclassifier
required: [
],
dxflags: [
"--core-library",
"--multi-dex",
],
}
注意my-services中会引用my-framework和原生services的类,因此需要声明依赖的jar。
2. 加入编译环境
2.1 加入PRODUCT_PACKAGES
my-framework和my-services模块声明并单独编译通过后,接下来就加入导工程的编译环境中,这样我们全编工程后就会生成这两个模块。
我们可以在源码工程的device或者build目录下查找“PRODUCT_PACKAGES”关键字,找对应产品的makefile文件在里面添加即可。
+PRODUCT_PACKAGES += \
my-framework \
my-services \
2.2 加入BOOTCLASSPATH
my-framework模块作为接口声明jar,添加到BOOTCLASSPATH。
路径:build/make/target/product/core_minimal.mk
# The order of PRODUCT_BOOT_JARS matters.
# add my-framework
PRODUCT_BOOT_JARS := \
$(TARGET_CORE_JARS) \
ext \
framework \
my-framework \
telephony-common \
voip-common \
ims-common \
1.Android 12的添加路径有差异,可以在build下搜索PRODUCT_BOOT_JARS关键字
2.注意添加的顺序,从上至下代表系统加载优先级,也表示依赖关系(下依赖上)
2.3 加入SYSTEMSERVERCLASSPATH
my-services模块作为接口实现,添加到SYSTEMSERVERCLASSPATH。
路径:build/make/target/product/core_minimal.mk
# The order of PRODUCT_SYSTEM_SERVER_JARS matters.
# add by quexiaolong
PRODUCT_SYSTEM_SERVER_JARS := \
services \
my-services \
ethernet-service \
wifi-service \
1.Android 12的添加路径有差异,可以在build下搜索PRODUCT_SYSTEM_SERVER_JARS 关键字
2.注意添加的顺序,从上至下代表系统加载优先级,也表示依赖关系(下依赖上)
以上就是在Android系统添加自定义jar的基本流程,不同的Android版本会有差别。