教你5步搞定程式碼混淆
程式碼混淆是上線前必不可少的一部分操作,作為一個高逼格程式設計師,怎麼讓自己的混淆看起來更專業,更高逼格呢!簡單來說,有條理,讓人一目瞭然,當然這是給你同伴看滴,對於那些想要反編譯的朋友來說還是越難懂越好咯。不多說,看文件;
分為5部分:
=================== 定製化區域=================
1. 實體類區域
專案中的實體類,最好放在一個包下,如果沒有也沒關係,一個個新增下就可以了!比如我的實體類大多數放在entity包下面,所以就這樣寫:
-keep class com.qmovies.media.TV.entity.** { *; }
- 第三方包區域
專案中使用第三方包是很難避免的!一般所使用的第三方包官方都會有提供,如果沒有,那就Google或者百度,實在找不到,就自己寫吧:貼一下我常用的包,這些包的混淆配置在下面都有配置。
compile ‘com.google.code.gson:gson:2.8.0’
compile ‘com.android.support:appcompat-v7:25.1.1’
compile ‘com.android.support:support-v4:25.1.1’
compile ‘com.android.support:design:25.1.1’
compile ‘com.flyco.tablayout:FlycoTabLayout_Lib:2.0.0@aar’
compile ‘com.miguelcatalan:materialsearchview:1.4.0’
compile ‘com.jakewharton:butterknife:8.4.0’
compile ‘io.reactivex:rxandroid:1.1.0’
compile ‘io.reactivex:rxjava:1.1.0’
compile ‘com.artemzin.rxjava:proguard-rules:1.2.9.0’
compile ‘com.github.bumptech.glide:glide:3.7.0’
compile ‘com.trello:rxlifecycle-components:0.6.1’
compile ‘com.facebook.stetho:stetho:1.3.1’
compile ‘com.facebook.stetho:stetho-okhttp3:1.3.1’
compile ‘com.google.code.gson:gson:2.8.0’
compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta4’
compile ‘com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4’
compile ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’
compile ‘com.squareup.okhttp3:okhttp:3.2.0’
compile ‘com.squareup.okhttp3:logging-interceptor:3.2.0’
compile ‘com.android.support:cardview-v7:25.1.1’
compile ‘com.google.android.exoplayer:exoplayer:r2.2.0’
compile ‘org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2’
testCompile ‘junit:junit:4.12’
apt ‘com.jakewharton:butterknife-compiler:8.4.0’
compile ‘com.umeng.analytics:analytics:latest.integration
如果你實在沒有找到,該怎麼寫呢?
第一種:按部就班的照抄,抄格式。
第二種:我就這個包的所有檔案都不提示,不混淆了。能拿我怎樣?比如下面這個。
我的匯入包名為: compile 'com.flyco.tablayout:FlycoTabLayout_Lib:2.0.0@aar'
混淆配置可以寫成:
```
#flyco
-dontwarn com.flyco.tablayout.**
-keep class com.flyco.tablaout.**{ *;}
```
- 與js互調區域
工程中沒用到,可不寫。 - 反射相關區域
工程中沒用到,可不寫。
==================基本不用動區域================
1. 基本指令區域
2. 預設保留區
3. webView
這個區域基本通用,可以照抄。
在proguard-rules.pro中新增如下檔案:
#-------------------------------------------定製化區域----------------------------------------------
#---------------------------------1.實體類---------------------------------
-keep class com.qmovies.media.TV.entity.** { *; }
-keep class com.qmovies.media.TV.model.entity.** { *; }
-keep class com.qmovies.media.TV.model.task.TasksManagerModel { *; }
-keep class com.qmovies.media.TV.widght.banner.BannerEntity { *; }
#-------------------------------------------------------------------------
#---------------------------------2.第三方包-------------------------------
##---------------Begin: proguard configuration for Gson ----------
-keep public class com.google.gson.**
-keep public class com.google.gson.** {public private protected *;}
-keepattributes Signature
-keepattributes *Annotation*
-keep public class com.project.mocha_patient.login.SignResponseData { private *; }
##---------------End: proguard configuration for Gson ----------
#如果需要儲存內部類,需要如下宣告
-keep class com.project.mocha_patient.login.FindForgotInfoActivity$ForgetResponse {*;}
-keep class com.project.mocha_patient.account_setting.ChangePasswordActivity$ChangePasswordResponse {*;}
#Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#OkHttp
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**
#retrofit2
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
#stetho
-keep class com.facebook.stetho.** { *; }
-dontwarn org.mozilla.javascript.**
-dontwarn org.mozilla.classfile.**
-keep class org.mozilla.javascript.** { *; }
##Butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
#RxJava/RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
#友盟統計
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
#友盟推送
-dontwarn com.taobao.**
-dontwarn anet.channel.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn org.apache.thrift.**
-dontwarn com.xiaomi.**
-dontwarn com.huawei.**
-dontwarn com.ta.**
-keep class com.taobao.** {*;}
-keep class org.android.** {*;}
-keep class anet.channel.** {*;}
-keep class com.umeng.** {*;}
-keep class com.xiaomi.** {*;}
-keep class com.huawei.** {*;}
-keep class org.apache.thrift.** {*;}
-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}
#flyco
-dontwarn com.flyco.tablayout.**
-keep class com.flyco.tablaout.**{ *;}
#org.apache.http
-dontwarn org.apache.http.**
-keep class org.apache.http.**{ *;}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#---------------------------------3.與js互相呼叫的類------------------------
#-------------------------------------------------------------------------
#---------------------------------4.反射相關的類和方法-----------------------
# 下拉重新整理
-keep class in.srain.cube.** { *; }
-keep interface in.srain.cube.** { *; }
-dontwarn in.srain.cube.**
# observablescrollview:tab fragment
-keep class com.github.ksoichiro.** { *; }
-keep interface com.github.ksoichiro.** { *; }
-dontwarn com.github.ksoichiro.**
#-------------------------------------------基本不用動區域--------------------------------------------
#---------------------------------基本指令區----------------------------------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------
#---------------------------------預設保留區---------------------------------
#保護註解
-keepattributes *Annotation*
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.preference.Preference
-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 * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
#保持 native 方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#保持自定義控制元件類不被混淆
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
#保持列舉 enum 類不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#保持 Serializable 不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#不混淆資源類
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
#----------------------------------------------------------------------------
#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, jav.lang.String);
}
#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------
新增後將minifyEnabled設定為true,打包即可。
最後來一句,學習在於積累,文章認真寫好每一篇,寫著寫著就發現自己的**提高了!有什麼問題可以留言,看到及時回覆。
文章參考連結:5步教你搞定Android混淆
相關文章
- Flutter 程式碼混淆 混淆Dart程式碼FlutterDart
- 【程式碼混淆】react-native 程式碼混淆React
- js程式碼混淆JS
- Android程式碼混淆&元件化混淆方案Android元件化
- ios加固,ios程式碼混淆,ios程式碼混淆工具, iOS原始碼混淆使用說明詳解iOS原始碼
- Python程式碼混淆工具,Python原始碼保密、加密、混淆Python原始碼加密
- 程式碼混淆工具ipaguard:如何使用ipaguard保護和混淆iOS應用程式程式碼iOS
- Android 程式碼混淆規則Android
- iOS 初探程式碼混淆(OC)iOS
- Python 程式碼混淆工具概述Python
- powershell程式碼混淆繞過
- 使用proguard混淆springboot程式碼Spring Boot
- 前端程式碼安全與混淆前端
- 鴻蒙程式碼配置混淆鴻蒙
- android 混淆規則作用,Android程式碼混淆詳解Android
- SpringBoot程式碼混淆與反混淆加密工具詳解Spring Boot加密
- 程式碼混淆與反混淆學習-第二彈
- 程式碼安全之程式碼混淆及加固(Android)?Android
- Spring Boot使用Allatori程式碼混淆Spring Boot
- iOS應用加固--程式碼混淆iOS
- Python 的控制流程式碼混淆Python
- python程式碼混淆與編譯Python編譯
- 聊聊如何進行程式碼混淆行程
- 逆向破解js程式碼加密,程式碼混淆不是難事JS加密
- Python 程式碼混淆和加密技術Python加密
- .NET 程式碼混淆工具-JIEJIE.NET
- Java程式碼混淆工具入門——Allatori~Java
- 程式碼混淆的原理和方法詳解
- 教你如何搞定springboot整合kafkaSpring BootKafka
- 程式碼混淆防止APP被反編譯指南APP編譯
- JS混淆程式碼資料集構建方法JS
- Python程式碼混淆處理工具:Intensio-ObfuscatorPython
- 80行Python程式碼搞定全國區劃程式碼Python
- 【教程】深入探究 JS程式碼混淆與加密技術JS加密
- 程式碼混淆不再愁:一篇掌握核心技巧
- 動手畫混淆矩陣(Confusion Matrix)(含程式碼)矩陣
- 保護C#程式碼的藝術:深入淺出程式碼混淆技術C#
- 基於多重替換方式的iOS程式碼混淆方案iOS
- ios-class-guard - iOS程式碼混淆與加固實踐iOS