Android反編譯和程式碼混淆
混淆: 並不是讓程式碼無法被反編譯,而是將程式碼中的類、方法、變數等資訊進行重新命名,把它們改成一些毫無意義的名字。混淆程式碼可以在不影響程式正常執行的前提下讓破解者很頭疼,從而大大提升了程式的安全性。
混淆APK: build.gradle中minifyEnabled的值是false,這裡我們只需要把值改成true,打出來的APK包就會是混淆過的了。
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
其中minifyEnabled用於設定是否啟用混淆,proguardFiles用於選定混淆配置檔案。注意這裡是在release閉包內進行配置的,因此只有打出正式版的APK才會進行混淆,Debug版的APK是不會混淆的。
proguard-android.txt檔案:
Android SDK/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.
# Dont 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.**
-dontusemixedcaseclassnames: 表示混淆時不使用大小寫混淆類名。
-dontskipnonpubliclibraryclasses:不跳過library中的非public方法。
-verbose: 列印混淆的詳細資訊。
-dontoptimize: 不進行優化,優化可能會造成一些潛在風險,不能保證在所有版本的Dalvik上都正常執行。
-dontpreverify: 不進行預校驗。
** -keepattributes Annotation **:對註解引數進行保留。
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService:
表示不混淆上述宣告的兩個類。
表示不混淆任何包含native方法的類的類名以及native方法名
-keepclasseswithmembernames class * {
native <methods>;
}
表示不混淆任何一個View中的setXxx()和getXxx()方法,因為屬性動畫需要有相應的setter和getter的方法實現
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
表示不混淆Activity中引數是View的方法
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
表示不混淆列舉中的values()和valueOf()方法
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
表示不混淆Parcelable實現類中的CREATOR欄位
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
表示不混淆R檔案中的所有靜態欄位
-keepclassmembers class **.R$* { public static <fields>;}
proguard中一共有三組六個keep關鍵字的含義
keep 保留類和類中的成員,防止它們被混淆或移除。
keepnames 保留類和類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除。
keepclassmembers 只保留類中的成員,防止它們被混淆或移除。
keepclassmembernames 只保留類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除。
keepclasseswithmembers 保留類和類中的成員,防止它們被混淆或移除,前提是指名的類中的成員必須存在,如果不存在則還是會混淆。
keepclasseswithmembernames 保留類和類中的成員,防止它們被混淆,但當成員沒有被引用時會被移除,前提是指名的類中的成員必須存在,如果不存在則還是會混淆。
keepclasseswithmember和keep關鍵字的區別:
如果這個類沒有native的方法,那麼這個類會被混淆
-keepclasseswithmember class * {
native <methods>;
}
不管這個類有沒有native的方法,那麼這個類不會被混淆
-keep class * {
native <methods>;
}
proguard-rules.pro:
任何一個Android Studio專案在app模組目錄下都有一個proguard-rules.pro檔案,這個檔案就是用於讓我們編寫只適用於當前專案的混淆規則的
相關文章
- 程式碼混淆防止APP被反編譯指南APP編譯
- Android反編譯:反編譯工具和方法Android編譯
- Android去掉/混淆Log,反編譯都看不到Android編譯
- python程式碼混淆與編譯Python編譯
- android 反編譯Android編譯
- android 反編譯APK取原始碼。Android編譯APK原始碼
- Android開發:APK的反編譯(獲取程式碼和資原始檔)AndroidAPK編譯
- 使用Reflector和Filedisassembler逆向編譯反編譯.cs.dll檔案程式碼編譯
- Android 反編譯指南Android編譯
- Android Apk反編譯得到Java原始碼AndroidAPK編譯Java原始碼
- 程式碼混淆與反混淆學習-第二彈
- Java程式碼的編譯與反編譯那些事兒Java編譯
- Android Apk反編譯系列教程(一)如何反編譯APKAndroidAPK編譯
- Android程式碼混淆Android
- APK反編譯後程式碼分析(一)APK編譯
- Android程式碼混淆&元件化混淆方案Android元件化
- Android反編譯和微信機器人初探Android編譯機器人
- Android Apk反編譯系列教程(三)Android Studio除錯smali程式碼AndroidAPK編譯除錯
- SpringBoot程式碼混淆與反混淆加密工具詳解Spring Boot加密
- 小程式反編譯教程編譯
- c#程式反編譯C#編譯
- android 混淆規則作用,Android程式碼混淆詳解Android
- Android反編譯:smali語法Android編譯
- 如何反編譯Android 5.0 framework編譯AndroidFramework
- 關於Android APK反編譯AndroidAPK編譯
- android反編譯工具總結Android編譯
- Android 程式碼混淆規則Android
- Android Studio 程式碼混淆Android
- Android 專案程式碼混淆Android
- 反編譯獲取任何微信小程式原始碼編譯微信小程式原始碼
- Cython加密python程式碼防止反編譯加密Python編譯
- Android 配置 Ant 指令碼之程式碼混淆和優化Android指令碼優化
- android dtbo.img和dtb.img dtc反編譯Android編譯
- 如何反編譯微信小程式?編譯微信小程式
- android 防止反編譯的若干方法Android編譯
- Android 高階混淆和程式碼保護技術Android
- 簡單分析AutoIt指令碼的反編譯和程式碼格式化問題指令碼編譯
- 反編譯之JD-GUI程式碼邏輯分析編譯GUI