如何为AOSP添加可被共享Java库访问的系统资源?
我已按照Android构建文档添加了共享Java库,这些库可通过Manifest中的uses-library被应用访问。由于Java库无法包含资源,我按照指引把字符串、Drawable等资源添加到了frameworks/base/core/res/res/values/my_strings.xml中。编译frameworks/base/res后,生成的framework-res.apk里确实包含了新增的字符串,但在库代码中访问android.R.myString时出现编译错误:
src/com.example.lib/MyClass.java:9: error: cannot find symbol
public static int MY_INT = android.R.myString;
^
symbol: variable myString
location: class R
1 error
17:53:18 ninja failed with: exit status 1
请问如何添加系统资源并让共享Java库能够访问?
要让共享Java库能访问新增的系统资源,需确保资源ID被正确生成并同步到库的编译路径中,具体步骤如下:
确认资源定义规范
检查my_strings.xml中的资源命名和格式是否正确,以字符串资源为例:<resources> <string name="myString">示例文本</string> </resources>资源名称需无特殊字符,且与代码中引用的名称完全一致。
重新生成framework的R类
新增资源后,需重新构建frameworks/base模块,生成包含新资源ID的android.R类:make frameworks/base -j$(nproc)配置共享库依赖framework-res
在共享Java库的构建配置文件中,添加对framework-res的依赖,确保编译时能引用到最新的android.R类:- 若使用Android.bp:
java_library { name: "com.example.lib", srcs: ["src/**/*.java"], sdk_version: "system_current", static_libs: ["framework-res"], } - 若使用Android.mk:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_MODULE := com.example.lib LOCAL_STATIC_JAVA_LIBRARIES := framework-res include $(BUILD_STATIC_JAVA_LIBRARY)
- 若使用Android.bp:
清理缓存并重新编译共享库
清除之前的编译缓存,再重新编译库:make com.example.lib clean -j$(nproc) make com.example.lib -j$(nproc)验证资源引用
编译完成后,可查看out/target/common/R/com/android/internal/R.java文件,确认新增的资源ID是否存在,以此验证资源是否已被正确同步。
内容的提问来源于stack exchange,提问作者Banana999

