2012年5月31日

android:debuggableでデバッグログ切り替えはやめた方がいい

20120512_debuggable.png

AndroidManifest.xmlのapplicationタグ指定する、android:debuggable属性によるデバッグログのON/OFF切り替えをしばしば見かけるのですが、SDKで警告が出るのもあって公式としては非推奨ぽいので、少し動作について調査してみました。

以下、検証コードと詳細。


○結論

原則使わないのが望ましいです。書き換え忘れもありえますし、開発時のapkと公開時のapkが別であることは色々な不幸の元です。

やむを得ず使いたい際には独自staticがまだマシだと思います。

public class MyConfig {
    public static final boolean DEBUG = true;
}

○android:debuggableの動作

以下の様なアプリを作って試してみました。(SDKr18, ADT18.0.0)

package test.debuggable;
    
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.widget.TextView;
    
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        TextView helloTextView = (TextView) findViewById(R.id.hello);
        helloTextView.setText("android:debuggable=" + Boolean.toString(isDebuggable()) + "\n"
                + "BuildConfig.DEBUG=" + Boolean.toString(BuildConfig.DEBUG));
    }
    
    private boolean isDebuggable() {
        PackageManager manager = getPackageManager();
        ApplicationInfo appInfo = null;
        try {
            appInfo = manager.getApplicationInfo(getPackageName(), 0);
        } catch (NameNotFoundException e) {
            return false;
        }
        if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE)
            return true;
        return false;
    }
}

参考:Android ApiキーをRelease版とDebug版で切り替える方法(2009.03.13)
http://www.taosoftware.co.jp/blog/2009/03/android_apireleasedebug.html

・android:debuggable="true"時にはtrueになります。
・android:debuggable="false"時にはfalseになります。
・未指定時にはfalseになります。
・false時にはDebug asで起動しなくなります。(Waiting for Debuggerから帰ってこなくなります。)
・(staticと比較して)余計なコードを実行するため、遅いです。
・SDKで警告が出ます。

20120512_debuggable2.png

「Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one」
⇒デバッグモードは自動で設定されるから、ハードコーディングで記載するのは避けてください

歴史的経緯として、昔はandroid:debuggable="true"フラグをつけないとDebug実行ができませんでしたが、SDKのバージョンアップ(SDKr8, 2010.12)で自動的に付くようになったのでdebuggableフラグの指定は不要になりました。

○BuildConfig.DEBUGは使えるの?

・SDK/ADTr17でBuildConfig.DEBUGというフラグが必ず入るようになりました。
・リリースビルドでない限り必ずtrueになります。(よって、明示的な切り替えには向いてない)
・Windows環境のみ(?)falseにならない不具合があるそうです。

デバッグビルドとリリースビルドで処理を変える方法(2)
http://neta-abc.blogspot.jp/2012/05/2.html

コメントする