1. ホーム
  2. android

[解決済み] APKが署名済みかデバッグビルドかを確認するには?

2022-07-15 18:10:54

質問

私の知る限り、アンドロイドのリリースビルドでは、APKに署名されています。どのようにそれを確認する コードから それとも、Eclipseに秘密の定義があるのでしょうか?

私は、Webサービスデータ(いいえ、logcatはオプションではありません)からListViewアイテムを移入するのをデバッグするためにこれが必要です。

私の考えです。

  • アプリケーションの android:debuggable というように、様々なアプリケーションで使用されていますが、なぜか信頼できそうにありません。
  • 署名済み APK のテストに同じデバイスを使用しているため、デバイス ID をハードコードするのは良いアイデアではありません。
  • コード内のどこかで手動フラグを使用する?あり得るけど、絶対変更し忘れるし、プログラマは皆怠け者だから。

どのように解決するのですか?

アプリケーションがデバッグ証明書またはリリース証明書を使用してビルドされているかどうかを確認する方法はさまざまですが、私は次の方法が最適だと思います。

Androidのドキュメントにある情報によると アプリケーションに署名する によると、デバッグキーには次のようなサブジェクト識別名が含まれています: " CN=Android Debug,O=Android,C=US "。 この情報を利用すれば、debug keyの署名をコードにハードコーディングすることなく、パッケージがdebug keyで署名されているかどうかをテストすることができます。

与えられた

import android.content.pm.Signature;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

このようにisDebuggableメソッドを実装することができます。

private static final X500Principal DEBUG_DN = new X500Principal("CN=Android Debug,O=Android,C=US");
private boolean isDebuggable(Context ctx)
{
    boolean debuggable = false;

    try
    {
        PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),PackageManager.GET_SIGNATURES);
        Signature signatures[] = pinfo.signatures;

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        for ( int i = 0; i < signatures.length;i++)
        {   
            ByteArrayInputStream stream = new ByteArrayInputStream(signatures[i].toByteArray());
            X509Certificate cert = (X509Certificate) cf.generateCertificate(stream);       
            debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN);
            if (debuggable)
                break;
        }
    }
    catch (NameNotFoundException e)
    {
        //debuggable variable will remain false
    }
    catch (CertificateException e)
    {
        //debuggable variable will remain false
    }
    return debuggable;
}