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

时间:2017-01-25 23:32:30

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

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

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

  1. official Android doc之后创建一个 res/values/public.xml不起作用;所有资源仍然存在 在使用此库的应用程序中公开。
  2. 关注Chris Banes's instruction(并在this StackOverflow answer中重申)创建一个 res-public/values/public.xml文件夹也不起作用;所有的 资源是私有的,但是public.xml中列出的资源 文件不应公开,因为它们应该是公开的。
  3. 是否有人拥有将图书馆资源设为私有的明确指示?是否有任何开源库已正确地将其资源私有化?

    我正在使用......

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

2 个答案:

答案 0 :(得分:4)

除非您明确地声明模块中的任何资源是公开的,否则假定您的资源在任何模块(库等)中都是公共的。此时,您基本上选择将每个资源(模块内)作为私有资源,除非您标记为公共资源。这样可以保持向后兼容性,让您逐步减少具有许多模块的大型项目的访问权限。

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

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

<强> RES /值/ 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等各种工具将使用此信息进行标记/警告,但从技术上讲,除非他们的工具非常严格,否则不会阻止库的使用者使用该资源。

答案 1 :(得分:2)

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

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