前言
包括以下內容
要反編譯apk需要下面3個工具
	1、apktool(資源文件獲取)
	作用:資源文件獲取,可以提取圖片文件和布局文件進行使用查看
	2、dex2jar(源文件獲取)
	作用:將APK反編譯成java源碼(classes.dex轉化成jar文件)
	3、jd-gui
	作用:查看APK中classes.dex轉化成的jar文件,即源碼文件
下面進行反編譯資源文件和類文件:
反編譯資源文件
資源文件:包括圖片資源、布局資源、動畫、樣式等其他資源
	
	
	
這樣資源文件都可以看得到了。
反編譯類文件
方式一:反編譯得到Java類
1.下載并解壓dex2jar-2.0,得到dex2jar-2.0文件夾,里面包含dex2jar.bat及其文件
2.將apk文件改為xx.zip文件,并解壓得到classes.dex文件,并將其復制到dex2jar-2.0文件夾中
3
	
生成一個classes-dex2jar.jar文件,使用jd-gui.exe打開生成的classes-dex2jar.jar文件
方式二:直接使用smali2java工具
什么是smali?smali是將Android字節碼用可閱讀的字符串形式表現出來的一種語言,可以稱之為Android字節碼的反匯編語言。
代碼混淆
只能混淆java類,不能混淆資源文件。系統定義的組件不能混淆。必須是導出的apk。
如何實現代碼混淆
混淆類文件
修改module:app下的build.gradle
  buildTypes {    release {      //是否需要混淆,默認false代表不混淆,true代表混淆      minifyEnabled true      //混淆需要用到的一個工具:proguard,對應的一個文件是:proguard-android.txt(這個文件在android-sdk /tools/proguard目錄下)      //proguard是一個壓縮、優化和混淆Java字節碼文件的免費工具      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'    }在proguard-rules.pro中添加:
	
把下面代碼,放入proguard-rules.pro文末:
#指定代碼的壓縮級別-optimizationpasses 5#包明不混合大小寫-dontusemixedcaseclassnames#不去忽略非公共的庫類-dontskipnonpubliclibraryclasses#優化 不優化輸入的類文件-dontoptimize#預校驗-dontpreverify#混淆時是否記錄日志-verbose# 混淆時所采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#保護注解-keepattributes *Annotation*# 保持哪些類不被混淆-keep public class * extends android.app.Fragment-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#如果有引用v4包可以添加下面這行-keep public class * extends android.support.v4.app.Fragment#忽略警告-ignorewarning##記錄生成的日志數據,gradle build時在本項目根目錄輸出###apk 包內所有 class 的內部結構-dump class_files.txt#未混淆的類和成員-printseeds seeds.txt#列出從 apk 中刪除的代碼-printusage unused.txt#混淆前后的映射-printmapping mapping.txt########記錄生成的日志數據,gradle build時 在本項目根目錄輸出-end###########混淆保護自己項目的部分代碼以及引用的第三方jar包library########-libraryjars libs/umeng-analytics-v5.2.4.jar#三星應用市場需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar#-libraryjars libs/sdk-v1.0.0.jar#-libraryjars libs/look-v1.0.1.jar#如果不想混淆 keep 掉-keep class com.lippi.recorder.iirfilterdesigner.** {*; }#友盟-keep class com.umeng.**{*;}#項目特殊處理代碼#忽略警告-dontwarn com.lippi.recorder.utils**#保留一個完整的包-keep class com.lippi.recorder.utils.** {     *;}-keep class com.lippi.recorder.utils.AudioRecorder{*;}#如果引用了v4或者v7包-dontwarn android.support.**####混淆保護自己項目的部分代碼以及引用的第三方jar包library-end####-keep public class * extends android.view.View {     public <init>(android.content.Context);     public <init>(android.content.Context, android.util.AttributeSet);     public <init>(android.content.Context, android.util.AttributeSet, int);     public void set*(...);}#保持 native 方法不被混淆-keepclasseswithmembernames class * {     native <methods>;}#保持自定義控件類不被混淆-keepclasseswithmembers class * {     public <init>(android.content.Context, android.util.AttributeSet);}#保持自定義控件類不被混淆-keepclassmembers class * extends android.app.Activity {    public void *(android.view.View);}#保持 Parcelable 不被混淆-keep class * implements android.os.Parcelable {    public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 類也不被混淆-keepclassmembers class * implements java.io.Serializable {     static final long serialVersionUID;     private static final java.io.ObjectStreamField[] serialPersistentFields;     !static !transient <fields>;     !private <fields>;     !private <methods>;     private void writeObject(java.io.ObjectOutputStream);     private void readObject(java.io.ObjectInputStream);     java.lang.Object writeReplace();     java.lang.Object readResolve();}#保持枚舉 enum 類不被混淆 如果混淆報錯,建議直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可#-keepclassmembers enum * {# public static **[] values();# public static ** valueOf(java.lang.String);#}-keepclassmembers class * {     public void *ButtonClicked(android.view.View);}#不混淆資源類-keepclassmembers class **.R$* {     public static <fields>;}#避免混淆泛型 如果混淆報錯建議關掉#–keepattributes Signature#移除log 測試了下沒有用還是建議自己定義一個開關控制是否輸出日志#-assumenosideeffects class android.util.Log {#  public static boolean isLoggable(java.lang.String, int);#  public static int v(...);#  public static int i(...);#  public static int w(...);#  public static int d(...);#  public static int e(...);#}#如果用用到Gson解析包的,直接添加下面這幾行就能成功混淆,不然會報錯。#gson#-libraryjars libs/gson-2.2.2.jar-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.examples.android.model.** { *; }同步,然后再打包
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答