您的位置:首页 > 移动开发 > Android开发

[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,不然会引起编译问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: