天天看點

Android Studio 預設keystore 以及自定義keystore使用

我們使用Android Studio 運作或測試我們的app  它使用一個預設的debug.keystore進行簽名。

這個預設簽名(keystore)是不需要密碼的,它的預設位置在 $HOME/.android/debug.keystore,如果不存在Android studio會自動建立它。

例如我的debug.keystore就在C:\Users\Administrator\.android\debug.keystore。再我們正式釋出項目的時候是不能使用debug.keystore的。

有時候debug模式下我們需要使用自己的keystore來進行簽名,比如在使用第三方SDK時候需要送出我們應用包名以及簽名來擷取APPKEY,那麼測試環境下我不希望每次都需要手動簽名導出APK來進行測試,這裡面我們可以使用【storeFile file】來指定我們自己的keystore AS編譯後就使用我們指定的keystore進行簽名,避免每次手動簽名打包友善我們調試。

官方位址: https://developer.android.com/studio/publish/app-signing.html

下面我們來介紹如何使用Android Studio建立一個新的keystore,并釋出我們的apk

1 建立keystore

1.1 Build --->> Generate Signed APK

Android Studio 預設keystore 以及自定義keystore使用

1.2 Create New

Android Studio 預設keystore 以及自定義keystore使用

1.3 填寫相關資訊,裡面内容什麼含義自行Google

Android Studio 預設keystore 以及自定義keystore使用

1.4 輸入密碼

Android Studio 預設keystore 以及自定義keystore使用

1.5 選擇釋出app的路徑預設即可 選擇release或者debug方式釋出

Android Studio 預設keystore 以及自定義keystore使用

OK,釋出成功,可以到檔案夾下面找到釋出的apk

2 使用自定義keystore

下面我們來配置如何在debug的時候使用我們自定義的keystore。

2.1 還是要建立一個keystore,就用上面的也可以。

2.2 在項目上右鍵 Open Module Settings.然後看圖就可以了,選擇路徑,把密碼填上,該填的都填好。

Android Studio 預設keystore 以及自定義keystore使用

2.3 分别選擇debug和release 都設定為剛才填進去的keystore。

Android Studio 預設keystore 以及自定義keystore使用

點選OK即可,然後檢視APP的配置檔案應該是這樣的。

Android Studio 預設keystore 以及自定義keystore使用
android {  
    signingConfigs {  
        android_studio_app {  
            keyAlias 'androidstudioapp'  
            keyPassword 'mypassword'  
            storeFile file('D:/Android/keystore/android_studio_app.jks')  
            storePassword 'mypassword'  
        }  
    }  
    compileSdkVersion 23  
    buildToolsVersion "23.0.1"  
    defaultConfig {  
        applicationId "com.example.administrator.myapplication"  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
    }  
    buildTypes {  
        release {  
            minifyEnabled false  
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
            signingConfig signingConfigs.android_studio_app  
        }  
        debug {  
            signingConfig signingConfigs.android_studio_app  
        }  
    }  
}  
           

3 驗證是否使用自定義keystore

下面講解如何測試apk是否使用了我們建立的keystore

3.1 keytool -list -v -keystore  xxx.keystore 

      通過工具檢視sha1的值.,例如 5C:93:68:2C:E3:2B:00:F1:D6:11:0F:46:08:93:32:1D:FD:6E:60:CC

3.2 在APP内部通過代碼的方式擷取sha1 兩者一比較即可。

//這個是擷取SHA1的方法  
public static String getCertificateSHA1Fingerprint(Context context) {  
    //擷取包管理器  
    PackageManager pm = context.getPackageManager();  
    //擷取目前要擷取SHA1值的包名,也可以用其他的包名,但需要注意,  
    //在用其他包名的前提是,此方法傳遞的參數Context應該是對應包的上下文。  
    String packageName = context.getPackageName();  
    //傳回包括在包中的簽名資訊  
    int flags = PackageManager.GET_SIGNATURES;  
    PackageInfo packageInfo = null;  
    try {  
        //獲得包的所有内容資訊類  
        packageInfo = pm.getPackageInfo(packageName, flags);  
    } catch (PackageManager.NameNotFoundException e) {  
        e.printStackTrace();  
    }  
    //簽名資訊  
    Signature[] signatures = packageInfo.signatures;  
    byte[] cert = signatures[0].toByteArray();  
    //将簽名轉換為位元組數組流  
    InputStream input = new ByteArrayInputStream(cert);  
    //證書工廠類,這個類實作了出廠合格證算法的功能  
    CertificateFactory cf = null;  
    try {  
        cf = CertificateFactory.getInstance("X509");  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    //X509證書,X.509是一種非常通用的證書格式  
    X509Certificate c = null;  
    try {  
        c = (X509Certificate) cf.generateCertificate(input);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    String hexString = null;  
    try {  
        //加密算法的類,這裡的參數可以使MD4,MD5等加密算法  
        MessageDigest md = MessageDigest.getInstance("SHA1");  
        //獲得公鑰  
        byte[] publicKey = md.digest(c.getEncoded());  
        //位元組到十六進制的格式轉換  
        hexString = byte2HexFormatted(publicKey);  
    } catch (NoSuchAlgorithmException e1) {  
        e1.printStackTrace();  
    } catch (CertificateEncodingException e) {  
        e.printStackTrace();  
    }  
    return hexString;  
}  
//這裡是将擷取到得編碼進行16進制轉換  
private static String byte2HexFormatted(byte[] arr) {  
    StringBuilder str = new StringBuilder(arr.length * 2);  
    for (int i = 0; i < arr.length; i++) {  
        String h = Integer.toHexString(arr[i]);  
        int l = h.length();  
        if (l == 1)  
            h = "0" + h;  
        if (l > 2)  
            h = h.substring(l - 2, l);  
        str.append(h.toUpperCase());  
        if (i < (arr.length - 1))  
            str.append(':');  
    }  
    return str.toString();  
}  
           

原文位址