随着时间的推移,我们的Android项目已经大大扩展,现在我们正在从同一源代码树创建多个品牌APK。由于Android的包命名要求,这变得具有挑战性。
我们将所有共享代码放在一个Android库项目中,该项目包含在主应用程序项目中。此外,我们还有针对品牌资源的Android库“覆盖层”。当我们想要构建品牌时,我们会包含几个额外的属性,这些属性最终会在共享代码Android库之前包含“覆盖层”Android库。举例来说:
"BrandALibrary或BrandBLibrary"在构建时可以通过包含.properties文件来进行切换。构建脚本还必须在构建时更改.APK的包名称,以便两个.APK文件可以同时存在于同一设备上(主要是为了QA目的,因为我们不希望客户同时拥有两个...尽管他们可能会)。
一切都运作得非常好,直到今天我们向共享代码库项目添加一个类后,构建出现了问题。在寻找原因时,我偶然发现了以下网页,其中这位先生遇到了相同的问题并修复了他的aapt版本使其正常工作:"
我的自定义属性并没有什么特别的,我定义了一个state_add和state_list,可以用来设置控件的默认状态,该控件显示一个带有图标的按钮,指示应显示哪些状态。它有点像“切换”按钮,我可能会用切换按钮替换这个控件。
创建此按钮时,我遵循了this tutorial。
我的问题是,最后(这家伙真是太啰嗦了),是否有一种方法可以确保aapt将在自定义属性中使用的包名称进行“重新映射”。如果我想将更多的自定义控件写入我们的库中,我们需要aapt能够执行以下操作:
我们将所有共享代码放在一个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,可以用来设置控件的默认状态,该控件显示一个带有图标的按钮,指示应显示哪些状态。它有点像“切换”按钮,我可能会用切换按钮替换这个控件。
创建此按钮时,我遵循了this tutorial。
我的问题是,最后(这家伙真是太啰嗦了),是否有一种方法可以确保aapt将在自定义属性中使用的包名称进行“重新映射”。如果我想将更多的自定义控件写入我们的库中,我们需要aapt能够执行以下操作:
- 如果在库项目中定义了自定义命名空间,请将该命名空间重新映射到正在构建的Android应用程序的命名空间。