我們知道,一開始最好的學習方法是模仿,尤其是模仿巨人。那說到Android開發的模仿自然就是分析並研究主流程式的布局、實現方法,進而提升自己的技術。
第一招----逆向工程
要分析“巨人”們的軟體,自然免不了逆向工程,即將APK程式轉化為我們可以看的懂得源碼。這個google官方已經幫我們做好了工具,apktool就是一款很好的逆向工具。
為:http://pan.baidu.com/s/1kTqRhaR
我們以分析為例來說明這個工具的使用:
你只需執行如下命令,即完成了反組譯碼逆向工作。完成後工具會產生weixin目錄。
apktool decode weixin.apk
在目錄裡,你就可以看到軟體的各種資源檔,包括布局檔案。有了這些資源檔,自己做出和一模一樣的介面就易如反掌了,當然程式的重點在代碼邏輯,不在介面。
itleaks@ITLeaks:/tmp$ ls weixin/AndroidManifest.xml apktool.yml assets lib res smaliitleaks@ITLeaks $ ls weixin/res/ -a. layout values-id values-th.. layout-hdpi values-in values-tranim layout-ldpi values-it values-v11color layout-mdpi values-iw values-v14drawable layout-v11 values-ja values-vidrawable-480dpi raw values-ko values-w360dpdrawable-640dpi values values-land values-w480dpdrawable-en-hdpi values-ar values-large values-w500dpdrawable-hdpi values-de values-ldpi values-w600dpdrawable-land values-en values-mdpi values-w720dpdrawable-land-hdpi values-es values-ms values-xhdpidrawable-mdpi values-fr values-pl values-xlargedrawable-xhdpi values-hdpi values-pt values-zh-rCNdrawable-zh-rCN-hdpi values-he values-ru values-zh-rTWdrawable-zh-rTW-hdpi values-hi values-sw600dp xml
上面有一個smali目錄,它就是源碼目錄,而這種源碼smali是一種中繼語言,它既不是java語言,也不是java的組合語言,而是apktool工具的可以識別的一種特殊語言。為了進一步轉化為我們看得懂得java語言,可以使用dex2jar和jd-gui這兩個工具。
jd-gui:http://pan.baidu.com/s/1i3n7rPr
dex2jar:http://pan.baidu.com/s/1B2lmY
具體命令如下:
mv weixin.apk weixin.zipunzip -o weixin.zip//解壓後就得到了classes.dex檔案dex2jarRootPath/dex2jar.sh classes.dex//然後就得到了classes_dex2jar.jar檔案jd-gui classes_dex2jar.jar
同時,使用者可以修改smali檔案,然後重新用apktool產生 apk。在使用這個命令前必須下載另外一個工具aapt,apktool會用到這個工具。
大家可以在這裡下載:http://pan.baidu.com/s/1i37kiVz
最後,打包的具體命令是:
itleaks@ITLeaks:/tmp$ apktool b Filer/ tmp.apkI: Checking whether sources has changed...I: Checking whether resources has changed...I: Building apk file...itleaks@ITLeaks:/tmp$
當然,有些程式是沒法重新打包回apk,比如,這是因為它在resources裡添加了自訂的一些變數,而這些變數在plugin檔案中定義,apktool工具自然找不到。比如下面的Widget.AppCompat.Base
itleaks@ITLeaks:/tmp$ apktool b weixin/ tmp.apkI: Checking whether sources has changed...I: Checking whether resources has changed...I: Building resources.../tmp/weixin/res/values/styles.xml:59: error: Error retrieving parent for item: No resource found that matches the given name 'Widget.AppCompat.Base'./tmp/weixin/res/values/styles.xml:275: error: Error retrieving parent for item: No resource found that matches the given name 'Widget.AppCompat.Base'./tmp/weixin/res/values/styles.xml:467: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Base'.
第二招----查看view布局
Android還提供了另外一個很強大的工具hierarchyviewer,這個工具的原理我在螢幕自由文章中有大概描述過,感興趣的可以去看看那篇文章。這個工具在android-sdk/tools裡可以找到。這個工具究竟幹什麼用的?它是用來查看程式的UI的,具體使用過程如下:
1)執行命令啟動後,軟體會列出所有正在啟動並執行程式
2)選擇你感興趣的程式,雙擊即可查看該程式的UI,該介面每個方框代表一個view,並每個方框下都顯示了該view
的id,這樣就可以根據id很好的找出該view在layoutxx.xml中對應的view.
3)然後選擇某個view,雙擊即可看到該view的UI。
4)單擊右邊的layout還可以看到具體view的layout資訊,比如高度,寬度,位置等資訊。
有了這兩個工具,大家應該就能比較方便的分析市面上任意程式的介面構成了。
附錄:
以上的apktool, aapt,大家最好將這兩個檔案拷貝到執行路徑,比如/usr/bin,這樣apktool才能在執行中找到aapt這個檔案。還有,本文中的所有工具都是linux下的,如果想在window下執行,大家可以搜尋並下載window版本。需要注意的是,hierarchyviewer工具是基於adb的,要想使用它,必須保證,adb devices能夠顯示到你要訪問的Android裝置,一般出廠裝置預設是沒法使用的,需要root。
/********************************
* 本文來自部落格 “愛踢門”
* 轉載請標明出處:http://blog.csdn.net/itleaks
******************************************/