Android用コード取得アプリMD 5署名

2748 ワード

2016-12-23で遭遇したちょっとした問題
以前はEclipseを使用していましたが、アプリケーションMD 5の署名を取得すると、正式なkeyでもテストでもパッケージ前に直接見ることができます.その後Android Studioに変更すると、面倒になりますので、コマンドラインを使わなければなりません.このネットで探してみるとたくさんあります.しかし、覚えるのがおっくうなので、インストールした騰訊QQオープンプラットフォームでダウンロードした署名を取得するapkを選んで、いつもどこでダウンロードするか忘れて、今自分のネットディスクに置いています.apkとjar
今日ちょうどプロジェクトの中で手に入れなければならなくて、ネット上で関連するコードを探して、結局ネット上で探したのはすべてこの山で、運行した後に1山の文字列を返して、全く読めません..
    try {
        /**                      **/
        PackageInfo packageInfo = getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_SIGNATURES);
        /*******                *******/
        Signature[] signatures = packageInfo.signatures;
        StringBuilder builder = new StringBuilder();
        /*******                *******/
        for (Signature signature : signatures) {
            builder.append(signature.toCharsString());
        }
        /**************        **************/
        String signature = builder.toString();
        Log.e("      ", BuildConfig.APPLICATION_ID + "__" + signature);
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("      ", "  __" + e);
    }

仕方なく、探すのがおっくうなので、逆コンパイルして関連コードを出してみます.
try {
    PackageInfo packageInfo = getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_SIGNATURES);
    String signValidString = getSignValidString(packageInfo.signatures[0].toByteArray());
    Log.e("      ", BuildConfig.APPLICATION_ID + "__" + signValidString);
} catch (Exception e) {
    Log.e("      ", "  __" + e);
}

private String getSignValidString( byte[] paramArrayOfByte) throws NoSuchAlgorithmException {
    MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
    localMessageDigest.update(paramArrayOfByte);
    return toHexString(localMessageDigest.digest());
}
public String toHexString(byte[] paramArrayOfByte) {
    if (paramArrayOfByte == null) {
        return null;
    }
    StringBuilder localStringBuilder = new StringBuilder(2 * paramArrayOfByte.length);
    for (int i = 0; ; i++) {
        if (i >= paramArrayOfByte.length) {
            return localStringBuilder.toString();
        }
        String str = Integer.toString(0xFF & paramArrayOfByte[i], 16);
        if (str.length() == 1) {
            str = "0" + str;
        }
        localStringBuilder.append(str);
    }
}

試してみたら、正常に入手できました. .BuildConfigという類はとても使いやすいです.BuildConfig.APPLICATION_IDは、現在のアプリケーションパッケージ名を直接取得する.BuildConfig.FLAVOR現在のチャネルパッケージ名を取得する.BuildConfig.DEBUG debugパッケージかどうかを判断し、以前はパッケージ化前にbooleanを手動で変更した.四木さんが言ってくれたこの類に感謝します.