記錄一下解壓一個apk,替換未加密的資源文件,然后再打包成apk,并簽名的過程。
操作環境與工具
環境:
- Windows 7 SP1
- Java SE 1.8.0_111-b14
工具:
需要準備的文件:
- apktool_2.2.1.jar (上面下載完成,獲得的就是這個文件)
- app.apk (這個是一個用來測試的apk,代碼已加密,資源未加密)
- mykey.keystore (這是一個使用keytool生成的簽名文件,可以參照博客來生成)
解壓apk
我們先創建一個文件夾dir,將上面需要準備的文件全部放到這個文件夾dir內。然后打開cmd窗口,將使用cd命令,將當前工作目錄切換到新目錄dir下,方便操作。
當前目錄內容:
apktool_2.2.1.jar
app.apk
mykey.keystore
完成上面的準備工作之后。在cmd中使用如下命令:
java -jar apktool_2.2.1.jar decode app.apk
命令的參數decode表示解碼(可以用d表示),app.apk是需要解析的apk文件。
提示:執行jar文件,需要使用命令 java -jar [jar文件]
等待幾秒,命令執行完成后,會看到目錄dir下看到新增了一個文件夾app。
打開app文件夾,可以看到目錄如下:
assets
lib
original
res
smali
unknown
AndroidManifest.xml
apktool.yml
我解壓的這個apk包,資源是未加密的,所以如果我想改資源,直接在res文件夾中去替換就好了。
注意:apktool.yml這個文件,在使用ApkTool壓縮成apk時是需要用到的,(如果是直接把app.apk的后綴改為zip,然后用壓縮工具解壓出來的,就不會有這個apktool.yml了,也不能用apktool再壓縮成apk)。
打包apk
上面進行完需要的修改(例如替換資源,修改配置數據等)之后。我們現在可以再使用ApkTool來打包這個app文件夾,生成新的apk。
繼續在cmd中進行操作,cmd的工作目錄仍然在我們在第一步新建的dir中,不需要改動。
在cmd中執行以下命令:
java -jar apktool_2.2.1.jar build -o myapp.apk app
命令的參數build表示打包(可以用b表示),-o 后接生成的apk名稱(路徑),最后是需要打包成apk的文件夾,也就是我們上一步解壓出來的app目錄
等待命令執行完成,目錄dir中多出來了一個myapp.apk,這個就是打包生成的apk了。
現在這個apk文件是不能安裝的,我在小米3上測試,安裝時會提示解析包錯誤。
給apk包簽名
上一步打包出來的apk文件在真機上無法安裝,需要對apk包簽名過之后才能使用。簽名時,我們需要知簽名文件mykey.keystore的別名Alias(知道密碼是前提)。
在知道密碼的前提下,想要看到簽名文件中的內容可以使用命令:
keytool -v -list -keystore mykey.keystore
然后輸入密碼,此時密碼是無回顯的,看不到輸入的過程,輸入完回車就行。
使用簽名文件mykey.keystore對上一步生成的myapp.apk進行簽名,可以在cmd中輸入如下命令:
jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias
命令的參數-verbose 表示簽名時輸出詳細信息,-keystore mykey.keystore指明需要使用的簽名文件,-signedjar signed_myapp.apk指明生成的簽名過的apk的名稱(路徑),后面的myapp.apk表示未簽名的apk文件,末尾的myAlias表示簽名文件mykey.keystore的別名(在生成這個簽名文件的時候配置的屬性)。
等待命令執行完成,可以看到我們的文件夾dir下新增了一個文件signed_myapp.apk,這個就是對上一步生成的myapp.apk進行簽名之后生成的文件了,這個文件可以直接在手機上安裝了(前提是app.apk可用,而且在解壓過后沒有進行一些錯誤的修改操作)。
總結
使用到的命令:
- 解壓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
其實通常下載到的apk都會進行資源壓縮加密,代碼混淆加密。這里只是使用一個apk來進行流程的測試,真正去進行資源和代碼的反編譯、解密等要分具體情況來看。