如何在构build过程中解决Android库定制属性和包名重新映射?

随着时间的推移,我们的Android项目已经扩展了很多,现在我们正在从同一个源代码树创build多个品牌的APK。 由于Android的软件包命名要求,这已变得具有挑战性。

我们在Android库项目中拥有所有的共享代码,该项目包含在主应用程序项目中。 此外,我们还为每个品牌申请的品牌资源提供Android库“覆盖”。 当我们想要build立一个品牌时,我们会为该品牌添加一些额外的属性,最终在主共享代码Android库之前包含“覆盖”Android库。 为了显示:

AppProject Include: BrandALibrary or BrandBLibrary Include: SharedLibrary SharedLibrary -> src/.. -> res/.. BrandALibrary -> res/.. BrandBLibrary -> res/.. 

'BrandALibrary或BrandBLibrary'是在构build时切换的,通过在构build时使用命令行开关包含.properties文件。 那里没什么特别的。 构build脚本还必须在构build时更改.APK的软件包名称,以便两个.APK文件可以同时在给定设备上共存(主要用于质量保证目的,因为我们不希望客户同时拥有同一时间…虽然他们可以)。

在我们的共享代码库项目中添加一个类之后,所有的工作都很好,直到我们的构build今天破产。 在四处寻找为什么会发生这种情况的原因,我偶然发现了下面的网页,其中的同事遇到了同样的问题,并修复了他的版本的aapt,使之工作:

http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml-attributes-part-2/

在我们的构build过程中,日志中显示了以下错误:

  -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定义了我可以用来设置一个控件的默认状态,该控件显示一个带有图标的button,指示应该显示哪些状态。 这就像一个“切换”button的方式,我可能会最终取代这个控制与切换button。

当我创build这个button时,我遵循这个教程 。

我的问题是,最后(这家伙是不是很长时间的啰嗦),有没有办法确保aapt会“重新映射”自定义属性中使用的包名称。 如果我甚至想把更多的自定义控件写入到我们的库中,我们将需要能够执行以下操作:

  • 如果在库项目中定义了自定义名称空间,请将该名称空间重新映射到正在构build的android应用程序的名称空间。

我是否在Ant构build过程中错过了自定义属性映射方式的基础知识? 有什么简单的,我可以做,以解决我的构build问题?

Solutions Collecting From Web of "如何在构build过程中解决Android库定制属性和包名重新映射?"