如何将Android库资源设为私有?

Gus*_*Gus 10 android android-library android-resources android-studio android-gradle-plugin

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

我已经尝试了两种记录的方法来做到这一点,但都没有工作......

  1. 官方Android doc创建一个 res/values/public.xml不起作用; 所有资源在使用此库的应用程序中保持公开.
  2. 按照Chris Banes的说明(并在StackOverflow的回答中重申)创建 res-public/values/public.xml文件夹也不起作用; 所有资源都是私有的,但public.xml 文件中列出的资源不是公开的.

有没有人有关于使图书馆资源私密的明确指示?是否有任何开源库已正确地将其资源私有化?

我正在使用...

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

Pau*_*ulR 8

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

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

上面的答案谈到添加一个特定的资源目录只是为了管理公共/私有修饰符。虽然这样做有效,但我可能建议您在主资源文件中声明它们的位置旁边管理可见性和声明。这是我与全新库模块一起使用的示例 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>
Run Code Online (Sandbox Code Playgroud)

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


Gus*_*Gus 4

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

sourceSets {
    main.res.srcDirs = [
        'src/main/res',
        'src/main/res-public'
    ]
}
Run Code Online (Sandbox Code Playgroud)