android 修改新增jar 路径

来源:互联网 发布:孟加拉国知乎 编辑:程序博客网 时间:2024/06/05 03:55

平台

CPU: RK3288
OS: android 5.11

需求

新增xxx.jar 并在系统启动后自动加载到启动环境中, 等级等同于framework.jar,参考 BOOTCLASSPATH 变量的设置:
cat /init.environ.rc

export BOOTCLASSPATH /system/my/path/my.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar

其中/system/my/path/my.jar为新增加的jar.

实现思路

新增模块名为: my

让系统能编译新增加的JAR

这部分较为简单:

git diff build/target/product/base.mkdiff --git a/build/target/product/base.mk b/build/target/product/base.mkold mode 100644new mode 100755index 14200f2..67eeae7--- a/build/target/product/base.mk+++ b/build/target/product/base.mk@@ -21,6 +21,7 @@ PRODUCT_PACKAGES += \     appwidget \     appops \     am \+    my \     android.policy \     android.test.runner \     app_process \

使用JAR包输出到指定目录

git diff frameworks/base/Android.mkdiff --git a/frameworks/base/Android.mk b/frameworks/base/Android.mkindex 5105ad5..e8a60b0 100755--- a/frameworks/base/Android.mk+++ b/frameworks/base/Android.mk@@ -1055,6 +1055,19 @@ LOCAL_DX_FLAGS := --core-library include $(BUILD_JAVA_LIBRARY)++java_dirs := java/my+include $(CLEAR_VARS)+LOCAL_MODULE_TAGS := optional+LOCAL_NO_STANDARD_LIBRARIES := true+LOCAL_JAVA_LIBRARIES := framework+LOCAL_SRC_FILES := $(call all-java-files-under, $(java_dirs))+LOCAL_MODULE := my+LOCAL_DX_FLAGS := --core-library+LOCAL_OUT_DIR :=/system/my/path+include $(BUILD_JAVA_LIBRARY) # Include subdirectory makefiles # ============================================================

上面的步骤中, 添加了一个自定义的编译变量: LOCAL_OUT_DIR用于声明指定输出的目录

git diff build/core/base_rules.mkdiff --git a/build/core/base_rules.mk b/build/core/base_rules.mkold mode 100644new mode 100755index 8c25897..7d8750a--- a/build/core/base_rules.mk+++ b/build/core/base_rules.mk@@ -136,7 +136,6 @@ ifneq ($(my_module_relative_path),)   my_module_path := $(my_module_path)/$(my_module_relative_path) endif endif # not LOCAL_UNINSTALLABLE_MODULE ifneq ($(strip $(LOCAL_BUILT_MODULE)$(LOCAL_INSTALLED_MODULE)),)   $(error $(LOCAL_PATH): LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE must not be defined by component makefiles) endif@@ -186,12 +185,14 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))   endif   endif   LOCAL_INSTALLED_MODULE := $(my_module_path)/$(my_installed_module_stem)+#AnsonCode LOCAL_OUT_DIR to make file output to special dir+  ifdef LOCAL_OUT_DIR+       LOCAL_INSTALLED_MODULE := $(PRODUCT_OUT)/$(LOCAL_OUT_DIR)/$(my_installed_module_stem)+  endif endif # Assemble the list of targets to create PRIVATE_ variables for. LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE)

以上修改后, JAR包将会输出到system/my/path/my.jar

最好清空变量:

diff --git a/build/core/clear_vars.mk b/build/core/clear_vars.mkold mode 100644new mode 100755index 52bca70..c4bfc52--- a/build/core/clear_vars.mk+++ b/build/core/clear_vars.mk@@ -250,6 +250,7 @@ LOCAL_MODULE_STEM_32:= LOCAL_MODULE_STEM_64:= LOCAL_CLANG_32:= LOCAL_CLANG_64:=+LOCAL_OUT_DIR:= # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time.

将JAR包添加到BOOTCLASSPATH变量中.

若默认输出到/system/framework 可以增加定义到以下变量:
生成BOOTCLASSPATH的源码在:
build/core/dex_preopt.mk 中的 PRODUCT_BOOTCLASSPATH

ifneq ($(DALVIK_VM_LIB),)# list of boot classpath jars for dexpreoptDEXPREOPT_BOOT_JARS := $(subst $(space),:,$(PRODUCT_BOOT_JARS))DEXPREOPT_BOOT_JARS_MODULES := $(PRODUCT_BOOT_JARS)PRODUCT_BOOTCLASSPATH := $(subst $(space),:,$(foreach m,$(DEXPREOPT_BOOT_JARS_MODULES),/system/framework/$(m).jar))

PRODUCT_BOOT_JARS 的定义在以下两个文件.
build/target/product/core_tiny.mk
build/target/product/core_minimal.mk

# The order mattersPRODUCT_BOOT_JARS := \    core-libart \    conscrypt \    okhttp \    core-junit \    bouncycastle \    ext \    framework \+   my \    telephony-common \    voip-common \    ims-common \    mms-common \    android.policy \    apache-xml \    nullwebview \

即是说, 若需要像framework.jar一样加到BOOTCLASSPATH, 只需像上面代码, 加入my即可.
这样加出来的结果会是:

export BOOTCLASSPATH /system/framework/my.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar

PS:以下为非标准做法, 请小心使用

diff --git a/build/core/dex_preopt.mk b/build/core/dex_preopt.mkold mode 100644new mode 100755index 8a19b66..cc72e68--- a/build/core/dex_preopt.mk+++ b/build/core/dex_preopt.mk@@ -8,7 +8,14 @@ ifneq ($(DALVIK_VM_LIB),) # list of boot classpath jars for dexpreopt DEXPREOPT_BOOT_JARS := $(subst $(space),:,$(PRODUCT_BOOT_JARS)) DEXPREOPT_BOOT_JARS_MODULES := $(PRODUCT_BOOT_JARS)-PRODUCT_BOOTCLASSPATH := $(subst $(space),:,$(foreach m,$(DEXPREOPT_BOOT_JARS_MODULES),/system/framework/$(m).jar))+PRODUCT_BOOTCLASSPATH := /system/my/path/my.jar:$(subst $(space),:,$(foreach m,$(DEXPREOPT_BOOT_JARS_MODULES),/system/framework/$(m).jar))++DEXPREOPT_BOOT_JARS := my:$(subst $(space),:,$(PRODUCT_BOOT_JARS))++DEXPREOPT_BOOT_JARS_MODULES := $(PRODUCT_BOOT_JARS) \+                               my

大功告成:
cat /init.environ.rc

export BOOTCLASSPATH /system/my/path/my.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar