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

Nea*_*che 7 android custom-attributes android-build aapt

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

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

AppProject
  Include: BrandALibrary or BrandBLibrary
  Include: SharedLibrary

SharedLibrary
-> src/..
-> res/..
BrandALibrary
-> res/..
BrandBLibrary
-> res/..
Run Code Online (Sandbox Code Playgroud)

通过在构建时使用命令行开关包含.properties文件,可以在构建时切换"BrandALibrary或BrandBLibrary".没有什么太花哨的了.构建脚本还必须在构建时更改.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
Run Code Online (Sandbox Code Playgroud)

我的自定义属性是什么壮观,我有一个state_add和state_list定义的,我可以用它来设置默认的状态显示与指示哪些国家应该显示图标的按钮控制.在某种程度上它就像一个"切换"按钮,我最终可能会用切换按钮替换这个控件.

我在创建此按钮时遵循了本教程.

我的问题是,最后(这个家伙啰嗦不是他?),有没有办法确保aapt将"重新映射"自定义属性中使用的包名称.如果我甚至想在我们的库中编写更多自定义控件,我们需要appt才能执行以下操作:

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

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

小智 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" >
...
Run Code Online (Sandbox Code Playgroud)

  • 另一个不错的参考文章:Android库和自定义xml属性的情况(第2部分)http://devmaze.wordpress.com/2011/05/22/the-case-of-android-libraries-and-custom-xml-属性部分-2 / (3认同)