前言
說一個(gè)恐怖的事情:現(xiàn)在的Android簽名方案已經(jīng)有v1,v2芦疏,v3冕杠,v4了,v3支持多個(gè)證書酸茴,v4為增量簽名分预。具體詳情請看 官方文檔 。我們目前還是以v1弊决,v2為主噪舀。
當(dāng)然魁淳,這是題外話飘诗,當(dāng)前這篇文章的主題是:Android 平臺加固之后的重簽名姿勢。我們在(騰訊加固/360加固/愛加密)等等平臺上面加固之后的apk,下載下來的時(shí)候界逛,都需要我們進(jìn)行重簽名的操作昆稿。而重簽名呢,又有兩種方法:
- Java:jarsigner java自帶的jar簽名息拜,也就是我們Android打包的v1簽名溉潭,簽名方案只能v1
- Android:apksigner Android特有的簽名净响,也就是打包的v2簽名,支持多種簽名方案(v1~v4)喳瓣。
本文章將介紹從各大加固平臺下載下來的apk包馋贤,進(jìn)行「對齊(zipalign)」、「重簽名(jarsigner與apksigner)」的操作詳解畏陕。
運(yùn)行環(huán)境
運(yùn)行環(huán)境 | 版本 |
---|---|
操作系統(tǒng) | macOS 13.0.1 (Ventura) |
AndroidStudio | 2021.3.1 Patch 1 (Dolphin) |
JDK | 1.8.0_322 |
Android SDK | 27.0.3 |
本文介紹的三種方法配乓,都需要配置環(huán)境變量。否則需要打開終端惠毁,定位到相對應(yīng)的位置:
-
zipalign工具位置:SDK路徑/tools/zipalign
例如:/Users/leomark/Library/Android/sdk/tools/zipalign
-
jarsigner工具位置:JDK路徑/Contents/Home/bin/jarsigner
例如:/Users/leomark/Library/Java/JavaVirtualMachines/corretto-1.8.0_322/Contents/Home/bin/jarsigner
-
apksigner工具位置:SDK路徑/build-tools/「版本號」/apksigner 「版本號需 >= ==24.0.3==」
例如:/Users/leomark/Library/Android/sdk/build-tools/27.0.3/apksigner
配置環(huán)境變量請查看之前寫的文章 Flutter 開發(fā)-安裝與環(huán)境配置-配置環(huán)境變量失效問題 在里面新增三個(gè)個(gè)環(huán)境變量(已經(jīng)新增過的可忽略犹芹,少了哪個(gè)添加哪個(gè)即可):
export PATH="「SDK路徑」/tools"
export PATH="「JDK路徑」/Contents/Home/bin"
export PATH="「SDK路徑」/build-tools/「版本號」" 「版本號需 >= 24.0.3」
例如:
export PATH="/Users/leomark/Library/Android/sdk/tools"
export PATH="/Users/leomark/Library/Java/JavaVirtualMachines/corretto-1.8.0_322/Contents/Home/bin"
export PATH="/Users/leomark/Library/Android/sdk/build-tools/27.0.3"
需要注意的是,因?yàn)椤竌pksigner」是Google在 Android 7.0 Nougat 推出的鞠绰,所以我們的版本號的選擇需要 >= 24.0.3腰埂,否則只能選擇「jarsigner」方式打v1包。
對齊(zipalign)
我們從平臺下載下來的加固apk包蜈膨,官方文檔有詳細(xì)介紹說屿笼,具體看這里 《官方文檔 - zipalign》我們只是看起來有一點(diǎn)陌生,但是這個(gè)其實(shí)就是我們項(xiàng)目在打包時(shí)候的 zipAlignEnabled true 的這個(gè)選項(xiàng)翁巍,只不過我們在加固完之后刁卜,這個(gè) 對齊「zipalign」 就被弄沒了,我們需要重新 對齊「zipalign」曙咽。項(xiàng)目app目錄下build.gradle文件:
buildTypes {
release {
minifyEnabled true//混淆
buildConfigField "boolean", "LOG_DEBUG", "false" //不顯示log
zipAlignEnabled true //Zipalign優(yōu)化
shrinkResources true // 移除無用的resource文件
signingConfig signingConfigs.release
multiDexKeepFile file ('multidex-config.txt')
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true//混淆
buildConfigField "boolean", "LOG_DEBUG", "false" //不顯示log
zipAlignEnabled true //Zipalign優(yōu)化
shrinkResources true // 移除無用的resource文件
signingConfig signingConfigs.debug
multiDexKeepFile file ('multidex-config.txt')
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
需要注意的是优炬,zipalign的使用對于jarsigner和apksigner有一個(gè)時(shí)間前后規(guī)定:
- 如果您使用的是 apksigner,則必須在為 APK 文件簽名之前使用 zipalign宾尚。如果您在使用 apksigner 為APK 簽名之后對 APK 做出了進(jìn)一步更改只锭,簽名便會失效。
- 如果您使用的是 jarsigner洒嗤,則必須在為 APK 文件簽名之后使用 zipalign箫荡。
當(dāng)配置好環(huán)境變量之后,就可以使用終端使用相對應(yīng)的對齊語句了渔隶,下面是檢查apk是否對齊的方法羔挡,打開終端輸入:
zipalign -c -v 4 apk路徑
例如:
zipalign -c -v 4 /Volumes/Data/Android_jiagu/teacher/jiagu.apk
結(jié)果如下:
接下來就是利用終端,實(shí)現(xiàn)apk對齊操作间唉,在打開的終端輸入:
zipalign -v 4 「需要對齊操作的apk地址」 「對齊之后生成的地址」
例如:
zipalign -v 4 /Volumes/Data/Android_jiagu/teacher/jiagu.apk /Volumes/Data/Android_jiagu/teacher/zipaligned.apk
結(jié)果如下:
出現(xiàn) “Verification succcessful” 為對齊成功绞灼。我們可以重復(fù)上訴檢查對齊操作看看,結(jié)果如下:
注意:這里的檢測語句末尾的apk名字得修改為 zipaligned.apk呈野,原因是我們對齊的時(shí)候低矮,生成了新的命名為 zipaligned.apk 的新文件。當(dāng)然這里的名字可以自己隨意定義被冒。
重簽名 apksigner (推薦方法)
重簽名 「apksigner」 和 「zipalign」對齊方法一樣军掂,我們需要用到的事檢查語句和生成語句轮蜕。
需要注意的是:
- 我們采用「apksigner」的方法重簽名,需要先對齊「zipalign」 apk包蝗锥。不能重簽名之后再對齊「zipalign」apk包跃洛。 雖然重簽名之后可以運(yùn)行對齊「zipalign」終端語句,但是對齊之后终议,該apk包的簽名將失效税课。
所以我們?nèi)绻捎?「apksigner」的方法進(jìn)行重簽名,必須先對齊「zipalign」apk包痊剖,再進(jìn)行重簽名操作韩玩。
下面是檢查是否簽名的終端語句,在打開的終端輸入:
apksigner verify -v 檢查的apk路徑
例如:
apksigner verify -v /Volumes/Data/Android_jiagu/teacher/zipaligned.apk
結(jié)果如下:
接下來繼續(xù)在終端輸入「apksigner」重簽名語句(當(dāng)然陆馁,也可以不執(zhí)行檢查語句找颓,對齊「zipalign」之后直接執(zhí)行重簽名語句):
apksigner sign -verbose --ks 「jks文件路徑」 --v1-signing-enabled (「true/false」v1打包開啟/關(guān)閉) --v2-signing-enabled (「true/false」v2打包開啟/關(guān)閉) -ks-key-alias (jks別名 key-alias) --ks-pass pass: (jks密碼,key store password) --key-pass pass:(key 密碼叮贩,key password) --out 「生成的apk路徑击狮,重簽名后的」 「對齊之后的apk路徑」
例如:
apksigner sign -verbose --ks /Volumes/Data/Android_jiagu/teacher/zhty.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key --ks-pass pass:123456 --key-pass pass:123456 --out /Volumes/Data/Android_jiagu/teacher/signed.apk /Volumes/Data/Android_jiagu/teacher/zipaligned.apk
終端運(yùn)行結(jié)果如下:出現(xiàn) Signed 則為重簽名成功。
我們再來檢查一下益老,終端輸入檢查語句彪蓬,結(jié)果如下:
出現(xiàn)框起來的那兩行,就說明捺萌,我們已經(jīng)重簽名「apksigner」成功了档冬,我們可以拿apk包去各大應(yīng)用市場上架操作了。
重簽名 jarsigner (v1打包)
重簽名「jarsigner」和 「adksigner」一樣桃纯,也是只需要檢查和重簽名兩個(gè)方法酷誓。
需要注意的是:
- 重簽名「jarsigner」是簽名之后才能對齊「zipalign」apk包。如果對齊「zipalign」之后再進(jìn)行重簽名「jarsigner」态坦,那么對齊「zipalign」將會失效盐数。
所以我們需要先重簽名「jarsigner」,再進(jìn)行對齊「zipalign」操作伞梯,下面我們打開終端輸入:
jarsigner -verify 「檢查的apk路徑」
例如:
jarsigner -verify /Volumes/Data/Android_jiagu/teacher/jiagu.apk
結(jié)果如下:
接下來繼續(xù)在終端輸入「jarsigner」重簽名語句(當(dāng)然玫氢,也可以不執(zhí)行檢查語句,直接執(zhí)行重簽名語句):
jarsigner -verbose -keystore 「apk簽名文件路徑」 -storepass 「簽名密碼」 -signedjar 「需要重簽名apk路徑」 「加固的apk路徑」 「簽名別名 key-alias」
例如:
jarsigner -verbose -keystore /Volumes/Data/Android_jiagu/teacher/zhty.jks -storepass 123456 -signedjar /Volumes/Data/Android_jiagu/teacher/signed.apk /Volumes/Data/Android_jiagu/teacher/jiagu.apk key
結(jié)果如下:
簽名之后我們再檢查一下:
檢查完之后谜诫,我們就可以重復(fù)上面講的對齊「zipalign」操作了漾峡,再對齊之后,我們就可以拿到對齊「zipalign」的apk包去各大應(yīng)用市場上架了猜绣。
具體使用
重簽名「jarsigner」與「apksigner」的操作順序?yàn)椋?/p>
- jarsigner: 檢查apk是否簽名 ===> 「jarsigner」重簽名 ===> 是否重簽名成功= ===> 對齊「zipalign」 ===> 檢查是否對齊
- apksigner: 檢查是否對齊 ===> 對齊「zipalign」 ===> 檢查是否對齊 ===> 檢查apk是否簽名 ===> 「apksigner」重簽名 ===> 是否重簽名成功
具體操作語句請參考前面每一個(gè)方法的詳細(xì)介紹灰殴。推薦使用 「apksigner」 進(jìn)行重簽名,直接打v1掰邢、v2 的簽名apk包牺陶。
對齊「zipalign」出現(xiàn) "Output file '......apk' exists"
當(dāng)我們多次執(zhí)行對齊語句之后,如果每一次都是用同一個(gè)名字辣之,輸入對齊語句掰伸,終端就會爆這個(gè)錯(cuò)誤,如下圖所示:
終端在提醒我們怀估,文件已經(jīng)存在了狮鸭。我們輸入的這語句不支持覆蓋。查閱Android官網(wǎng) 對齊「zipalign」 的定義多搀,文章末尾找到了解決方案:
官網(wǎng)列表可以看出歧蕉,我們在終端輸入的時(shí)候, 加一個(gè) 「 -f 」 就可以覆蓋輸出文件康铭。所以惯退,我們目前有兩種解決方案:
- 我們在每一次加固的時(shí)候,清空當(dāng)前操作文件夾的所有apk文件从藤,然后再執(zhí)行語句催跪。
- 在原來的語句基礎(chǔ)上,增加一個(gè) 「 -f 」 終端語句:
zipalign -f -v 4 「需要對齊操作的apk地址」 「對齊之后生成的地址」 例如: zipalign -f -v 4 /Volumes/Data/Android_jiagu/teacher/jiagu.apk /Volumes/Data/Android_jiagu/teacher/zipaligned.apk
總結(jié)
以上就是本文所介紹的從加固平臺下載下來之后夷野,重簽名的教程懊蒸。還是那句話,推薦使用 「apksigner」進(jìn)行重簽名悯搔,直接打v1骑丸、v2 的簽名apk包。
有不對或者錯(cuò)誤的地方妒貌,歡迎指出者娱!
相關(guān)借鑒資料: