特定情況下,我們需要將出好的安裝包解開(kāi)替換某些資源和代碼,這種情況一般在游戲行業(yè)以及聚合SDK情況比較多鲫尊,這里不考慮分包和混淆情況。主要流程:
1.將更新的代碼轉(zhuǎn)換成smali格式沦偎;
2.使用apktool將apk反編譯疫向;
3.添加1中生成的smali竞帽、資源等;
4.使用apktool鸿捧、jarsigner屹篓、zipalign等工具和包、加密匙奴、對(duì)齊堆巧。
一、反編譯
方法1:
1.將apktool腳本和apktool.jar文件移動(dòng)到/usr/local/bin文件夾下泼菌;
2.使用命令chmod +x 分別對(duì)apktool和apktool.jar文件進(jìn)行提取權(quán)限谍肤;
cd /usr/local/bin
chmod +x apktool
chmod +x apktool.jar
3.終端輸入./apktool測(cè)試是否成功(或/usr/local/bin/apktool);
4.cd到apk所在目錄哗伯;
5.運(yùn)行apktool腳本進(jìn)行反編譯荒揣。
apktool d demo.apk -o [輸出目錄](méi)
解包之后目錄結(jié)構(gòu)如下(這里原工程未包含assets,libs):
這里源碼為.smali格式,如果需要查看源碼焊刹,需要做轉(zhuǎn)換
6.smali2dex
java -jar smali.jar -o 目標(biāo)dex文件 [smali文件夾]
7.dex2jar
d2j-dex2jar.bat classes.dex
將生成的jar包導(dǎo)入JD-GUI查看源碼
方法2:
將apk更改為zip,拷貝其classes.dex等dex到dex2jar-2.0文件夾
雙擊dex2jar-2.0文件夾下的d2j-jar2dex.bat系任,再打開(kāi)cmd,進(jìn)入當(dāng)前dex2jar-2.0目錄虐块,執(zhí)行d2j-dex2jar classes.dex,得到的是classes-dex2jar.jar包俩滥。
獲得classes-dex2jar.jar,使用GUI工具打開(kāi)jar包。
方法3:
使用dex2jar-2.0工具贺奠,將apk種的dex文件轉(zhuǎn)換成jar霜旧,使用JD_GUI工具查看源碼。
1.將dex2jar里的d2j_invoke.sh和d2j-dex2jar.sh增加可執(zhí)行權(quán)限儡率。
sudo chmod +x d2j_invoke.sh
sudo chmod +x d2j-dex2jar.sh
2.然后進(jìn)到dex2jar這個(gè)文件夾下執(zhí)行:
d2j-dex2jar.sh test.apk
得到test-dex2jar.jar文件,使用GUI工具查看源碼挂据。
二、重新打包
解包的方式有很多儿普,但如果需要更改代碼崎逃,一般解包時(shí)使用apktool將源碼轉(zhuǎn)換成smali格式。將寫(xiě)好的代碼.java文件轉(zhuǎn)換成smali格式箕肃,然后合包婚脱,如下:
第一步:javac命令編譯java文件為class文件
第二步:dx命令將class文件轉(zhuǎn)化成dex文件
第三步:使用baksmali工具將dex文件轉(zhuǎn)化成smali文件
1.終端輸入命令:
apktool b demo unsigned-demo.apk -o [輸出目錄](méi)
此時(shí)生成的是未簽名的安裝包,需要簽名后才能安裝使用勺像。
2.APK簽名
格式:jarsigner -verbose -keystore [簽名文件名稱(chēng)] -signedjar [簽名后apk名稱(chēng)] [待簽名apk名稱(chēng)] [簽名別名]障贸,如下:
jarsigner -verbose -keystore android_release.keystore -signedjar signed-demo.apk unsigned-demo.apk android.keystore
驗(yàn)證應(yīng)用是否已簽名
jarsigner -verify [待驗(yàn)證的apk]
- zipalign
zipalign 是一種歸檔對(duì)齊工具,可對(duì) Android 應(yīng)用 (APK) 文件提供重要的優(yōu)化吟宦。其目的是要確保所有未壓縮數(shù)據(jù)的開(kāi)頭均相對(duì)于文件開(kāi)頭部分執(zhí)行特定的對(duì)齊篮洁。具體來(lái)說(shuō),它會(huì)使 APK 中的所有未壓縮數(shù)據(jù)(例如圖片或原始文件)在 4 字節(jié)邊界上對(duì)齊殃姓。這樣一來(lái)袁波,即可使用 mmap() 直接訪(fǎng)問(wèn)所有部分瓦阐,即使其中包含具有對(duì)齊限制的二進(jìn)制數(shù)據(jù)也沒(méi)關(guān)系。這樣做的好處是可以減少運(yùn)行應(yīng)用時(shí)消耗的 RAM 容量篷牌。
注意:您必須在應(yīng)用構(gòu)建過(guò)程中的兩個(gè)特定時(shí)間點(diǎn)之一使用 zipalign睡蟋,具體在哪個(gè)時(shí)間點(diǎn)使用,取決于您所使用的應(yīng)用簽名工具:
- 如果您使用的是 apksigner枷颊,則只能在為 APK 文件簽名之前執(zhí)行 zipalign戳杀。如果您在使用 apksigner 為 APK 簽名之后對(duì) APK 做出了進(jìn)一步更改,簽名便會(huì)失效夭苗。
- 如果您使用的是 jarsigner信卡,則只能在為 APK 文件簽名之后執(zhí)行 zipalign。
要對(duì)齊 infile.apk 并將其保存為 outfile.apk题造,請(qǐng)運(yùn)行以下命令:
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
要確認(rèn) existing.apk 的對(duì)齊方式傍菇,請(qǐng)運(yùn)行以下命令:
zipalign -c -v <alignment> existing.apk
zipalign說(shuō)明
Copyright (C) 2009 The Android Open Source Project
Usage: zipalign [-f] [-p] [-v] [-z] <align> infile.zip outfile.zip
zipalign -c [-p] [-v] <align> infile.zip
<alignment> 是一個(gè)整數(shù),用于定義字節(jié)對(duì)齊邊界界赔。此值必須始終為 4(可提供 32 位對(duì)齊)丢习,否則實(shí)際將不會(huì)執(zhí)行任何操作
-c: check alignment only (確認(rèn)給定文件的對(duì)齊方式)
-f: overwrite existing outfile.zip (覆蓋現(xiàn)有的 outfile.zip)
-p: memory page alignment for stored shared object files(outfile.zip 應(yīng)對(duì) infile.zip 中的所有共享對(duì)象文件使用相同的頁(yè)面對(duì)齊方式)
-v: verbose output(詳細(xì)輸出)
-z: recompress using Zopfli
使用adb安裝
adb -d install -r test.apk
打開(kāi)應(yīng)用
adb shell am start com.android.test/.MainActivity