Android11编译导入PRODUCT_BOOT_JARS
- Android P以下版本导入PRODUCT_BOOT_JARS
-
- Android编译导入PRODUCT_BOOT_JARS
- 增加package白名单
- 编写jar包Android.mk文件(此jar包为dex文件)
- make编译
- Android 11 版本导入PRODUCT_BOOT_JARS
-
- 编写jar包Android.bp文件(此jar包为class文件)
-
- 使用androidmk命令把Android.mk文件生成Android.bp
- Android.bp增加java_library
- jar包为dex文件编译运行出错处理
-
- check_boot_jars.py 检查出错
- merge_zips合并jar包出错
Android P以下版本导入PRODUCT_BOOT_JARS
Android编译导入PRODUCT_BOOT_JARS
1PRODUCT_PACKAGES += \ 2 com.king.test.module \ 3PRODUCT_BOOT_JARS += \ 4 com.king.test.module \
增加package白名单
源码文件build/make/core/tasks/check_boot_jars/package_allowed_list.txt增加jar包名白名单
1################################################### 2#e.g. com.king.test.module-dex.jar 3com\.king\.test 4com\.king\.test\..*
编写jar包Android.mk文件(此jar包为dex文件)
1LOCAL_PATH := $(call my-dir) 2#e.g. com.king.test.module-dex.jar 3include $(CLEAR_VARS) 4LOCAL_MODULE := com.king.test.module 5LOCAL_MODULE_TAGS := optional 6LOCAL_SRC_FILES := com.king.test.module-dex.jar 7LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX) 8LOCAL_MODULE_CLASS := JAVA_LIBRARIES 9include $(BUILD_PREBUILT)
make编译
$make –j8
Android 11 版本导入PRODUCT_BOOT_JARS
编写jar包Android.bp文件(此jar包为class文件)
使用androidmk命令把Android.mk文件生成Android.bp
$androidmk Android.mk > Android.bp
生成后的文件如下:
1java_import { 2 3 4 name: "com.king.test.module", 5 jars: ["com.king.test.module-class.jar"], 6}
Android.bp增加java_library
如上Android.bp文件会编译报错:
internal error: failed to find a dex jar path for module ’ com.king.test.module’, note that some jars may be filtered out by module constraints
增加java_library定义,installable 为 true ,否则会同样错误,如下:
1java_import { 2 3 4 name: "com.king.test.module_jar", 5 jars: ["com.king.test.module-class.jar"], 6} 7java_library { 8 9 10 name: "com.king.test.module", 11 static_libs: [ 12 " com.king.test.module_jar", 13 ], 14 installable: true, 15}
jar包为dex文件编译运行出错处理
如果jar包是已经编译好的dex文件而不是纯class文件,在Android11上编译会有以下问题,处理方式可参见说明
check_boot_jars.py 检查出错
Error: out/target/common/obj/JAVA_LIBRARIES/ com.king.test.module_intermediates/classes.jar does not contain any class files.
解决方法: 修改build/make/core/tasks/check_boot_jars/check_boot_jars.py,注释"if classes == 0"的判断

也可java_library 增加空的java文件,如下
1// srcs: [ 2// "src/**/*.java", 3// ],
不过此方法会后面编译出错:
Error: Cannot create android app from an archive ‘out/soong/.intermediates/vendor/king/ com.king.test.module/android_common/combined/com.king.test.module.jar’ containing both DEX and Java-bytecode content
merge_zips合并jar包出错
merge_zips.go:752: Duplicate path classes.dex found in out/soong/.intermediates/vendor/king/com.king.test.module/android_common/dex/classes.dex.jar!classes.dex and out/soong/.intermediates/vendor/king/com.king.test.module_jar/android_common/combined/com.king.test.module_jar.jar
解决方法: 修改build/soong/cmd/merge_zips/merge_zips.go,修改参数ignore-duplicates为true
