修改既有 APK 的流程

如果從網路上抓到一個 APK, 又想要對它修改的話, 大約需要幾個步驟.

第一步是抓 APK TOOL 或是 APK Manger 回來. 雖然他們都有 Windows 版本, 但是用起來和 MS-DOS 差不多, 並沒有方便的視窗可以操作. 原本聽說 APK Manager 很厲害, 但是選單也相對較複雜, 就沒有再研究了.

APK Tool 這一系列需要抓  apktool-1.0.0.tar.bz2 和 apktool-install-windows-2.1_r01-1.zip. 解開後得到一個apktool.jar 和 apktool. 雖然網路上說 apktool.jar 要 copy 到 c:windows, 但是實際上發現它只有放在 apktool 同一個目錄才找得到 (除非那個目錄就是 c:windows).

接著使用 apktool d ThisIsYourAPK.apk ThisIsYourDirectory

就可以把 APK 的內容解到 ThisIsYourDirectory. 下面可以看到 lib, res, smali 三個基本的目錄, 以及 AndroidManifest.xml.

若是直接把 .apk 重新命名成 .zip 後解壓縮 (unzip) , 同樣也會看到 lib, res, 與 AndroidManifest.xml. 但可能會多出 METAINF  目錄, 與 resources.arsc, 與 classes.dex 兩個檔案. 其中 classes.dex 可以再依序反組譯為 class → jar → java.  對應到 apktool 生出的 smali.

上面兩種方式獲得的結果不同, 特別可以從 AndroidManifest.xml 看出來. 由於 APK 是給 DVM 看的格式, 所以這個檔案已經變得不可讀了. 當然, 它可以再用工具將它還原 Android: 反編譯 Android APK 文件. 一路用工具把 APK 裡面的各個 binary 還原回 source code 也是一個方法.

若是使用 apktool, 反組譯後得到的 source 都是可讀, 包括. 比方說想把免費軟體裡面的廣告拿掉, 畫面從直的改橫的, 可以直接到 res/layout/main.xml 裡面去撈相關的定義來修改 – 一個 APK 反編譯利器 Apktool.

此外, 若是以 apktool 反組譯, 修改完了之後, 還可以用 apktool b ThisIsAAPK.apk  打包回 APK. 最後再加個簽名, 就變成正式的 APK. 如果是用 unzip 提出來的修改的, 要再打包成 APK 似乎比較麻煩.

如果得到的是一個已經打包好的 APK, 那麼重編 Android 系統時可以將它放在 device 的某層目錄下一起編譯. 在這個 APK 同層的目錄裡, 寫一個 Android.mk – android 編譯系統 makefile (Android.mk) 寫法. 就可以把 APK 編進系統裡面了.

雖然上面的那個連結的內容很多, 但是 Android.mk 裡面只要有下面幾個基本要素就夠了. 制式定義好的部分根本不用動. 

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ThisIsYourAPK
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX :=$(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

如果像這樣寫了很多 APK, 上層目錄再加一個 Android.mk,  寫上這兩行即可.

include $(CLEAR_VARS)
include $(call all-makefiles-under, $(LOCAL_PATH))

寫完本篇之後, 忽然找到兩個厲害的網站, 順便記在這裡.

[1] [android反编译小结]apktool/ AXMLPrinter2.jar/ dex2jar.bat/ jd-gui/ Jodeclipse/ JadClipse

[2] 把玩"魔術師" — 認識、把玩 APK 檔

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>