如何在构建过程中解决Android库的自定义属性和包名映射问题?

7
随着时间的推移,我们的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版本使其正常工作:"

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

在我们的构建过程中,日志中出现了以下错误:

    -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应用程序的命名空间。
在Ant构建期间自定义属性的映射方式是否存在基本问题?是否有简单的方法可以解决我的构建问题?

这是已知的问题。这里是错误状态:http://code.google.com/p/android/issues/detail?id=9656 给它点个赞。我们会更快地得到修复。 :-) - Andrzej Duś
谢谢Andrzej。我已经这样做了。同时,我已经删除了用于此操作的代码,并决定只使用ToggleButton并在代码中适当地操纵其选中状态以获得相同的效果。当框架本身破坏可能性时,这种情况很令人沮丧。 - Neal Sanche
1个回答

19

这个问题已经解决

例如:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto" >
...

3
另一篇很好的参考文章:Android库和自定义XML属性的情况(第2部分)http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml-attributes-part-2/ - Noah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接