將本地的java從版本1.6 升級到 1.8 的時候,apk 簽名后安裝到手機上,出現 “Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]”,弄了半天不知道咋回事,然后把java的jdk版本切換到1.6的時候,一切又正常了,因此懷疑對apk的簽名,會跟jdk的版本不同而有所不同。網上搜了一下,果然如此,而且在android的開發者社區已經有了相關說明。
注:文章參考了 android 開發者社區的簽名指引說明文章,但由於在國內 android 開發者社區已經無法正常訪問,因此在這里做下記錄。
地址:http://developer.android.com/tools/publishing/app-signing.html#considerations
在開發 android 應用程序的時候,到最后程序都需要進行簽名后才可以發布,目前針對 android 應用開發的 ide 一般都會自帶了簽名的功能,例如 android studio、eclipse、intellij idea。如果您喜歡使用 ide 自帶的功能簽名,您就不需要再繼續往下看了。以下主要是進行 android apk 手動簽名的教程,雖然本人並不是很喜歡這種方式,但是公司的兩位前輩都比較傾向於使用 bash 腳本,像這種打版本的事情就一般都是走腳本,一句命令,版本打好,發布關機走人。因此以下所用到的命令都是在 cygwin 的環境下執行的,因此前面帶有 $ 這個符號。 【ps :我不喜歡主要是不大懂 linux 的語法,哎,要記得東西太多了。】
到目前為止,網上關於 android apk 簽名的教程一般都停留在 java 1.6 版本或者之前,然而 java 現在已經更新到了 1.8 了,java 1.7 版本我並沒有安裝,就直接從 java 1.6 升級為 java 1.8 了,java 1.6 與 java 1.8 之間生成密鑰和簽名的命令格式有點不一樣,1.6 版本的不在這文章的介紹范圍內,網上一搜,基本全都是。
1. 生成密鑰 (ps:“密鑰” 和 “秘鑰” 有什么區別?)
輸入命令:$ keytool -genkeypair -v -keystore test.keystore -alias test -keyalg RSA -validity 20000
參數說明:
1. genkeypari:生成密鑰對。
2. keystore:密鑰庫名稱,如上所示"test.keystore"。
3. alias:密鑰的別名,在簽名的時候需要用到。
4. keyalg:密鑰算法名稱。
5. validity:有效天數。
運行效果圖:
2. 驗證您所生成的密鑰文件。
輸入命令:$ keytool -list -v -keystore test.keystore
運行效果圖:
3. 執行簽名,由於我在寫文章的時候沒有現成的 apk,因此只在這里添加執行的命令。
輸入命令:$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore test.keystore xxx.apk test
參數說明:
1. 在jdk 1.8 的環境下,sigalg 和 digestalg 這兩個參數必須帶上,否則簽名出來的 apk 包是無法安裝的。
2. -keystore:后面是您所生成的密鑰文件。
3. xxx.apk 是你要簽名的 apk。
4. test 是密鑰文件的別名。