参考我之前android O做动态jar包的文档:android O做services.jar使用的动态jar包_sui1005316018的博客-CSDN博客
有一些区别:
1、android R用的Android.bp,而android O用的是android.mk,下面的是正式项目的一个android.mk,这里面主要注意两点:
(1)android O的android.mk里面的
LOCAL_DEX_PREOPT := false
用
dex_preopt: {
enabled: false,
},
代替
(2)android R需要加installable: true,;否则不会在out下生成jar包,我这边路径是:out/target/product/generic_arm64/system/framework/
java_library {
installable: true,
srcs: ["src/**/*.java"] + [
"src/com/anwsdk/service/IAPhoneLink.aidl",
"src/com/anwsdk/service/IAPhoneLinkCallback.aidl",
],
static_libs: [
"androidx.core_core",
"androidx.legacy_legacy-support-v4",
"androidx.lifecycle_lifecycle-livedata",
"androidx.room_room-runtime",
],
plugins: [
"androidx.room_room-compiler-plugin",
],
dex_preopt: {
enabled: false,
},
name: "btForFramework",
}
2、android O需要修改build/make/core/dex_preopt.mk
在
PRODUCT_SYSTEM_SERVER_CLASSPATH := $(subst $(space),:,$(foreach m,$(PRODUCT_SYSTEM_SERVER_JARS),/system/framework/$(m).jar))
下面增加
PRODUCT_SYSTEM_SERVER_CLASSPATH := $(PRODUCT_SYSTEM_SERVER_CLASSPATH):/system/framework/testjar.jar
但是android R就不一样了,android R的build/make/core/dex_preopt.mk跟O的不一样。
一开始我以为是图中的位置。但是后来测试没有效果
会报错:java.lang.NoClassDefFoundError的错误,找不到我们jar包里面的类
网上查资料都说要
设置什么class path,后来发现源码中有这个文件:
/frameworks/base/apex/jobscheduler/README_js-mainline.md
大体意思是:service-jobscheduler.jar会被services.jar用到,但是不包含在services.jar中。所以要把这个jar包假如到system server classpath。像:
`SYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/com.android.location.provider.jar:/system/framework/service-jobscheduler.jar`;而SYSTEMSERVERCLASSPATH是由PRODUCT_SYSTEM_SERVER_JAR产生的。
所有我就找了下PRODUCT_SYSTEM_SERVER_JAR。
猜测在build/make/core/product_config.mk总添加。找到这一行:
PRODUCT_SYSTEM_SERVER_JARS += $(PRODUCT_SYSTEM_SERVER_JARS_EXTRA)
PRODUCT_SYSTEM_SERVER_JARS_EXTRA其实没有被使用,所以我设置
PRODUCT_SYSTEM_SERVER_JARS_EXTRA := btForFramework
这样就把我们的动态jar包加到class path里面去了。
测试发现可行。