Activity Alias のdebug時差し替え利用を考えてみた

はじめに

Activity Alias の説明を読んでて、イマイチ利用利点がわからなかったんだけど

の時、debug時にActivity差し替えられると便利かなーと思って調べたのでメモ

動作環境

  • macOS Sierra
  • 16G
  • HDDタイプのiMac
  • AS 3.0-Canary7
  • gradle plugin 2.3.3
  • gradle runtime-4.1-m1-bin.zip

宣言記述側

  • app/src/main/AndroidManifest.xml
<activity
        android:name="hoge.fuga.maiu.MainRealActivity">
</activity>

<activity-alias 
        android:name="hoge.fuga.maiu.MainActivity"
        android:targetActivity="hoge.fuga.maiu.MainRealActivity"/>
  • app/src/debug/AndroidManifest.xml
<activity
        android:name="hoge.fuga.maiu.MainDebugActivity">
</activity>

<activity-alias 
        tools:replace="android:targetActivity" //★
        android:name="hoge.fuga.maiu.MainActivity"
        android:targetActivity="hoge.fuga.maiu.MainDebugActivity"/>
  • app/src/debug/MainDebugActivity.java
public class MainDebugActivity extends MainRealActivity{

}

な感じを想定。ようはよくある

  • Application => DebugApplication

のActivity版をしたかったイメージ

呼び出し側の書き方

これ結構悩んだ・・・・

Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);

で呼ぼうとするとエラーに・・・

まあ MainActivity.class自体の実体がないから当たり前だが。。。

で色々と調べたら、下記ならOK。

build.gradleの設定でパッケージ名のみ違うdebug.apkを作る上での注意点メモ - exception think

Intent intent = new Intent();
intent.setClassName(getPackageName(), "hoge.fuga.maiu.MainActivity"); //★
startActivity(intent);

又は

Intent intent = new Intent(); 
ComponentName componentName = new ComponentName(getPackageName(),"hoge.fuga.maiu.MainActivity"); 
intent.setComponent(componentName); 
startActivity(intent);

参考サイト


debugフォルダ運用での注意点

運用時の注意点

main
     res
         values         //1
         values-ja    //3
debug
     res
         values         //2
         values-ja    //4

という感じで運用していて、debug-日本語で実行した場合、

上記の順番でリソースは上書きされる

上書き可能なもの

  • layout.xml等のリソースファイル
  • string.xmlの定義

上書き不可なもの

  • styleやattlibute定義のid
    • これマージされる時に別扱いっぽい

debugフォルダだけにあっても問題ないもの

  • sampleデータ
  • debug用のクラス(今回と同じように replaceタグで差し替え運用)