如何在构建期间解决Android库自定义属性和包名重新映射?

时间:2011-11-10 23:15:04

标签: android custom-attributes aapt android-build

随着时间的推移,我们的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目的,因为我们不希望客户同时使用这两个.APK文件同时......虽然他们可以)。

在我们的共享代码库项目中添加一个类之后,所有内容都运行良好,直到我们的构建完成。我四处寻找下面这个网页的原因,我偶然发现了以下网页,该网站遇到了同样的问题并修复了他的版本以使其工作:

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将'重新映射'自定义属性中使用的包名称。如果我甚至想在我们的库中编写更多自定义控件,我们需要appt才能执行以下操作:

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

在Ant构建期间,我是否遗漏了自定义属性的映射方式?我可以做些简单的事情来修复构建问题吗?

1 个答案:

答案 0 :(得分:19)

was solved

例如:

<?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" >
...