app簽名,相當(dāng)于是app在Anndroid系統(tǒng)上的一個(gè)認(rèn)證救军,Android系統(tǒng)要求每一個(gè)Android應(yīng)用程序必須要經(jīng)過(guò)數(shù)字簽名才能夠安裝到系統(tǒng)中财异,也就是說(shuō)如果一個(gè)Android應(yīng)用程序沒(méi)有經(jīng)過(guò)數(shù)字簽名,是沒(méi)有辦法安裝到系統(tǒng)中的唱遭!Android通過(guò)數(shù)字簽名來(lái)標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系戳寸,不是用來(lái)決定最終用戶(hù)可以安裝哪些應(yīng)用程序。這個(gè)數(shù)字簽名由應(yīng)用程序的作者完成拷泽,并不需要權(quán)威的數(shù)字證書(shū)簽名機(jī)構(gòu)認(rèn)證疫鹊,它只是用來(lái)讓?xiě)?yīng)用程序包自我認(rèn)證的袖瞻。應(yīng)用市場(chǎng)上APP簽名不允許相同,也不會(huì)相同拆吆,但允許有相同的包名虏辫,相同簽名的APP高版本可以覆蓋低版本。
在開(kāi)發(fā)過(guò)程中锈拨,如果沒(méi)有手動(dòng)給app添加簽名砌庄,ADT會(huì)自動(dòng)的使用debug密鑰為應(yīng)用程序簽,debug密鑰是一個(gè)名為debug.keystore的文件奕枢,它的位置在:C:/${user}/.android/debug.keystore 娄昆。也就是說(shuō),如果想擁有自己的簽名缝彬,而不是讓ADT使用自動(dòng)生成的debug.keystore簽名的話(huà)萌焰,需要有一個(gè)屬于自己的密鑰文件(*.keystore)。
默認(rèn)的 debug.keystore 位置如下:
image.png
以下是在命令行下谷浅,ionic 安卓app簽名步驟
準(zhǔn)備工作
- keytool:該工具位于jdk安裝路徑的bin目錄下扒俯;
- jarsigner:該工具位于jdk安裝路徑的bin目錄下;
- zipalign:該工具位于Android-sdk-windows/tools/目錄下一疯;
keytool和jarsigner兩個(gè)工具是jdk自帶的撼玄,也就意味著生成數(shù)字證書(shū)和文件簽名不是Android的專(zhuān)利,jarsigner主要是用來(lái)給jar文件簽名的墩邀。配置了JAVA環(huán)境變量掌猛,keytool和jarsigner可以直接在命令行下使用。zipalign 可能新老版本不太相同眉睹,可以在ANDROID_HOME下全局搜索zipalign.exe文件荔茬,以下是我電腦上的文件路徑:
image.png
生成未經(jīng)簽名的apk文件
Android app 的打包分為 debug 和 release 兩種,后者是用來(lái)發(fā)布到應(yīng)用商店的版本竹海。在開(kāi)發(fā)ionix項(xiàng)目是慕蔚,使用默認(rèn)命令(ionic cordova build android)打包出來(lái)的是debug apk文件。要打包 release 版本的apk文件斋配,只需要在后面加一個(gè) --release 參數(shù)即可:
ionic cordova build android --release
執(zhí)行該命令后孔飒,會(huì)在 ionic項(xiàng)目根目錄\platforms\android\build\outputs\apk 目錄
下生成一個(gè) “android-release-unsigned.apk” 文件,這個(gè)apk文件就是 沒(méi)有使用默認(rèn)簽名的 文件许起。
簽名
使用keytool 生成數(shù)字證書(shū)
keytool -genkey -v -keystore spilledyear.keystore -alias spilledyear.keystore -keyalg RSA -validity 36500
keytool是工具名稱(chēng)
-genkey意味著執(zhí)行的是生成數(shù)字證書(shū)操作
-v表示將生成證書(shū)的詳細(xì)信息打印出來(lái)十偶,顯示在dos窗口中
-keystore spilledyear.keystore 表示生成的數(shù)字證書(shū)的文件名為“ spilledyear.keystore”(spilledyear可以取自己的名字)
-alias spilledyear.keystore 表示證書(shū)的別名為“spilledyear.keystore”,當(dāng)然可以不和上面的文件名一樣
-keyalg RSA 表示生成密鑰文件所采用的算法為RSA
-validity 36500 表示該數(shù)字證書(shū)的有效期為36500天园细,意味著36500天之后該證書(shū)將失效
在執(zhí)行上面的命令生成數(shù)字證書(shū)文件時(shí),會(huì)提示你輸入一些信息接校,包括證書(shū)的密碼猛频,如圖所示:
keystore.png
使用jarsigner為app簽名
jarsigner -verbose -keystore spilledyear.keystore -signedjar zmjj.apk android-release-unsigned.apk spilledyear.keystore
jarsigner是工具名稱(chēng)
-verbose表示將簽名過(guò)程中的詳細(xì)信息打印出來(lái)狮崩,顯示在dos窗口中
-keystore spilledyear.keystore 表示簽名所使用的數(shù)字證書(shū)所在位置,沒(méi)有寫(xiě)路徑表示在當(dāng)前目錄下
-signedjar zmjj.apk android-release-unsigned.apk 表示給android-release-unsigned.apk文件簽名鹿寻,簽名后的文件名稱(chēng)為zmjj.apk
spilledyear.keystore 表示證書(shū)的別名睦柴,對(duì)應(yīng)于生成數(shù)字證書(shū)時(shí)-alias參數(shù)后面的名稱(chēng)
運(yùn)行該命令,結(jié)果如下圖所示:
jarsigner01.png
jarsigner02.png
jarsigner03.png
使用zipalign優(yōu)化已簽名的apk
此步驟時(shí)非必需操作毡熏,但是建議這么做坦敌。
zipalign -v 4 zmjj.apk zmjj_aligned.apk
zipalign是工具名稱(chēng)
-v表示在DOS窗口打印出詳細(xì)的優(yōu)化信息
zmjj.apk zmjj_aligned.apk 表示對(duì)已簽名文件 zmjj.apk進(jìn)行優(yōu)化,優(yōu)化后的文件名為zmjj_aligned.apk
執(zhí)行以上命令痢法,結(jié)果如下圖所示:
image.png
此時(shí)在目錄下又多生成了一個(gè)文件狱窘,zmjj_aligned.apk ,也就是被壓縮優(yōu)化過(guò)的apk文件:
image.png
如果以前的程序是采用默認(rèn)簽名的方式(即debug簽名)财搁,一旦換了新的簽名蘸炸,應(yīng)用將不能覆蓋安裝,必須將原先的程序卸載掉尖奔,才能安裝上搭儒。因?yàn)槌绦蚋采w安裝主要檢查兩點(diǎn):
- 兩個(gè)程序的入口Activity是否相同。兩個(gè)程序如果包名不一樣提茁,即使其它所有代碼完全一樣淹禾,也不會(huì)被視為同一個(gè)程序的不同版本;
- 兩個(gè)程序所采用的簽名是否相同茴扁。如果兩個(gè)程序所采用的簽名不同稀拐,即使包名相同,也不會(huì)被視為同一個(gè)程序的不同版本丹弱,不能覆蓋安裝德撬。
另外,可能有人可能會(huì)認(rèn)為反正debug簽名的應(yīng)用程序也能安裝使用躲胳,那也沒(méi)有必要自己簽名了蜓洪。千萬(wàn)不要這樣想,debug簽名的應(yīng)用程序有這樣兩個(gè)限制坯苹,或者說(shuō)風(fēng)險(xiǎn):
- debug簽名的應(yīng)用程序不能在Android 應(yīng)用商店上架銷(xiāo)售隆檀,它會(huì)強(qiáng)制你使用自己的簽名。
- debug.keystore在不同的機(jī)器上所生成的可能都不一樣粹湃,就意味著如果換了機(jī)器對(duì)app打包升級(jí)恐仑,那么將會(huì)出現(xiàn)上面那種程序不能覆蓋安裝的問(wèn)題。