記錄一下解壓一個(gè)apk宪睹,替換未加密的資源文件,然后再打包成apk蚕钦,并簽名的過(guò)程亭病。
操作環(huán)境與工具
環(huán)境:
- Windows 7 SP1
- Java SE 1.8.0_111-b14
工具:
需要準(zhǔn)備的文件:
- apktool_2.2.1.jar (上面下載完成罪帖,獲得的就是這個(gè)文件)
- app.apk (這個(gè)是一個(gè)用來(lái)測(cè)試的apk,代碼已加密邮屁,資源未加密)
- mykey.keystore (這是一個(gè)使用keytool生成的簽名文件胸蛛,可以參照博客來(lái)生成)
解壓apk
我們先創(chuàng)建一個(gè)文件夾dir,將上面需要準(zhǔn)備的文件全部放到這個(gè)文件夾dir內(nèi)樱报。然后打開(kāi)cmd窗口葬项,將使用cd命令,將當(dāng)前工作目錄切換到新目錄dir下迹蛤,方便操作民珍。
當(dāng)前目錄內(nèi)容:
apktool_2.2.1.jar
app.apk
mykey.keystore
完成上面的準(zhǔn)備工作之后。在cmd中使用如下命令:
java -jar apktool_2.2.1.jar decode app.apk
命令的參數(shù)decode表示解碼(可以用d表示)盗飒,app.apk是需要解析的apk文件嚷量。
提示:執(zhí)行jar文件,需要使用命令 java -jar [jar文件]
等待幾秒逆趣,命令執(zhí)行完成后蝶溶,會(huì)看到目錄dir下看到新增了一個(gè)文件夾app。
打開(kāi)app文件夾,可以看到目錄如下:
assets
lib
original
res
smali
unknown
AndroidManifest.xml
apktool.yml
我解壓的這個(gè)apk包抖所,資源是未加密的梨州,所以如果我想改資源,直接在res文件夾中去替換就好了田轧。
注意:apktool.yml這個(gè)文件暴匠,在使用ApkTool壓縮成apk時(shí)是需要用到的,(如果是直接把a(bǔ)pp.apk的后綴改為zip傻粘,然后用壓縮工具解壓出來(lái)的每窖,就不會(huì)有這個(gè)apktool.yml了,也不能用apktool再壓縮成apk)弦悉。
打包apk
上面進(jìn)行完需要的修改(例如替換資源窒典,修改配置數(shù)據(jù)等)之后。我們現(xiàn)在可以再使用ApkTool來(lái)打包這個(gè)app文件夾稽莉,生成新的apk崇败。
繼續(xù)在cmd中進(jìn)行操作,cmd的工作目錄仍然在我們?cè)诘谝徊叫陆ǖ膁ir中肩祥,不需要改動(dòng)。
在cmd中執(zhí)行以下命令:
java -jar apktool_2.2.1.jar build -o myapp.apk app
命令的參數(shù)build表示打包(可以用b表示)缩膝,-o 后接生成的apk名稱(路徑)混狠,最后是需要打包成apk的文件夾,也就是我們上一步解壓出來(lái)的app目錄
等待命令執(zhí)行完成疾层,目錄dir中多出來(lái)了一個(gè)myapp.apk将饺,這個(gè)就是打包生成的apk了。
現(xiàn)在這個(gè)apk文件是不能安裝的痛黎,我在小米3上測(cè)試予弧,安裝時(shí)會(huì)提示解析包錯(cuò)誤。
給apk包簽名
上一步打包出來(lái)的apk文件在真機(jī)上無(wú)法安裝湖饱,需要對(duì)apk包簽名過(guò)之后才能使用掖蛤。簽名時(shí),我們需要知簽名文件mykey.keystore的別名Alias(知道密碼是前提)井厌。
在知道密碼的前提下蚓庭,想要看到簽名文件中的內(nèi)容可以使用命令:
keytool -v -list -keystore mykey.keystore
然后輸入密碼,此時(shí)密碼是無(wú)回顯的仅仆,看不到輸入的過(guò)程器赞,輸入完回車就行。
使用簽名文件mykey.keystore對(duì)上一步生成的myapp.apk進(jìn)行簽名墓拜,可以在cmd中輸入如下命令:
jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias
命令的參數(shù)-verbose 表示簽名時(shí)輸出詳細(xì)信息,-keystore mykey.keystore指明需要使用的簽名文件港柜,-signedjar signed_myapp.apk指明生成的簽名過(guò)的apk的名稱(路徑),后面的myapp.apk表示未簽名的apk文件咳榜,末尾的myAlias表示簽名文件mykey.keystore的別名(在生成這個(gè)簽名文件的時(shí)候配置的屬性)夏醉。
等待命令執(zhí)行完成爽锥,可以看到我們的文件夾dir下新增了一個(gè)文件signed_myapp.apk,這個(gè)就是對(duì)上一步生成的myapp.apk進(jìn)行簽名之后生成的文件了授舟,這個(gè)文件可以直接在手機(jī)上安裝了(前提是app.apk可用救恨,而且在解壓過(guò)后沒(méi)有進(jìn)行一些錯(cuò)誤的修改操作)。
總結(jié)
使用到的命令:
- 解壓apk: java -jar apktool_2.2.1.jar decode app.apk
- 查看keystore: keytool -v -list -keystore mykey.keystore
- 打包apk: java -jar apktool_2.2.1.jar build -o myapp.apk app
- 簽名: jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias
其實(shí)通常下載到的apk都會(huì)進(jìn)行資源壓縮加密释树,代碼混淆加密肠槽。這里只是使用一個(gè)apk來(lái)進(jìn)行流程的測(cè)試,真正去進(jìn)行資源和代碼的反編譯奢啥、解密等要分具體情況來(lái)看秸仙。