随着时间的推移,我们的 Android 项目已经扩展了很多,现在我们正在从同一个源代码树创建多个品牌 APK。由于 Android 的包命名要求,这变得具有挑战性。
我们的所有共享代码都在一个 Android 库项目中,该项目包含在主应用程序项目中。此外,我们还有适用于每个品牌的品牌资源的 Android 库“叠加层”。当我们想要建立一个品牌时,我们会为该品牌添加一些额外的属性,最终在主要共享代码 Android 库之前包括“覆盖”Android 库。为了显示:
AppProject
Include: BrandALibrary or BrandBLibrary
Include: SharedLibrary
SharedLibrary
-> src/..
-> res/..
BrandALibrary
-> res/..
BrandBLibrary
-> res/..
“BrandALibrary 或 BrandBLibrary”在构建时切换,通过在构建时使用命令行开关包含 .properties 文件。那里没有什么太花哨的。构建脚本还必须在构建时更改 .APK 的包名称,以便两个 .APK 文件可以同时在给定设备上共存(主要用于 QA 目的,因为我们不希望客户同时拥有这两个文件)同时......虽然他们可以)。
在向我们的共享代码库项目添加一个类后,直到今天我们的构建中断,一切都运行良好。在寻找发生这种情况的原因时,我偶然发现了以下网页,该人遇到了同样的问题并修复了他的 aapt 版本以使其工作:
在我们的构建过程中,日志中会出现以下错误:
-pre-build:
-code-gen:
[echo] ----------
[echo] Handling aidl files...
[aidl] No aidl files to compile.
[echo] ----------
[echo] Handling RenderScript files...
[renderscript] No renderscript files to compile.
[echo] ----------
[echo] Handling Resources...
[aapt] Found Deleted Target File
[aapt] Generating resource IDs...
[aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\layout\fancy_layout.xml:22: error: No resource identifier found for attribute 'state_add' in package 'com.myapp'
[aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\layout\fancy_layout.xml:22: error: No resource identifier found for attribute 'state_list' in package 'com.myapp'
[aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:4: error: No resource identifier found for attribute 'state_add' in package 'com.myapp'
[aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:4: error: No resource
identifier found for attribute 'state_list' in package 'com.myapp'
[aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector.xml:5: error: No resource
identifier found for attribute 'state_add' in package 'com.myapp'
[aapt] E:\CSI\Neal\trunk\Clients\Android\MyAppSharedLib\res\drawable\fancy_button_selector_button_selector.xml:5: error: No resource identifier found for attribute 'state_list' in package 'com.myapp'
BUILD FAILED
C:\android-sdk\tools\ant\build.xml:539: The following error occurred while executing this line:
C:\android-sdk\tools\ant\build.xml:568: null returned: 1
我的自定义属性没有什么特别之处,我有一个 state_add 和 state_list 定义,我可以使用它来设置控件的默认状态,该控件显示一个带有图标的按钮,该图标指示应显示哪些状态。它在某种程度上就像一个“切换”按钮,我最终可能会用切换按钮替换这个控件。
创建此按钮时,我遵循了本教程。
我的问题是,最后(这家伙是不是很啰嗦?),有没有办法确保 aapt 将“重新映射”自定义属性中使用的包名称。如果我什至想在我们的库中编写更多自定义控件,我们将需要 appt 能够执行以下操作:
- 如果在库项目中定义了自定义命名空间,则将该命名空间重新映射到正在构建的 android 应用程序的命名空间。
在 Ant 构建期间,我是否遗漏了一些基本的自定义属性映射方式?我可以做一些简单的事情来解决我的构建问题吗?