Android 應(yīng)用平臺加固之后操作(apk重簽名)「zipalign」「apksigner」「jarsigner」

抬頭圖片

前言

說一個(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ò)誤,如下圖所示:

對齊exists.png

終端在提醒我們怀估,文件已經(jīng)存在了狮鸭。我們輸入的這語句不支持覆蓋。查閱Android官網(wǎng) 對齊「zipalign」 的定義多搀,文章末尾找到了解決方案:

對齊-官方.png

官網(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ò)誤的地方妒貌,歡迎指出者娱!

文末圖片.png

相關(guān)借鑒資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苏揣,隨后出現(xiàn)的幾起案子黄鳍,更是在濱河造成了極大的恐慌,老刑警劉巖平匈,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件框沟,死亡現(xiàn)場離奇詭異,居然都是意外死亡增炭,警方通過查閱死者的電腦和手機(jī)忍燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隙姿,“玉大人梅垄,你說我怎么就攤上這事∈溏瑁” “怎么了队丝?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵靡馁,是天一觀的道長。 經(jīng)常有香客問我机久,道長臭墨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任膘盖,我火速辦了婚禮胧弛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侠畔。我一直安慰自己结缚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布软棺。 她就那樣靜靜地躺著红竭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪码党。 梳的紋絲不亂的頭發(fā)上德崭,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音揖盘,去河邊找鬼眉厨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兽狭,可吹牛的內(nèi)容都是我干的憾股。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箕慧,長吁一口氣:“原來是場噩夢啊……” “哼服球!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颠焦,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斩熊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后伐庭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粉渠,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年圾另,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霸株。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡集乔,死狀恐怖去件,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤尤溜,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布倔叼,位于F島的核電站,受9級特大地震影響靴跛,放射性物質(zhì)發(fā)生泄漏缀雳。R本人自食惡果不足惜渡嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一梢睛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧识椰,春花似錦绝葡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至功咒,卻和暖如春愉阎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背力奋。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工榜旦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人景殷。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓溅呢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猿挚。 傳聞我的和親對象是個(gè)殘疾皇子咐旧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容