You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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被正确生成并同步到库的编译路径中,具体步骤如下:

  1. 确认资源定义规范
    检查my_strings.xml中的资源命名和格式是否正确,以字符串资源为例:

    <resources>
        <string name="myString">示例文本</string>
    </resources>
    

    资源名称需无特殊字符,且与代码中引用的名称完全一致。

  2. 重新生成framework的R类
    新增资源后,需重新构建frameworks/base模块,生成包含新资源ID的android.R类:

    make frameworks/base -j$(nproc)
    
  3. 配置共享库依赖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)
      
  4. 清理缓存并重新编译共享库
    清除之前的编译缓存,再重新编译库:

    make com.example.lib clean -j$(nproc)
    make com.example.lib -j$(nproc)
    
  5. 验证资源引用
    编译完成后,可查看out/target/common/R/com/android/internal/R.java文件,确认新增的资源ID是否存在,以此验证资源是否已被正确同步。

内容的提问来源于stack exchange,提问作者Banana999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:58:21