1. 程式人生 > >apk反編譯獲取完整原始碼 及 apk反編譯後的處理

apk反編譯獲取完整原始碼 及 apk反編譯後的處理

一、工具準備:apktool , dex2jar , jd-gui

二、使用dex2jar + jd-gui 得到apk的java原始碼
1.用解壓工具從 apk包中取出 classes.dex 檔案
用命令(dex2jar.bat classes.dex)得到一個 jar檔案
2.用jd-gui反編譯工具將得到.jar檔案反編譯成.java檔案

三、使用apktool得到apk的xml檔案
1.用命令(apktool d xxx.apk xxx_xml)反編譯xxx.apk包
2.從 xxx_xml 資料夾得到xml檔案

四、第二步 得到的程式原始碼 和 第三步 得到的xml檔案組合下,即可得到完整的apk原始碼。

五、應用: 漢化/去廣告,加 values-zh-rCN, values-zh-rTW, values-de, values-fr

1.在步驟三的資料夾xxx_xml/res/ 下, 建資料夾: values-zh-rCN,values-zh-rTW

2.1複製values\strings.xml 到   values-zh-rCN 並翻譯.

2.2 去廣告見;

3.重建APK,用命令(apktool b xxx) ,輸出到ABC/dist/out.apk

   或命令( apktool b xxx out.apk)

六、重新打包 和 簽名

======================================================

1) 漢化apk應用程式

       漢化apk就是 把 反編譯之後apk 下的res/values資料夾內string.xml檔案的內容 漢化(注意:我們的例子裡 只有一個string.xml,有時候 可能 不止 一個 *xml 檔案,那麼 我們 需要把 相應的 位置 都漢化)。

        一個apk應用在漢化後應該能在英文和中文系統下都能使用。/values目錄下的是英文語言包。為了建一箇中文語言包,與/values並行建立一個子資料夾:/values-zh-rCN(必須用這個檔名!)。這裡values-zh是中國地區語言包(包含港澳臺及內地),values-zh-rCN是中文簡體語言包(只包含內地),values-zh-rTW是中文繁體語言包(港澳臺)。
把/values資料夾裡的strings.xml等語言檔案複製進/values-zh-rCN。在我們的例子中,只有strings.xml一個檔案。
進入/values-zh-rCN,用文字編輯器開啟strings.xml,然後你就翻譯吧,把英文描述譯成相應的中文。


高階內容:以上的漢化是修改string.xml,把英文譯成相應的中文就好了,然後打包和簽名。但是,在有些apk檔案裡,所顯示的字元文字並不都在xml檔案裡。apk原作者把某些字元寫在程式碼中。反編譯後,存放在/smali資料夾裡。一層一層地找下去,最後你會看到一大堆Dalvik碼檔案,都是以.smali為副檔名。舉一個例子,用文字編輯器開啟某個.smali檔案,看到:
const-string v5, "ServiceMode"
“ServiceMode”會在apk執行時顯示為英文。因此,需要漢化。在I897 ROM裡,用工程模式特殊程式碼看到的多半屬於這一類。漢譯起來非常花時間。我們要把ServiceMode譯成“服務模式”。怎麼處理呢?你不能把const-string v5, "ServiceMode"直接改成const-string v5, "服務模式"。打包會失敗的。正確的做法是把相應的中文字元用16進位制的unicode來表示。例如:把“服務模式”用16進位制的unicode表示就是\u670d\u52a1\u6a21\u5f0f 。每一個漢字用4個字元表示,\u表示為16進位制的unicode碼。好了,正確的漢譯是:
const-string v5, "\u670d\u52a1\u6a21\u5f0f "
網上有中文字元與16進位制unicode碼的對照表或轉換工具。

2) 修改圖示標籤

每一個apk檔案都有一個“圖示標籤”。將apk程式安裝進手機後,在圖示下面顯示圖示標籤文字。這個圖示標籤的內容是可以修改的。\res\values下找到strings.xml,修改其中的一行:
<string name="app_name">圖示標籤</string>
例如:<string name="app_name">靜音啟動</string>
同理,如果是視窗小外掛,要修改widget_name。


3) 去掉apk中的廣告

有很多apk應用都帶有廣告。為了去掉程式中的廣告,要修改main.xml檔案與廣告有關的內容。在/res目錄下找到檔案main.xml。通常在/layout目錄下,有時也被放在其它目錄下。甚至,有時不存在main.xml檔案,廣告行被放在其它xml檔案內。只能細心逐個檔案進行查詢。無論哪一種情況,檢視其內容,你會看到有一項類似的命令如下。這就是廣告顯示。
<com.admob.android.ads.AdView android:id=”@id/ad” android:layout_width=”fill_parent” android:layout_height=”wrap_content” admobsdk:backgroundColor=”#ff000000″ admobsdk:textColor=”#ffffffff” admobsdk:keywords=”Android application” />
將其改為:
<com.admob.android.ads.AdView android:id=”@id/ad” android:layout_width=”0.0dip” android:layout_height=”0.0dip” admobsdk:backgroundColor=”#ff000000″ admobsdk:textColor=”#ffffffff” admobsdk:keywords=”Android application” />
可以看到,關鍵是要把fill_parent改為0.0dip,把wrap_content改為0.0dip,其它內容保持不變即可。這種改法就是不給廣告顯示空間,當然你就看不到廣告了。