デバッガが接続されているか確認したい時に。
元ネタ:
boolean isDebuggable = (0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)); if ( isDebuggable ) // ...
ただし Context.getAppliccationInfo() は API Level 4 以上。
boolean debugConn = Debug.isDebuggerConnected();
package test.android; import android.app.Activity; import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.os.Debug; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class Main extends Activity { Button btnCheckManifest; Button btnCheckConnected; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnCheckManifest = (Button) findViewById(R.id.main_btn_check_manifest); btnCheckConnected = (Button) findViewById(R.id.main_btn_check_connected); btnCheckManifest.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean isDebuggable = (0 != (Main.this.getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)); if (isDebuggable) { Toast.makeText(Main.this, "Debuggable", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(Main.this, "NOT Debuggable", Toast.LENGTH_SHORT).show(); } } }); btnCheckConnected.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean debugConn = Debug.isDebuggerConnected(); if (debugConn) { Toast.makeText(Main.this, "Debugger Conected", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(Main.this, "Debugger NOT Conected", Toast.LENGTH_SHORT).show(); } } }); } }
これらを使って「デバッガが接続されている端末上では、逆解析されたくないので実行を停止する」テクニックを使っても無意味なので注意すること。
調査不足なので詳細は書けないが、誰でも入手できるソフトウェアで逆解析は比較的容易になりつつある。
恐らく近い将来、このレベルの"AntiDebug"技術は易々と回避されるようになるだろう(或いは、既にそうなっているか)。