国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解Android的反編譯和代碼混淆

2019-10-22 18:22:53
字體:
來源:轉載
供稿:網友

前言

包括以下內容

  1. 要反編譯apk需要下面3個工具
  2. 反編譯資源文件
  3. 反編譯類文件
  4. 代碼混淆

要反編譯apk需要下面3個工具

1、apktool(資源文件獲取)
作用:資源文件獲取,可以提取圖片文件和布局文件進行使用查看

2、dex2jar(源文件獲取)
作用:將APK反編譯成java源碼(classes.dex轉化成jar文件)

3、jd-gui
作用:查看APK中classes.dex轉化成的jar文件,即源碼文件

下面進行反編譯資源文件和類文件:

反編譯資源文件

資源文件:包括圖片資源、布局資源、動畫、樣式等其他資源

Android反編譯,Android代碼混淆,混淆

Android反編譯,Android代碼混淆,混淆

Android反編譯,Android代碼混淆,混淆

這樣資源文件都可以看得到了。

反編譯類文件

方式一:反編譯得到Java類

1.下載并解壓dex2jar-2.0,得到dex2jar-2.0文件夾,里面包含dex2jar.bat及其文件

2.將apk文件改為xx.zip文件,并解壓得到classes.dex文件,并將其復制到dex2jar-2.0文件夾中

3

Android反編譯,Android代碼混淆,混淆

生成一個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中添加:

Android反編譯,Android代碼混淆,混淆

把下面代碼,放入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武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天长市| 什邡市| 怀远县| 米泉市| 元谋县| 德昌县| 通许县| 阜南县| 乌兰浩特市| 沙洋县| 印江| 娱乐| 抚顺县| 安仁县| 呈贡县| 彰化市| 湖州市| 荥阳市| 武穴市| 珲春市| 彭泽县| 通榆县| 延长县| 揭东县| 洛隆县| 丹巴县| 利津县| 土默特右旗| 井冈山市| 定西市| 赤壁市| 晴隆县| 乐清市| 巴青县| 彭阳县| 博客| 房山区| 雅江县| 辉南县| 高碑店市| 托里县|