[android6.0]添加System Jar记录
2016-06-30 11:53
483 查看
昨天模拟客户一个问题,尝试在系统jar中依赖静态jar,然后被apk去call系统jar,是否会出现启动apk,系统jar再次做dex2oat行文。
如下是我做系统jar的步骤:
1 新建java工程A,写一个简单的java工具类,这个java工程作为系统jar可以被apk直接去call
2 新建java工程B,写一个简单的java工具类,这个Java工程java code会export出来,作为静态jar被系统jar依赖。
对应的目录结构截图如下::
其中jars存放的java工程B java code导出来的静态jar,com.system.info.xml主要用来配置系统jar的名称和系统存放的位置,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="com.system.info"
file="/system/framework/com.system.info.jar"/>
</permissions>
在Android.mk中有定义prebuild静态Jar的方法,以及系统jar依赖静态jar。内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := demo:jars/demo.jar
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)
# Build the Java library.
# ============================================================
include $(CLEAR_VARS)
LOCAL_MODULE :=com.system.info
LOCAL_SRC_FILES := \
$(call all-java-files-under,src) \
LOCAL_STATIC_JAVA_LIBRARIES := \
demo
LOCAL_REQUIRED_MODULES := \
com.system.info.xml \
include $(BUILD_JAVA_LIBRARY)
# Install permissions for this shared jar
# ============================================================
include $(CLEAR_VARS)
LOCAL_MODULE := com.system.info.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
其中在编译com.system.info.jar时有去声明需要com.system.info.xml,因此此文件会自动编译到系统。即system/etc/permissions目录下。
以上完成了单个模块的实现,mm -B可以编译出对应的jar和xml,但是在整包make时,无法编译出来,且并非是系统jar,因为还没有加到bootclassload里面去。
需要在device.mk添加:
PRODUCT_BOOT_JARS := \
com.system.info
PRODUCT_PACKAGES += \
com.system.info
完成以上添加后,要make clean编译,在编译的时候,一直报这个错误:
Error: out/target/common/obj/JAVA_LIBRARIES/com.system.info_intermediates/classes.jar: unknown package name of class file com/system/info/SystemInfo.class
这个错误很奇怪,无法识别这个Package Name。
后来发现了这个文件:build/core/tasks/package_whitelist.txt
文件开头有如下解释:
# Boot jar package name whitelist.
# Each line is interpreted as a regular expression.
因为我做的系统jar属于Boot jar,需要在这里添加包名,因此修改如下:
# com.system.info.jar
com\.system\.info
com\.system\.info\..*
com\.demo\.test
com\.demo\.test\..*
总结:
1 boot jar添加,需要make clean后编译,编译后busybox env确定是否添加进去。
2 包名前缀建议用com.android.*,否则就要添加进package_whitelist.txt,不然会引起编译问题。
如下是我做系统jar的步骤:
1 新建java工程A,写一个简单的java工具类,这个java工程作为系统jar可以被apk直接去call
2 新建java工程B,写一个简单的java工具类,这个Java工程java code会export出来,作为静态jar被系统jar依赖。
对应的目录结构截图如下::
其中jars存放的java工程B java code导出来的静态jar,com.system.info.xml主要用来配置系统jar的名称和系统存放的位置,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="com.system.info"
file="/system/framework/com.system.info.jar"/>
</permissions>
在Android.mk中有定义prebuild静态Jar的方法,以及系统jar依赖静态jar。内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := demo:jars/demo.jar
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)
# Build the Java library.
# ============================================================
include $(CLEAR_VARS)
LOCAL_MODULE :=com.system.info
LOCAL_SRC_FILES := \
$(call all-java-files-under,src) \
LOCAL_STATIC_JAVA_LIBRARIES := \
demo
LOCAL_REQUIRED_MODULES := \
com.system.info.xml \
include $(BUILD_JAVA_LIBRARY)
# Install permissions for this shared jar
# ============================================================
include $(CLEAR_VARS)
LOCAL_MODULE := com.system.info.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
其中在编译com.system.info.jar时有去声明需要com.system.info.xml,因此此文件会自动编译到系统。即system/etc/permissions目录下。
以上完成了单个模块的实现,mm -B可以编译出对应的jar和xml,但是在整包make时,无法编译出来,且并非是系统jar,因为还没有加到bootclassload里面去。
需要在device.mk添加:
PRODUCT_BOOT_JARS := \
com.system.info
PRODUCT_PACKAGES += \
com.system.info
完成以上添加后,要make clean编译,在编译的时候,一直报这个错误:
Error: out/target/common/obj/JAVA_LIBRARIES/com.system.info_intermediates/classes.jar: unknown package name of class file com/system/info/SystemInfo.class
这个错误很奇怪,无法识别这个Package Name。
后来发现了这个文件:build/core/tasks/package_whitelist.txt
文件开头有如下解释:
# Boot jar package name whitelist.
# Each line is interpreted as a regular expression.
因为我做的系统jar属于Boot jar,需要在这里添加包名,因此修改如下:
# com.system.info.jar
com\.system\.info
com\.system\.info\..*
com\.demo\.test
com\.demo\.test\..*
总结:
1 boot jar添加,需要make clean后编译,编译后busybox env确定是否添加进去。
2 包名前缀建议用com.android.*,否则就要添加进package_whitelist.txt,不然会引起编译问题。
相关文章推荐
- 【安卓】Android的字符串格式化
- android Textview 使用之一:伸缩效果
- Android Studio中的单元测试
- Android 、Java 验证二代身份证号码是否正确
- Android优化应用启动速度
- 静态Fragment碎片使用 范例
- Android 自定义 spinner (背景、字体颜色)
- Android对外置sd卡的权限问题(上)
- Android Design Support Library使用详解
- 没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南
- 下拉刷新 与 ViewPage 的冲突 Tab页存在Scrollview嵌套 recycleview 切换回来焦点不对
- Android Studio connot resolve symbol "XXX" 无法解析的符号
- Android Studio电脑不支持HAXM的解决办法
- 解决android studio 导入项目太慢
- android-多分辨率适配的思路
- Android的Activity屏幕切换动画
- android 系统编译要求,官方资料
- Android之FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
- android 数据库操作详解
- 五 Android Capabilities讲解