android 修改新增jar 路径

简介: android 修改新增jar 路径

#平台

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.mk
diff --git a/build/target/product/base.mk b/build/target/product/base.mk
old mode 100644
new mode 100755
index 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.mk
diff --git a/frameworks/base/Android.mk b/frameworks/base/Android.mk
index 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.mk
diff --git a/build/core/base_rules.mk b/build/core/base_rules.mk
old mode 100644
new mode 100755
index 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.mk
old mode 100644
new mode 100755
index 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


fneq ($(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_BOOT_JARS 的定义在以下两个文件.

build/target/product/core_tiny.mk

build/target/product/core_minimal.mk


# The order matters
PRODUCT_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.mk
old mode 100644
new mode 100755
index 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


后记


android 7.1上新增jar包问题记录


代码路径 frameworks/base/openapi/

Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_JAVA_LIBRARIES := core-oj core-libart framework
LOCAL_SRC_FILES := $(call all-java-files-under, java)
LOCAL_MODULE := openapi
LOCAL_DX_FLAGS := --core-library
include $(BUILD_JAVA_LIBRARY)


build/target/product/base.mk
old mode 100644
new mode 100755
index 4d70664..b8fa3da
--- a/build/target/product/base.mk
+++ b/build/target/product/base.mk
@@ -36,6 +36,7 @@ PRODUCT_PACKAGES += \
     dnsmasq \
     dpm \
     framework \
+    openapi \
     fsck_msdos \
     hid \


修改PRODUCT_BOOT_JARS, 让jar包写入BOOTCLASSPATH

build/target/product/core_minimal.mk
@@ -95,6 +95,7 @@ PRODUCT_BOOT_JARS := \
     bouncycastle \
     ext \
     framework \
+       openapi \
     telephony-common \
     voip-common \
     ims-common \


build/target/product/core_tiny.mk
@@ -92,6 +92,7 @@ PRODUCT_BOOT_JARS := \
     bouncycastle \
     ext \
     framework \
+       openapi \
     telephony-common \
     voip-common \
     ims-common \


build/core/pdk_config.mk
@@ -24,6 +24,7 @@ PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR += \
   target/common/obj/JAVA_LIBRARIES/okhttp_intermediates \
   target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates \
   target/common/obj/JAVA_LIBRARIES/voip-common_intermediates \
+  target/common/obj/JAVA_LIBRARIES/openapi_intermediates \


编译后, 并没有产生可供第三方调用的jar包

rk3288_n712$ ls out/target/common/obj/JAVA_LIBRARIES/openapi_intermediates/
./
../
classes.dex
classes.jack
jack_res_jar_flags
jack-rsc/
jack-rsc.java-source-list
javalib.jar
with-local/


解决方法: make一遍


rk3288_n712$ ls out/target/common/obj/JAVA_LIBRARIES/openapi_intermediates/
./
../
classes/
classes.dex
classes-full-debug.jar
classes.jack
classes.jar
classes-jarjar.jar
jack_res_jar_flags
jack-rsc/
jack-rsc.java-source-list
javalib.jar
with-local/


classes.jar改下名, 就可提供给第三方开发商使用.


验证是否写入 out/target/product/rk3288/root/init.environ.rc

export BOOTCLASSPATH /system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.ja


相关文章
|
6月前
|
Java Android开发
|
3月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
65 0
|
3月前
|
API 开发工具 Android开发
Android Studio:解决AOSP自编译framework.jar引用不到的问题
在Android Studio中解决AOSP自编译framework.jar引用问题的几种方法,包括使用相对路径、绝对路径和通过`${project.rootDir}`动态获取路径的方法,以避免硬编码路径带来的配置问题。
129 0
Android Studio:解决AOSP自编译framework.jar引用不到的问题
|
3月前
|
Java Linux Shell
【Azure 应用服务】部署Jar到App Service for Linux,因启动命令路径配置错误而引起:( Application Error 问题
【Azure 应用服务】部署Jar到App Service for Linux,因启动命令路径配置错误而引起:( Application Error 问题
|
6月前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
233 1
|
6月前
|
Java Android开发
Android编译的jar里面是dex
Android编译的jar里面是dex
68 0
|
6月前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
300 0
Android系统 应用存储路径与权限
|
6月前
|
JSON Android开发 数据格式
Android 打开系统文件管理器,并返回选中文件的路径
Android 打开系统文件管理器,并返回选中文件的路径
163 0
|
6月前
|
Java Android开发
Android module 打包成aar或jar
Android module 打包成aar或jar
184 0
|
6月前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
43 1