Intro
APK (Android application package) - Wikipedia
工具 - Tools
-
ADB (Android Debug Bridge)用於調試Android設備的命令行工具,使用戶可以借ADB工具與Android設備進行通信(支援Emulator)。
-
Apktool一套可以反編譯APK的Open source工具,使用JAVA開發而成。
實作
反編譯 - Decomplie
-
確認Mobile裝置連接上電腦OS (USB debugging on),可以透過
adb devices
查詢:$ adb devices List of devices attached emulator-1234 device
-
列出並找到該裝置上所安裝的app:
$ adb shell pm list packages $ adb shell pm list packages | grep "appname" -i package:com.appname.android
對應Play Store的package name可以參考網址ID參數
https://play.google.com/store/apps/details?id=com.appname.android
-
知道app名稱後,利用
adb shell pm path
查出package路徑:$ adb shell pm path com.appname.android package:/data/app/~~ufyPM_R_wxl2R0wWj-sA5B==/com.appname.android-b6Vvzl4uVnfCEwaEypQ3-x==/base.apk
-
利用
adb pull
抓出package:$ adb pull /data/app/~~ufyPM_R_wxl2R0wWj-sA5B==/com.appname.android-b6Vvzl4uVnfCEwaEypQ3-x==/base.apk
-
取得APK後,即可透過
apktool d
來反編譯:$ apktool d base.apk
-r,--no-res
Do not decode resources.
修改 - Modification
這裡示範一個將app修改開啟Webview debug(setWebContentsDebuggingEnabled
)再重新編譯回去安裝使用的情境。
-
從apk根目錄中
AndroidManifest.xml
檔案找出android.intent.category.LAUNCHER
所在的activity
,即可從其android:name
確認launcher class位置<activity android:exported="true" android:name="com.appname.android.modules.launch.LaunchActivity" ...> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
-
編輯該launcher class的smali檔案,將啟用debug的smali code加入至
onCreate
function中,可以加在return之前const/4 v2, 0x1 invoke-static {v2}, Landroid/webkit/WebView;->setWebContentsDebuggingEnabled(Z)V
舉例(
apk\smali\com\appname\android\modules\launch\LaunchActivity.smali
):# virtual methods .method public final onCreate(Landroid/os/Bundle;)V .locals 4 .line 1 ... .line 19 const/4 v2, 0x1 invoke-static {v2}, Landroid/webkit/WebView;->setWebContentsDebuggingEnabled(Z)V return-void .line 20 .end method
編譯 - Compile
-
透過
apktool b
編譯$ apktool b base/ -o new_app.apk
--use-aapt2
parameter for invalid resource error -
透過Uber Apk Signer簽章app
$ java -jar uber-apk-signer.jar --apks new_app.apk ... VERIFY file: ./new_app-aligned-debugSigned.apk... # Multiple packages app 簽章 $ java -jar uber-apk-signer.jar --apks new_app.apk config.arm64.apk
-
透過
adb install
安裝app回裝置上$ adb install new_app-aligned-debugSigned.apk # Multiple packages app 安裝 $ adb install-multiple base.apk config.arm64.apk