Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android apk反編譯、修改源碼、重新打包全過程

android apk反編譯、修改源碼、重新打包全過程

編輯:關於Android編程


實驗環境:

windows + jdk1.6
需要的工具:
1).反編譯包apktool.jar https://code.google.com/p/android-apktool/downloads/list
2).aapt.exe apktool.bat https://code.google.com/p/android-apktool/downloads/list
3).顯示源代碼工具( java)JD-GUI http://jd.benow.ca/
4).keytool 和 jarsigner
5).將classes.dex轉成jar文件  dex2jar https://code.google.com/p/dex2jar/


一.看android的源代碼

1)將Apkd.apk 用zip解壓後,出現了一個classes.dex文件

2014/02/19 19:42 .
2014/02/19 19:42 ..
2014/02/19 15:35 1,656 AndroidManifest.xml
2014/02/19 15:35 687,024 classes.dex
2014/02/19 15:49 META-INF
2014/02/19 15:49 res
2014/02/19 15:35 2,200 resources.arsc

2)進入到dex2jar目錄中,運行情況如下:

D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d
ex"
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar
Done.
在apk所在的目錄會出現 classes_dex2jar.jar 文件。

3) 用JD-GUI對jar包進行查看,可以查看源文件



二.反編譯apk

1.在 下載 APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令.

2012/12/06 11:44 854,016 aapt.exe
2014/02/19 17:15 277,372 Apkd.apk //示例用 apk文件
2012/12/23 23:39 92 apktool.bat
2013/02/03 02:37 2,655,843 apktool.jar

2.進入到apktool.bat所在的目錄,運行:

apktool d Apkd.apk decode_dir
反編譯後,decode_dir目錄下的內容如下:
2014/02/19 17:16 716 AndroidManifest.xml
2014/02/19 17:16 237 apktool.yml
2014/02/19 17:18 build
2014/02/19 17:16 res
2014/02/19 17:16 smali
此時我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali語言寫的,可以對照java看)。


三.APKTOOL的使用

1).decode

該命令用於進行反編譯apk文件,一般用法為
apktool d
代表了要反編譯的apk文件的路徑,最好寫絕對路徑,比如C:\MusicPlayer.apk
代表了反編譯後的文件的存儲位置,比如C:\MusicPlayer
如果你給定的已經存在,那麼輸入完該命令後會提示你,並且無法執行,需要你重新修改命令加入-f指令
apktool d –f
這樣就會強行覆蓋已經存在的文件

2).build

該命令用於編譯修改好的文件,一般用法為
apktool b
這裡的就是剛才你反編譯時輸入的(如C:\MusicPlayer),輸入這行命令後,如果一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲著編譯過程中逐個編譯的文件以及最終打包的apk文件。

3).install-framework

該命令用於為APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體情況請看常見問題


四.smali與java源碼對照,並做出相應的修改


java源代碼:

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView  a = (TextView)this.findViewById(R.id.test) ;
		a.setText("raoliang");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

對應的smali源代碼:

.class public Lali/text/apkd/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"


# direct methods
.method public constructor ()V
    .locals 0

    .prologue
    .line 8
    invoke-direct {p0}, Landroid/app/Activity;->()V

    return-void
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 2
    .parameter "savedInstanceState"

    .prologue
    .line 12
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    .line 13
    const/high16 v1, 0x7f03

    invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V

    .line 14
    const/high16 v1, 0x7f08

    invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/TextView;

    .line 15
    .local v0, a:Landroid/widget/TextView;
    const-string v1, "raoliang"

    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 16
    return-void
.end method

.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
    .locals 2
    .parameter "menu"

    .prologue
    .line 21
    invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;

    move-result-object v0

    const/high16 v1, 0x7f07

    invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V

    .line 22
    const/4 v0, 0x1

    return v0
.end method

通過對比可以看到,常量是沒有必變的,可以根據的smali的語法,進行相應的修改



五.3、打包、簽名和安裝修改後的apk

修改完了,就可以打包回apk了。執行以下命令:
apktool b decode_dir
在mygame目錄下的dist在會看到打包好的apk。
當然,現在一般是無法安裝的,因為apk還沒有簽名。下面就來簽名。簽名需要keystore文件,我已經有專用的keystore了,如果還沒有,請參閱這裡進行生成。
執行以下命令為重新編譯的my_game.apk簽名:
jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
最後,在安裝到手機前,需要把手機中的已有版本先卸載,因為如果簽名不同,是不能覆蓋安裝的,會提示“應用程序未安裝”錯誤。

完整的運行情況如下:

D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
[Unknown]: rao
您的組織單位名稱是什麼?
[Unknown]: rao
您的組織名稱是什麼?
[Unknown]:
您所在的城市或區域名稱是什麼?
[Unknown]:
您所在的州或省份名稱是什麼?
[Unknown]:
該單位的兩字母國家代碼是什麼
[Unknown]:
CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎?
[否]: y


輸入的主密碼
(如果和 keystore 密碼相同,按回車):


D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
輸入密鑰庫的口令短語:
正在添加: META-INF/MANIFEST.MF
正在添加: META-INF/DEMO_KEY.SF
正在添加: META-INF/DEMO_KEY.RSA
正在簽名: res/drawable-hdpi/ic_launcher.png
正在簽名: res/drawable-mdpi/ic_launcher.png
正在簽名: res/drawable-xhdpi/ic_launcher.png
正在簽名: res/drawable-xxhdpi/ic_launcher.png
正在簽名: res/layout/activity_main.xml
正在簽名: res/menu/main.xml
正在簽名: AndroidManifest.xml
正在簽名: classes.dex
正在簽名: resources.arsc


D:\developer\tools\test_apk\new\decode\dist>
到此為止,修改後的apk可以正常的安裝了,不過,在安裝之前,必須要先卸載以前的apk,不能直接替換(因為簽名不一樣)

參考這裡 http://developer.android.com/tools/publishing/app-signing.html

六.常見的問題

參考這裡吧,貌似比較不錯


七.參考文檔

apktool反編譯詳細使用教程 http://bbs.lidroid.com/forum.php?mod=viewthread&tid=102159
APKTOOL的使用心得 http://www.cnblogs.com/CuriosityWzk/archive/2012/01/06/2315150.html
Signing Your Applications http://developer.android.com/tools/publishing/app-signing.html
Smali--Dalvik虛擬機指令語言-->【android_smali語法學習一】 http://blog.csdn.net/wdaming1986/article/details/8299996 
Android中的簽名機制 http://wenku.baidu.com/link?url=dLZZuD8yYUXHpkb97XLW9TMJWGpe05_l2TAV7Hxy_mVwHwQ4A57x-aRUYgk1bl6ybaBZwy9NhUI_96ubEg9oehTLkTfNaVlRHsTp4ZYjx-W
http://code.google.com/p/android-apktool/wiki/FrameworkFiles





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved