android - 如何在构建期间解决 Android Libraries 自定义属性和包名称重映射?

标签 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 目的,因为我们不希望客户同时拥有这两个文件)同时……尽管他们可以)。

在向我们的共享代码库项目添加一个类后,直到今天我们的构建中断之前,一切都运行良好。在四处寻找发生这种情况的原因时,我偶然发现了以下网页,其中的同事遇到了同样的问题并修复了他的 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 将“重新映射”自定义属性中使用的包名称。如果我什至想在我们的库中写入更多自定义控件,我们将需要 appt 才能执行以下操作:

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

在 Ant 构建过程中,我是否遗漏了自定义属性映射方式的一些基本内容?我可以做一些简单的事情来解决我的构建问题吗?

最佳答案

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

关于android - 如何在构建期间解决 Android Libraries 自定义属性和包名称重映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087744/

相关文章:

android - 在 32 位操作系统中使用最新版本的 aapt 和 adb

react-native - 如何解决/修复 React Native 编译错误 : AAPT: No resource identifier found for attribute 'appComponentFactory' in package 'android' ?

android - 如何使用 aapt 获取 pkg 信息 (AndroidManifest)

java - 从 SQLiteDatabase.execSQL 获取生成的查询

java - 谷歌眼镜企业版2 : Failed to Initialize Debug Data

r - 更改列表的 'names' 属性

c# - 从 lambda 表达式获取自定义属性

android - 全屏 DialogFragment 关闭 Activity

android - Nativescript命令gradlew.bat失败错误

c# - 通过反射获取 MemberInfo 的类型