【问题标题】:How to make Android library resources private?如何将 Android 库资源设为私有?
【发布时间】:2017-06-11 08:15:11
【问题描述】:

如何将我的 Android 库模块中的资源(字符串、尺寸、颜色等)设为私有?

我已经尝试了两种记录方法,但都没有工作......

  1. 按照official Android doc 创建一个 res/values/public.xml 不起作用;所有资源都保留 在使用此库的应用中公开。
  2. 按照Chris Banes's instruction(并在this StackOverflow answer 中重申)创建一个 res-public/values/public.xml 文件夹也不起作用;所有的 这些资源是私有的,但在public.xml 中列出的资源 文件未按应有的方式公开。

是否有人拥有将图书馆资源设为私有的明确说明?是否有任何开源库正确地将其资源设为私有?

我正在使用...

  • Android Studio v2.2.3
  • buildToolsVersion "24.0.2"
  • com.android.tools.build:gradle:2.2.3

【问题讨论】:

  • appcompat-v7 使用它。如果您查看 AAR,您将看到基于此信息生成的 public.txtit uses res-publicthe design support libraryits material-android successor 同上。
  • 谢谢,@CommonsWare。这些链接帮助我找到了问题的根源......在我的 build.gradle sourceSets 中引用我的 resres-public 文件夹时,我的路径不正确。

标签: android android-studio android-gradle-plugin android-resources android-library


【解决方案1】:

除非您开始明确声明模块中的任何资源为公共资源,否则您的资源在任何模块(库等)中都被假定为公共资源。那时,您基本上选择加入(模块内)的每个资源都是私有的,除了您标记为公共的资源。这保留了向后兼容性,让您在具有许多模块的大型项目中逐步收紧访问。

要将所有资源设为私有,只需将 添加到您现有的任何资源文件中。

上面的答案谈到添加一个特定的资源目录只是为了管理公共/私有修饰符。虽然这样可行,但我可能建议您在声明它们的位置旁边的主资源文件中管理可见性和声明。这是我与全新库模块一起使用的示例 strings.xml 资源文件。字符串名称中的公共/私有前缀仅用于说明目的。

res/values/strings.xml

<resources>
  <string name="app_name">My Library2</string>

  <public type="string" name="public_string_in_lib2" />
  <string name="public_string_in_lib2">public string in lib2</string>

  <string name="private_string_in_lib2">private string in lib2</string>
</resources>

从根本上说,这些限定条件用于创建一个嵌入在 AAR 中的 public.txt 文件,该文件将由另一个模块依赖。各种工具(如 Android Studio)将使用此信息来标记/警告,但从技术上讲,除非他们的工具非常严格,否则不会阻止库的使用者使用资源。

【讨论】:

    【解决方案2】:

    选项 #2 确实有效。我没有在 build.gradle 中正确定义我的 sourceSets...

    sourceSets {
        main.res.srcDirs = [
            'src/main/res',
            'src/main/res-public'
        ]
    }
    

    【讨论】:

    • 您能分享一下解决方案吗?它对我不起作用:(
    • @Gus 上述解决方案对我不起作用。尽管如此,我仍然可以访问主应用程序模块中的私有资源
    • @AKASHWANGALWAR 查看这个 android 文档,developer.android.com/studio/projects/…
    • 你是如何让它发挥作用的?它对我不起作用(Gradle 插件:3.3.1)
    • 资源私有化意味着,您不会在 lint 或建议中看到它们。但如果你知道你可以访问它们。我的问题是如何在两个不同的地方有两组资源文件夹?我收到错误res/values already exist, please try different qualifier
    猜你喜欢
    • 2022-01-19
    • 2020-06-26
    • 2014-05-22
    • 2016-09-24
    • 2013-08-27
    • 2016-10-18
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多