我正在创建一个Android依赖库,它将打包为AAR
文件。依赖项将包含layouts
,strings
,dimens
,images
等。我创建了一个包含此依赖项的示例演示项目。
现在考虑以下情况。
我的库包含一个名为Image
的{{1}}文件,并在布局文件中使用它。演示项目还有一个名为filter.png
的{{1}},但它是一个不同的图像。因此,当项目构建完成后,只会选择应用程序的Image
。所以即使在我的库的布局文件中,我也看到了演示项目使用的图像。
截至目前,我已在每个资源名称之前更改了名称和附加的包名称,以避免出现上述情况。 但有什么方法可以强迫Android只从当前模块中选择资源吗?
答案 0 :(得分:2)
你的app和库将有不同的包名,是的。
截至目前,我已在每个资源名称之前更改了名称和附加的包名称,以避免出现上述情况
这是正确的,因为资源与包名相关联。
com.example.app.R.drawable.filter
(通常仅R.drawable.filter
,检查您的import
声明!),当前模块。
与其他模块com.example.library.R.drawable.filter
[<package_name>.]R.<resource_type>.<resource_name>
答案 1 :(得分:2)
库只能访问自己的资源集,但没有什么可以阻止应用程序故意覆盖库的资源。
为防止意外覆盖,通常在库资源名称前加上前缀。例如,AppCompat使用abc_
前缀,而设计支持库使用design_
前缀。
此外,you can explicitly declare which resources of your library are public,默认情况下其他的将是私有的,如果应用程序覆盖它们,您将收到Lint警告。