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 のパッケージ名を変更して、2 つの .APK ファイルが特定のデバイスで同時に共存できるようにする必要があります (ほとんどの場合、QA の目的で、顧客が両方を同時に持つことは想定されていないためです)。同時に...可能ですが)。

今日、共有コード ライブラリ プロジェクトにクラスを追加した後、ビルドが壊れるまで、すべてがうまく機能していました。これが発生している理由を調べていると、次の Web ページに出くわしました。この Web ページでは、同じ問題に遭遇し、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を定義しました。これを使用して、表示する必要がある状態を示すアイコン付きのボタンを表示するコントロールのデフォルト状態を設定できます. これはある意味で「トグル」ボタンのようなもので、このコントロールをトグル ボタンに置​​き換えることになるかもしれません。

このボタンを作成したときは、このチュートリアルに従いました。

私の質問は、最後に (この男は長々と話していますよね?)、aapt がカスタム属性で使用されるパッケージ名を確実に「再マップ」する方法はありますか? さらにカスタム コントロールをライブラリに書きたい場合でも、次のことを実行できるようにするために appt が必要です。

  • カスタム名前空間がライブラリ プロジェクトで定義されている場合は、その名前空間をビルド中の Android アプリケーションの名前空間に再マップします。

Ant ビルド中にカスタム属性がマップされる方法で、何か基本的なことが抜けていますか? ビルドの問題を修正するためにできる簡単なことはありますか?

4

1 に答える 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" >
...
于 2012-05-24T13:21:36.870 に答える