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

debugする時に追加している記述の備忘録(1)

android gradle realm sqlite

はじめに

最近debug時に、色々と組み込んでる備忘録のメモ

確かに

debug時にのみデバック処理を追加する方法(Applicationクラス差替)

あたりの処理が ManifestMarger により可能になっているので

その点に関しては便利になった気がする

Android Studio 2.3 Beta 3 の所感

下記に独立化しました


で実際の本題

debug時にのみデバック処理を追加する方法(Applicationクラス差替)

  • app/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="hoge.fuga.myapp">

    <application
        android:name=".application.HogeApplication"/>
</manifest>
  • app/debug/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="hoge.fuga.myapp">

    <application
        android:name=".application.DebugHogeApplication"
        tools:replace="android:name" />
</manifest>
  • app/debug/java/DebugHogeApplication.java
public class DebugHogeApplication extends HogeApplication {
    @Override
    public void onCreate() {
        super.onCreate();

        //追記したいDebug記述
    }
}   

ココらへんの話は、

  • Stetho
    • WebView使っていた頃は重宝
    • これ ChromeTab/Intent Browserとかには使えないんだよね・・
  • LeakCanary
    • 依存ライブラリ*1がことごとく引っかかって導入はやめた

を導入しようみたいなお話でよく出てくる

自分が導入しているやつ

古めのプロジェクト用

SQLite

詳細は、下記の話

ちなみに <IntelliJ IDEAなら覗ける> という話もあったけど自分は動かせた経験がないです。端末依存なのかな??*2

  • ただ下記のページの mavenのライブラリは更新されていないので forkして修正パッチ当ててソース導入で使ってる

    • BLOBデータを参照するとエラーになる
    • ポートがぶつかるとアプリの起動時にエラーになる
  • app/debug/java/DebugHogeApplication.java

public class DebugHogeApplication extends HogeApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        // SQLiteにアクセするためのサーバーを起動する
        TelnetSqliteService.createTelnetSqliteServer(getApplicationContext(),12080).start();
    }
}

新しめのプロジェクト

realmのRemoteDebug

詳細は、下記の話。しかもこれ、ほぼ最新じゃないと使えない

public class HogeApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //追記したいDebug記述
        initConfig();
    }
    
    protected void initConfig(){
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder().build();
        Realm.setDefaultConfiguration(config);
    }
}   
  • app/debug/java/DebugHogeApplication.java
public class DebugHogeApplication extends HogeApplication {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    //◎HogeApplicationのinitConfigを上書き
    @Override
    protected void initConfig(){
        Realm.init(this);

        SyncCredentials credentials = SyncCredentials.usernamePassword(
            "hoge@fuga.jp", "hogehoge", false); //△本当に適当なアカウントでOK
            SyncUser.loginAsync(credentials, "http://localhost:9080/auth", new SyncUser.Callback() {

            @Override
            public void onSuccess(SyncUser user) {
                RealmConfiguration config = new SyncConfiguration.Builder(user, "realm://localhost:9080/~/debug").build();
                Realm.setDefaultConfiguration(config);
            }

            @Override
            public void onError(ObjectServerError error) {
                //★ここに通常接続時の記述を書いておくとベター
                Realm.init(this);
                RealmConfiguration config = new RealmConfiguration.Builder().build();
                Realm.setDefaultConfiguration(config);
            }
        });
    }
}   
  • ★に関しては、

    • ★なしのままだと、ローカルにサーバーが立ち上がっていないとクラッシュする
    • debug側のソースをコミットして、レビューする人がコードを見たり実行した時に「エラー出るままのコードコミットするな!!」と怒られる
  • ◎に関して

    • Realm Object Serverに登録する ID/pass なので適当な文字列でOK
    • メール認証とかないので単なる文字列

なので必須

*1:G様のsupport libraryとかも

*2:OS6のGalaxyとかはadb pullすらダメなので、動かせないのは分かるんですけどね・・