2011-12-12 11 views
4

実行時にAndroidアプリケーションがプロダクション用に署名されているのかデバッグされているのかを判断する方法はありますか?実行時にAndroidアプリケーションがプロダクション用に署名されているのかデバッグされているのかを判断する方法はありますか?

+0

をそれはしばらくしている、と私は...それ以来育ってきました:)ここにあります完全なソリューションへのリンク:http://android-know-how-to.blogspot.co.il/2013/08/android-apk-signature-check.html#chitika_close_button – TacB0sS

答えて

5

はい、100%信頼できません。 hereと記載されているように、デフォルトの(自動生成された)証明書にはDN 'CN = Android Debug、O = Android、C = US'があります。 DNをチェックし、デフォルトと一致する場合は、おそらくデバッグ証明書です。何も人が自分のデバッグ証明書を生成したり、同じものをプロダクションやデバッグに使うことを妨げているものはありません。

PackageManagerを使用して署名証明書を取得できます。ような何か:

ADT 8以来
PackageManager pm = context.getPackageManager(); 
Signature sig = packageManager.getPackageInfo(getPackageName(), 
    PackageManager.GET_SIGNATURES).signatures[0]; 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate) cf.generateCertificate(
    new ByteArrayInputStream(sig.toByteArray())); 
String dn = cert.getIssuerDN().getName(); 
+0

情報ありがとうございます、どうすれば入手できますかランタイムでこの情報? – TacB0sS

+0

更新された回答をご覧ください。 –

+0

これは非常に参考になりますが、他の解決策はより単純に思えます。 – TacB0sS

7
private static Boolean isDebugBuild = null; 
    protected boolean isDebugBuild() { 
     if(isDebugBuild == null) { 
      PackageManager pm = getPackageManager(); 
      try { 
       PackageInfo pi = pm.getPackageInfo(getPackageName(), 0); 
       isSignedWithDebugKey = (pi.applicationInfo.flags & 
        ApplicationInfo.FLAG_DEBUGGABLE) != 0; 
      } 
      catch(NameNotFoundException nnfe) { 
       nnfe.printStackTrace(); 
       isDebugBuild = false; 
      } 
     } 

     return isDebugBuild; 
    } 

あなたが特にあなたのマニフェストに=「true」にデバッグを追加しない場合、デバッグビルドそれがtrueに設定されている、およびエクスポートします/署名構築するには、それが設定されています偽にする。

これは、(デバッグ可能な..を手動で設定しない限り)より信頼性の高い方法である可能性があります。これは、デバッグ対リリースビルドかどうかを判断するためですが、証明書がデバッグ証明書 - あなたの質問だったので、私の答えはあなたにとって重要ではないかもしれません。

+0

これは私の実装で、適切な答えが表示されるまで、マニフェストにデバッグ可能な属性を指定しないと100%保証されますか?デバッグ証明書はそれをtrueに設定しますか? – TacB0sS

+1

docs: "本当のデバッグビルドのサポートAndroid Manifestのデバッグ可能な属性の値を変更する必要はありません インクリメンタルビルドは自動的にdebuggable =" true "を挿入しますが、" signed/unsigned applicationパッケージをインストールすると、ADTはそれを挿入しません。マニフェストファイルで手動でdebuggable = "true"を設定すると、リリースビルドでは実際にデバッグビルドが作成されます。 私はmap apiキーを切り替えるのにこのテクニックを使用しました。 – FunkTheMonk

+0

パーフェクト...ありがとう。 – TacB0sS

2

をマップキーを整理するために私のためによく働いて私たちは、はるかに簡単な方法を使用します。

if (BuildConfig.DEBUG) { 
    // we're in debug mode 
} else { 
    // we're in production mode 
} 
+0

これは単純な要件のためのより簡単な解決策です...2つ以上の証明書を取得したい場合、同じアプリケーションを3つまたは4つの異なる方法で動作させたい場合はどうなりますか?はい、CIの中でマニフェストにメタデータタグを追加することができますが、次にCIが必要です。ブログの記事で提案されているソリューションは非常に便利です...私はそれを実装する際に疑念を抱いていましたが、今日ではデバッグ、ステージング、およびプロダクション環境を区別し、特定の機能をそれぞれ証明書に公開します。 – TacB0sS

+0

はい私はあなたに完全に同意しますが、時にははるかに簡単なニーズがあり、私の甘やかさはその単純なニーズを狙っています。幸運なことに、グローバル人はそれが黒人や白人ではありませんが、グローバル人はそれを望みますが、それは別の話です。 –

+1

真。この実際の理由は、以前のADTリリースでは、DEBUGフィールドが、アプリケーションがデバッグモードにあるかどうかを実際に示していないことがありました.ADTの1つのバージョンでは、それが実行されず、より安全な方法が必要でした。これがこのアイディアが生まれた経緯です。 – TacB0sS

関連する問題