【Android 基礎】多渠道打包小結之應用的打包簽名

學習android也有一段時間了,現在趁着假期總結下一些重要的知識點。

應用的打包簽名

打包:打包就是根據簽名和其他標識生成安裝包。
簽名:
1.在android應用文件(apk)中保存的一個特別字符串
2.用來標識不同的應用開發者:開發者A,開發者B
3.一個應用開發者開發的多款應用使用同一個簽名

就好比是一個人寫文章,簽名就相當於作者的署名。
如果兩個應用都是一個開發者開發的,那麼簽名就是一樣的。
這個開發者,可以是個人,也可以是公司、團體。

爲什麼要簽名:

原因1:
最簡單直接的回答: 系統要求的。
Android系統要求每一個Android應用程序必須要經過數字簽名才能夠安裝到系統中,也就是說如果一個Android應用程序沒有經過數字簽名,是沒有辦法安裝到系統中的!
原因2:
不同程序員開發的應用包名可能會相同, 導致一個應用覆蓋掉另一個應用。
如果只有包名的概念,那麼如果B應用與已經安裝的A應用包名一樣,那就實現覆蓋。不合理!
而事實上是裝不上B的,它會提示,存在包名一致,但是簽名不一樣的。這就不會覆蓋。

如何爲apk簽名:

用來聲明簽名的文件:

1 默認的debug.keystore:

debug簽名的應用程序不能在Android Market上架銷售,它會強制你使用自己的簽名。
不同電腦使用此文件生成的簽名不一樣。那就意味着如果你換了機器進行apk版本升級,那麼將會出現上面那種程序不能覆蓋安裝的問題。

2使用eclipse生成的xx.keystore
3使用AS生產的xx.jks

打包自己簽名的APK(使用AS):

如果沒有key store文件,那就創建一個
這裏寫圖片描述
這裏寫圖片描述

這裏指定一個文件名。注意:在as中,簽名文件keystore類型的文件變爲jks格式的文件。輸入的是該keystore的文件名
這裏寫圖片描述

這裏寫圖片描述
上面的密碼是用來訪問最上面的path路徑文件的密碼。而最上面的文件用來生成一個簽名字符串。
下面Alias是一個別名。接下來的密碼:是用來生成一個簽名的時候,還需要的一個密碼。與上面的密碼可以不一致。
再下面的25,指的是有效期。google應用市場規定應用的有效期不低於25年。還可以改爲100年。也就是說100年以後,我們的xxx.jks簽名文件就失效了。
指明生成的apk的位置,Build Type:release:發佈版 debug:測試版。
這裏寫圖片描述
點擊finish,稍等一會
默認在As工程中bin下生成的apk文件也有簽名。只是用到了debug_keystore(測試)的模式。而我們想發佈到應用市場的話,那就需要我們自己提供一個簽名,不能用默認的。

在代碼中獲得應用的簽名

public void getSingInfo() {
    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(
                "cn.xxx.test", PackageManager.GET_SIGNATURES);
        Signature[] signs = packageInfo.signatures;
        Signature sign = signs[0];
        parseSignature(sign.toByteArray());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void parseSignature(byte[] signature) {
    try {
        CertificateFactory certFactory = CertificateFactory
                .getInstance("X.509");
        X509Certificate cert = (X509Certificate) certFactory
                .generateCertificate(new ByteArrayInputStream(signature));
        String pubKey = cert.getPublicKey().toString();
        String signNumber = cert.getSerialNumber().toString();
        Log.e("TAG", "pubKey:" + pubKey);
        Log.e("TAG", "signNumber:" + signNumber);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意事項:

千萬不要把xxx.keystore/xxx.jks文件弄丟了,弄丟了換籤名文件的話,用戶安裝時必須先卸載才能成功安裝,應用市場上的排行就會從0開始了。

萬一丟了只能重新簽名了:

案例:
公司程序員A寫的應用,然後走了。後來來了一個程序員B把應用更新以後,又重新打包發佈,使用的簽名不一致。那完了。
導致出現更新不了應用的情況。必須把應用卸載了才能重新裝。那想象一下,如果一個20萬用戶的應用,在更新時,發現安裝不了。那可能隨後就卸載了。或者就不更新了。
另外還影響的是:應用市場有下載量排名,如果重新簽名,那就得重頭來算。

一些小問題:

現象:
錯誤在Android導出APK包時出現,編譯調試時卻不出現。
錯誤信息:
Error:(16) Error: “baidutieba_client_inavailable” is not translated in “en” (English) [MissingTranslation]
Error:(63) Error: “baidutieba” is not translated in “en” (English) [MissingTranslation]
Error:(67) Error: “share_to_baidutieba” is not translated in “en” (English) [MissingTranslation]
錯誤截圖:
這裏寫圖片描述

解決辦法:
在報錯的文件裏面的resources 標籤內增加兩個屬性即可:

<?xml version="1.0" encoding="utf-8" ?>  
<resources xmlns:tools="http://schemas.android.com/tools"  
  tools:ignore="MissingTranslation">  
</resources> 
發佈了89 篇原創文章 · 獲贊 37 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章