一、反編譯
1.獲取工具:
既然是反編譯,肯定要用到一些相關的工具,工具可以到這里下載,里面包含三個文件夾,用於反編譯,查看反編譯之后的代碼;
其實這兩工具都是google官方出的,也可在google code上下載 dex2jar,apktool;
2-1.反編譯獲取Java源代碼:
將要反編譯的apk文件后綴改為zip並解壓,得到classes.dex,它就是java文件編譯再通過dx工具打包而成的,將classes.dex復制到apk2java目錄下的dex2jar-0.0.9.9文件夾;在命令行下進入dex2jar-0.0.9.9文件夾,輸入命令:dex2jar.bat classes.dex,會生成一個jar文件classes_dex2jar.jar,用工具包中jdgui工具即可查看代碼;
2-2.反編譯獲取程序的源代碼和圖片、XML配置、語言資源等文件:
打開apk2java文件夾,進入apktool1.4.1,里面有三個文件aapt.exe,apktool.bat,apktool.jar;
在命令行下定位到apktool1.4.1文件夾,輸入命令:apktool.bat d abc123.apk abc123;后兩個參數分別是apk所在位置,反編譯后代碼存放位置;下面是我反編譯QQ得到的AndroidManifest.xml文件的內容,輸入命令為:apktool.bat d c:\qq.apk c:\qq;
2-3.將反編譯出來的文件重新打包:同樣,在apktool1.4.1文件夾下,輸入命令:apktool.bat b c:\qq c:\\qq表示需要重新打包的文件所在的位置;
等待生成,生成的文件在qq/dist文件夾下,當然,這個程序是不能使用的,因為沒有簽名;關於簽名后面會有講述;
3.圖形化反編譯:
在工具包中,還有一個文件夾Androidfby,里面包含兩個圖形化反編譯工具,其本質上就是對dex2jar和apktool兩個工具進行了一層包裝,使之有一個圖形化的操作界面;
二、代碼混淆
前面說了反編譯,我們當然不希望我們的應用被別人反編譯,所以就得在打包的時候進行代碼混淆,這樣的包也可反編譯出代碼,但是代碼的可讀性很低,從而達到保護代碼的目的;
在我們新建的項目中,都有一個proguard-project.txt文件,默認里面是沒有任何配置的,只有一些說明性的注釋文字;我們就是能過它,來進行代碼混淆的,首先需要為該文件添加需要混淆的代碼說明;
-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 *; }
最后,在project.properties文件中,添加對proguard-project.txt文件的引用: proguard.config=proguard-project.txt
1。當程序中有使用第三方jar包時,常常需要過濾掉反射的R文件及jar包,以及防止讀取jar包是出現讀取錯誤、防止因為警告導致打包不成功等等問題;
-keep class **.R$* { *; } 過濾R文件
- 打開命令行窗口,進入jdk文件夾下面的bin目錄,輸入命令:keytool -genkey -v -keystore android.keystore -alias android.keystore -keyalg RSA -validity 20000
- 接下來會讓輸入一個keystore文件的屬性配置,輸入合法的屬性就行,最后會讓確認信息是否正確,輸入y,創建keystore完成;
- 對未簽名的程序進行簽名:jarsigner -verbose -keystore appkey.keystore -signedjar c:\test_signed.apk c:\test_unsign.apk your_alias
- 進入apk所在文件目錄:jarsigner -verbose -keystore appkey.keystore -storepass xoxopassword -signedjar test_signed.apk -digestalg SHA1 -sigalg MD5withRSA test_unsign.apk your_alias
