Android APK反編譯圖文教程
在學(xué)習(xí)Android開發(fā)的過程你,你往往會去借鑒別人的應(yīng)用是怎么開發(fā)的,那些漂亮的動畫和精致的布局可能會讓你愛不釋手,作為一個開發(fā)者,你可能會很想知道這些效果界面是怎么去實現(xiàn)的,這時,你便可以對改應(yīng)用的APK進行反編譯查看。下面是我參考了一些文章后簡單的教程詳解。
(注:反編譯不是讓各位開發(fā)者去對一個應(yīng)用破解搞重裝什么的,主要目的是為了促進開發(fā)者學(xué)習(xí),借鑒好的代碼,提升自我開發(fā)水平。)
測試環(huán)境:
win 7
使用工具:
腳本之家下載地址:
apktool (資源文件獲?。?nbsp; 下載
dex2jar(源碼文件獲?。?nbsp;下載
jd-gui (源碼查看) 下載
官方最新版本下載地址:
apktool(google code)
dex2jar(google code)
jd-gui(google code)最新版請見官方
工具介紹:
apktool
作用:資源文件獲取,可以提取出圖片文件和布局文件進行使用查看
dex2jar
作用:將apk反編譯成java源碼(classes.dex轉(zhuǎn)化成jar文件)
jd-gui
作用:查看APK中classes.dex轉(zhuǎn)化成出的jar文件,即源碼文件
反編譯流程:
一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件
下載上述工具中的apktool,解壓得到3個文件:aapt.exe,apktool.bat,apktool.jar ,將需要反編譯的APK文件放到該目錄下,
打開命令行界面(運行-CMD) ,定位到apktool文件夾,輸入以下命令:apktool.bat d -f test.apk test
(命令中test.apk指的是要反編譯的APK文件全名,test為反編譯后資源文件存放的目錄名稱,即為:apktool.bat d -f [apk文件 ] [輸出文件夾])
說明獲取成功,之后發(fā)現(xiàn)在文件夾下多了個test文件,點擊便可以查看該應(yīng)用的所有資源文件了。
如果你想將反編譯完的文件重新打包成apk,那你可以:輸入apktool.bat b test(你編譯出來文件夾)便可,效果如下:
之后在之前的test文件下便可以發(fā)現(xiàn)多了2個文件夾:
build
dist(里面存放著打包出來的APK文件)
二、Apk反編譯得到Java源代碼
下載上述工具中的dex2jar和jd-gui ,解壓
將要反編譯的APK后綴名改為.rar或則 .zip,并解壓,得到其中的額classes.dex文件(它就是java文件編譯再通過dx工具打包而成的),將獲取到的classes.dex放到之前解壓出來的工具dex2jar-0.0.9.15 文件夾內(nèi),
在命令行下定位到dex2jar.bat所在目錄,輸入dex2jar.bat classes.dex,效果如下:
在改目錄下會生成一個classes_dex2jar.jar的文件,然后打開工具jd-gui文件夾里的jd-gui.exe,之后用該工具打開之前生成的classes_dex2jar.jar文件,便可以看到源碼了,效果如下:
被混淆過的效果圖(類文件名稱以及里面的方法名稱都會以a,b,c....之類的樣式命名):
三、 圖形化反編譯apk(本人未使用過)
上述步驟一、二講述了命令行反編譯apk,現(xiàn)在提供一種圖形化反編譯工具:Androidfby
首先,下載上述反編譯工具包,打開Androidfby目錄,雙擊Android反編譯工具.exe,就可以瀏覽打開要反編譯的apk
通過反編譯,你可以獲知該應(yīng)用用到了什么第3方的庫文件,它的代碼是如何編寫的等等。
然而,如果該APK進行了混淆處理,那么你看到的類文件名稱以及里面的方法名稱都會以a,b,c....之類的樣式命名,所以你可以想找到你所想得知的界面代碼可能會十分費勁,找到了代碼可能看起來也會很費勁,可是一個大體的思路會獲得,有了這個思路,你就可以自己去嘗試了。
本人曾經(jīng)想寫一個類似唱吧的名人界面布局,可是當(dāng)初第一次接觸不知道如何去寫,進進行了反編譯,即使他的那個代碼是混淆過的,我也看出來他是通過LISTVIEW的TYPE設(shè)定不同的ITEM布局實現(xiàn)了??赡芎枚嘁枚际遣捎弥貙慥IEW來實現(xiàn)效果,你可以得到他的大體思路對你的開發(fā)有益無害。
還有處于一個開發(fā)者辛辛苦苦將自己的應(yīng)用開發(fā)出來被別人一反編譯便成為了他自己的東西,所以要進行混淆處理
作為Android應(yīng)用開發(fā)者,不得不面對一個尷尬的局面,就是自己辛辛苦苦開發(fā)的應(yīng)用可以被別人很輕易的就反編譯出來。
Google似乎也發(fā)現(xiàn)了這個問題,從SDK2.3開始我們可以看到在android-sdk-windows\tools\下面多了一個proguard文件夾
proguard是一個java代碼混淆的工具,通過proguard,別人即使反編譯你的apk包,也只會看到一些讓人很難看懂的代碼,從而達到保護代碼的作用。
下面具體說一說怎么樣讓SDK2.3下的proguard.cfg文件起作用,先來看看android-sdk-windows\tools\lib\proguard.cfg的內(nèi)容:
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
從腳本中可以看到,混淆中保留了繼承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本組件以及com.android.vending.licensing.ILicensingService,
并保留了所有的Native變量名及類名,所有類中部分以設(shè)定了固定參數(shù)格式的構(gòu)造函數(shù),枚舉等等。(詳細信息請參考<proguard_path>/examples中的例子及注釋。)
讓proguard.cfg起作用的做法很簡單,就是在eclipse自動生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了
完整的default.properties文件應(yīng)該如下:
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system use, # "build.properties", and override values to adapt the script to your # project structure. # Project target. target=android-9 proguard.config=proguard.cfg
大功告成,正常的編譯簽名后就可以防止代碼被反編譯了。
相關(guān)文章
Android仿微信頁面底部導(dǎo)航效果代碼實現(xiàn)
本文給大家分享一段代碼有關(guān)android仿微信頁面底部導(dǎo)航效果代碼實現(xiàn)的思路,非常不錯,感興趣的朋友一起看看吧2016-09-09Android ListView實現(xiàn)單選及多選等功能示例
這篇文章主要介紹了Android ListView實現(xiàn)單選及多選等功能的方法,結(jié)合實例形式分析了ListView單選、多選及長按多選等功能相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-08-08Android使用PowerImageView實現(xiàn)播放強大的ImageView動畫效果
今天我們就來編寫一個PowerImageView控件,讓它既能支持ImageView控件原生的所有功能,同時還可以播放GIF圖片2018-05-05簡單實用的Android studio 調(diào)試技巧
這篇文章主要介紹了簡單實用的Android studio 調(diào)試技巧的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07android使用ViewPager實現(xiàn)輪播效果
這篇文章主要為大家詳細介紹了android使用ViewPager實現(xiàn)輪播效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Android中使用RecyclerView實現(xiàn)下拉刷新和上拉加載
RecyclerView 是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好。這篇文章主要介紹了Android中使用RecyclerView實現(xiàn)下拉刷新和上拉加載的相關(guān)資料,需要的朋友可以參考下2016-03-03