Android程式碼混淆配置(Proguard檔案解析)
為了防止自己的APP被輕易反編譯,我們需要對APK進行混淆,或者特殊加密處理。可以用“愛加密“提供的加密服務,反編譯後只能看到幾行程式碼和.so的庫檔案。本文說說android 如何配置混淆。
關於如何反編譯android apk,見我另外一篇文章:win/mac下反編譯Android安裝包-APK檔案,http://blog.csdn.net/dzsw0117/article/details/51429683
一,何為混淆?
簡單的說,就是將原本正常的專案檔案,對其類,方法,欄位,重新命名,a,b,c,d,e,f…之類的字母,達到混淆程式碼的目的,這樣反編譯出來,結構亂糟糟的,看了也頭大。
二,官方預設的混淆配置
先看看官方的proguard-android.txt檔案,位於/tools/proguard目錄下,不知道怎麼寫,可以當成模板,複製一份出來到自己的工程,改成自己專案所需的混淆配置。內容如下:
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
以上英文好好琢磨下,這個混淆預設採取一些通用的規則,view,activity,Parcelable,註解,R檔案,列舉這類的東西都不會混淆,我們也不能混淆這些,否則release版本會報錯。
三,Android Studio開啟混淆配置
很簡單,只要設定minifyEnabled為true即可。
buildTypes {
release {
minifyEnabled true//true開啟混淆配置,false關閉
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.duqian_android_keystore
}
debug{//省略}
}
四,Android混淆的通用規則
debug除錯的apk是沒有混淆的,所以無論你怎麼反編譯,都看到的是原始碼,你要檢驗release包是否混淆。
1,系統混淆配置
-dontusemixedcaseclassnames #混淆時不使用大小寫混合類名
-dontskipnonpubliclibraryclasses #不跳過library中的非public的類
-verbose #列印混淆的詳細資訊
-dontoptimize #不進行優化,建議使用此選項,
-dontpreverify #不進行預校驗,Android不需要,可加快混淆速度。
-ignorewarnings #忽略警告
#-optimizationpasses 5 #指定程式碼的壓縮級別
2,常用的一些混淆配置
-keepattributes Signature #範型
#native方法不混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#v4包不混淆
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
#Gson混淆配置
-keep class sun.misc.Unsafe { *; }
-keep class com.idea.fifaalarmclock.entity.***
-keep class com.google.gson.** { *; }
#JavaBean
-keepclassmembers public class cn.net.duqian.bean.** {
void set*(***);
*** get*();
}
-keep class com.xx.duqian_cloud.JavaScriptInterface { *; }#webview js
#忽略 libiary 混淆
-keep class io.vov.vitamio.** { *; }
#butterknife不混淆
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
第三方框架不混淆,也要看具體情況,不是所有的lib都不能混淆。用了反射的肯定不能混淆。
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
#okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}
-keep interface okhttp3.**{*;}
#okio
-dontwarn okio.**
-keep class okio.**{*;}
-keep interface okio.**{*;}
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-dontwarn rx.**
-keep class rx.**{*;}
五,Android混淆的方法和萬用字元對照表
引用的圖片,未必準確:
六,Android混淆的總結
- Java的反射,為什麼不能混淆呢?因為程式碼混淆,類名、方法名、屬性名都改變了,而反射它還是按照原來的名字去反射,結果只射出一個程式崩潰,Crash,一臉的懵逼。
- 註解用了反射,所以不能混淆。 不混淆任何包含native方法的類的類名以及native方法名,否則找不到本地方法。
- Activity更不能混淆,因為AndroidManifest.xml檔案中是完整的名字,混淆後怎麼找?
- 自定義view也是帶了包名寫在xml佈局中,給我換成a,怎麼破? R檔案混淆了,id沒了,介面崩潰那時自然咯。
- 本文沒有指定混淆某個類中的某個方法。
- 如何反編譯apk,見我另外一篇文章:win/mac下反編譯Android安裝包-APK檔案
歡迎交流,Dusan,杜乾,291902259。
相關文章
- android 混淆檔案proguard.cfg詳解Android
- Android混淆(Proguard)詳解Android
- 使用proguard混淆springboot程式碼Spring Boot
- ProGuard程式碼混淆技術詳解
- Eclipse與Android原始碼中ProGuard工具的使用(程式碼混淆)EclipseAndroid原始碼
- Android 專案程式碼混淆Android
- Android Proguard混淆對抗之我見Android
- 轉載:混淆包含SlidingMenu、gson等Android程式碼的proguard寫法Android
- 鴻蒙程式碼配置混淆鴻蒙
- Android程式碼混淆Android
- Android程式碼混淆&元件化混淆方案Android元件化
- android混淆檔案說明Android
- Android 配置 Ant 指令碼之程式碼混淆和優化Android指令碼優化
- 增加程式碼的通用性-解析配置檔案
- android 混淆規則作用,Android程式碼混淆詳解Android
- Android 程式碼混淆規則Android
- Android Studio 程式碼混淆Android
- 原始碼解析Flask的配置檔案原始碼Flask
- [譯] 在 Android Instant App(安卓即時應用程式)中啟用 ProGuard (混淆)AndroidAPP安卓
- android下解析.plist配置檔案的xml解析器AndroidXML
- Flutter 程式碼混淆 混淆Dart程式碼FlutterDart
- 程式碼安全之程式碼混淆及加固(Android)?Android
- Android程式碼混淆的實踐Android
- vue專案配置 `webpack-obfuscator` 進行程式碼加密混淆VueWeb行程加密
- Java 混淆那些事(一):重新認識 ProGuardJava
- Java 混淆那些事(二):認識 ProGuard GUIJavaGUI
- Mendmix程式碼解析:百搭的配置檔案讀取工具ResourceUtils
- Nginx配置檔案解析Nginx
- redis配置檔案解析Redis
- 深度解析Android APP加固中的必備手段——程式碼混淆技術AndroidAPP
- Android & proguardAndroid
- 讀懂 Android 中的程式碼混淆Android
- Android反編譯和程式碼混淆Android編譯
- Android Studio實現程式碼混淆Android
- mybatis原始碼配置檔案解析之五:解析mappers標籤(解析XML對映檔案)MyBatis原始碼APPXML
- .Net Core中的配置檔案原始碼解析原始碼
- 【程式碼混淆】react-native 程式碼混淆React
- Java 混淆那些事(五):ProGuard 其他的選項Java