読者です 読者をやめる 読者になる 読者になる

r18でのLibrary Projectの挙動変化メモ的な話

id:tomorrowkey さんの

のお話をみていて

 これって Library Projectの仕組みを使っていたので
r18環境で久しぶりに試してみた。その時の挙動変化メモ(以前試したのはr16

ようは上のお話のブログで遣っていたことは

  • コア側
    • default.properties
android.library=true
  • マスタ側
    • default.properties
android.library.reference.1=../AndroidAppCore/

な話で、

  • リソースはコア側に集約、
    • AndroidManifest.xmlのパッケージ名で切替

な事なんですけど、

自分が以前確認していたときは)

  • マスタ側の一部のライブラリをコア側として切り出し
  • マスタ側に同じIDのリソースを持たせて、その場合はマスタ側の値が優先になるので、その値で上書き
    • ただしAndroidManifest.xmlの設定記述は引き継げない
    • jarはコア側のlibsの中を直接参照してね

な利用状況でした。

具体的には
コア・マスタ側それぞれ)

  • AndroidManifest.xml
<meta-data android:value="@string/ADWHIRL_KEY" android:name="ADWHIRL_KEY"/>

で、キーとか指定している keys.xmlを両方に用意して、メイン側で上書きしていたイメージ
(定義していないのはコア側の値がそのまま使われていました)

  • res/values/keys.xml

コア側)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="ADWHIRL_KEY"></string>
</resources>

マスタ側)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="ADWHIRL_KEY">XXXX</string>
</resources>


r18では)
一応これ自体は動くんだけど、
コア側に変更したときに、コア側=>マスタ側と順に手順ふんでクリーンしないと駄目な感じに
(r16の時は赤バッテンとか付かなかった。..)

1. android.libraryの設定をコメントにする=>コア側がクリーン・リビルドできるようになる
コア側)

    • default.properties
#android.library=true

2.コメントを元に戻す=>マスタ側が正常にクリーン・ビルドできるようになる

一応

な設定を使って build.xml経由で入れる場合は問題無いんですが


clean => release => after-copy =>aftert-copy-install
変更モジュールとして単に入れたいだけの場合は、面倒になった><


これは以前からあったかもしれないけど)

  • AndroidManifest.xml
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:enabled="true">

な記述がある場合、マスタ側にも同名リソース,IDがないと怒られるorz
この場合は

  • res/drawable/icon
  • res/values/string.xml
    • app_nameリソース定義 あたり(ココはデフォルトで入っていることが多いはず)

あとは
コア側)

        <activity android:name=".hogehoge"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait"
		          android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|fontScale|uiMode"
                  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

マスタ側)

  • 同じ記述ならOK
  • 違う記述ならエラーになる(ClassNotFoundException)
    • hogehoge2は、hogehogeをextendsした機能拡張Activity です*1
    • コアもhogehoge2にするなら動く*2
        <activity android:name=".hogehoge2"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait"
		          android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|fontScale|uiMode"
                  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

ココが変更できると extends拡張した側で、@overideで動きが違う処理が
快適に書けるのにな。..とか思っていたりしています*3


追記)
 android:configChanges => onNewIntent を上書き というお話がありますが
Android2系だとresizeが発行されてしまうケースが有るようなので

な対応は別途必要かも

*1:コア側に存在

*2:これが一番謎だと思っている処理。。

*3:単一ソースないでパッケージ名で処理分岐するより