随着时间的推移,我们的Android项目已经扩展了很多,现在我们正在从同一源代码树创建多个品牌的apk。由于Android的包命名要求,这变得很有挑战性。
我们所有的共享代码都在Android Library项目中,它包含在主应用程序项目中。此外,我们还为每个品牌的品牌资源提供了Android库"覆盖"。当我们想要建立一个品牌时,我们会为该品牌添加一些额外的属性,最终在主共享代码Android库之前包含"覆盖"Android库。说明:
AppProject
Include: BrandALibrary or BrandBLibrary
Include: SharedLibrary
SharedLibrary
-> src/..
-> res/..
BrandALibrary
-> res/..
BrandBLibrary
-> res/..
通过在构建时使用命令行开关包括.properties文件,在构建时切换' brandlibrary或BrandBLibrary'。没有太花哨的。构建脚本还必须在构建时更改.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:CSINealtrunkClientsAndroidMyAppSharedLibreslayoutfancy_layout.xml:22: error: No resource identifier found for attribute 'state_add' in package 'com.myapp'
[aapt] E:CSINealtrunkClientsAndroidMyAppSharedLibreslayoutfancy_layout.xml:22: error: No resource identifier found for attribute 'state_list' in package 'com.myapp'
[aapt] E:CSINealtrunkClientsAndroidMyAppSharedLibresdrawablefancy_button_selector.xml:4: error: No resource identifier found for attribute 'state_add' in package 'com.myapp'
[aapt] E:CSINealtrunkClientsAndroidMyAppSharedLibresdrawablefancy_button_selector.xml:4: error: No resource
identifier found for attribute 'state_list' in package 'com.myapp'
[aapt] E:CSINealtrunkClientsAndroidMyAppSharedLibresdrawablefancy_button_selector.xml:5: error: No resource
identifier found for attribute 'state_add' in package 'com.myapp'
[aapt] E:CSINealtrunkClientsAndroidMyAppSharedLibresdrawablefancy_button_selector_button_selector.xml:5: error: No resource identifier found for attribute 'state_list' in package 'com.myapp'
BUILD FAILED
C:android-sdktoolsantbuild.xml:539: The following error occurred while executing this line:
C:android-sdktoolsantbuild.xml:568: null returned: 1
我的自定义属性没什么了不起的,我已经定义了state_add和state_list,我可以用它们来设置控件的默认状态,该控件显示一个带有图标的按钮,该图标指示应该显示哪些状态。它在某种程度上就像一个"切换"按钮,我可能最终会用切换按钮代替这个控件。
当我创建这个按钮时,我遵循了本教程。
我的问题是,最后(这家伙是长篇大论不是吗?),有没有一种方法来确保aapt将"重新映射"自定义属性中使用的包名。如果我想在我们的库中编写更多的自定义控件,我们将需要appt能够做以下事情:
- 如果在库项目中定义了自定义命名空间,则将该命名空间重新映射到正在构建的android应用程序的命名空间。
我错过了一些基本的方式自定义属性映射在Ant构建?我可以做一些简单的事情来解决我的构建问题吗?
问题解决了。
例如:<?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" >
...