一、工具准備: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,其它內容保持不變即可。這種改法就是不給廣告顯示空間,當然你就看不到廣告了。