如何将 Android 图书馆资源设为私有?

How to make Android library resources private?

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

我已经尝试了两种记录在案的方法,但都不起作用...

  1. 在创建 official Android doc 之后 res/values/public.xml 不起作用;所有资源都保留 public 在使用此库的应用程序中。
  2. 以下 Chris Banes's instruction (and reiterated in this Whosebug answer) 创建一个 res-public/values/public.xml 文件夹也不起作用;所有的 资源是私有的,但是 public.xml 中列出的资源 文件未按应有的方式制作 public。

有没有人知道将图书馆资源设为私有的明确说明?是否有任何开源库已将其资源适当地设为私有?

我正在使用...

选项 #2 确实有效。我没有在我的 build.gradle...

中正确定义我的 sourceSets
sourceSets {
    main.res.srcDirs = [
        'src/main/res',
        'src/main/res-public'
    ]
}

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

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

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

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>

从根本上说,这些资格被用来创建一个 public.txt 文件,该文件嵌入到 AAR 中,另一个模块将依赖该文件。 Android Studio 等各种工具会将此信息用于 flag/warn,但从技术上讲,不会阻止库的使用者使用资源,除非他们的工具非常严格。