溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android怎么實現(xiàn)代碼混淆

發(fā)布時間:2021-08-26 13:18:36 來源:億速云 閱讀:195 作者:小新 欄目:移動開發(fā)

小編給大家分享一下Android怎么實現(xiàn)代碼混淆,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

什么是代碼混淆:

Android SDK 自帶了混淆工具Proguard。它位于SDK根目錄\tools\proguard下面。如果開啟了混淆,Proguard默認情況下會對所有代碼,包括第三方包都進行混淆,可是有些代碼或者第三方包是不能混淆的,這就需要我們手動編寫混淆規(guī)則來保持不能被混淆的部分。

為什么要混淆:

  • 優(yōu)化java的字節(jié)碼

  • 減小apk文件的大小,在混淆過程中會刪除未使用過的類和成員

  • 代碼安全,使類、函數(shù)、變量名隨機變成無意義的代號形如:a,b,c...之類。防止app被反編譯之后能夠很容易的看懂代碼

怎樣使用混淆

在app下面的build.gradle添加使用混淆

buildTypes {
    release {
      //開啟混淆,刪除無用代碼
      minifyEnabled true
      //開啟刪除無用資源
      shrinkResources true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
      //在debug環(huán)境下使用混淆,方便調(diào)試
      signingConfig signingConfigs.debug
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      manifestPlaceholders = [
          // UAT 測試環(huán)境
          GETUI_APP_ID  : "FZi793fjp9654LfeDPcR29",
          GETUI_APP_KEY  : "YrVmZT4KTp65hqAtZbCj79",
          GETUI_APP_SECRET: "aLf186Rb617uj7jeNnUB89"
      ]
    }
  }
}

debug環(huán)境下使用簽名文件,方便在debug環(huán)境下調(diào)試混淆后的代碼

Android怎么實現(xiàn)代碼混淆 

混淆文件 proguard-rules.pro

通用混淆配置(APP通用)

##################################通過混淆配置#################################
# 代碼混淆壓縮比,在0~7之間,默認為5,一般不做修改
-optimizationpasses 5

# 混合時不使用大小寫混合,混合后的類名為小寫
-dontusemixedcaseclassnames

# 指定不去忽略非公共庫的類
-dontskipnonpubliclibraryclasses

# 這句話能夠使我們的項目混淆后產(chǎn)生映射文件
# 包含有類名->混淆后類名的映射關(guān)系
-verbose

# 指定不去忽略非公共庫的類成員
-dontskipnonpubliclibraryclassmembers

# 不做預(yù)校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。
-dontpreverify
-dontoptimize

# 混淆時是否記錄日志
-verbose
-ignorewarnings

# 保留Annotation不混淆
-keepattributes *Annotation*

# 避免混淆泛型
-keepattributes Signature
-keepattributes Exceptions,InnerClasses

-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

# 拋出異常時保留代碼行號
-keepattributes SourceFile,LineNumberTable
-keepattributes Deprecated,Synthetic,EnclosingMethod

# 重命名拋出異常時的文件名稱
-renamesourcefileattribute SourceFile

# 指定混淆是采用的算法,后面的參數(shù)是一個過濾器
# 這個過濾器是谷歌推薦的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*

APP需要保留的公共部分(通用)

  • 四大組件以及子類;

  • 自定義Application;

  • support下面的繼承子類

  • R下面的資源

  • native方法

  • Activity中參數(shù)是view的方法

  • 枚舉

  • 自定義View

  • 序列化(Parcelable,Serializable)

  • 帶有回調(diào)函數(shù)(On* Listener,On Event)

  • WebView

#############################################
#
# Android開發(fā)中一些需要保留的公共部分
#
#############################################

# 保留我們使用的四大組件,自定義的Application等等這些類不被混淆
# 因為這些子類都有可能被外部調(diào)用
-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 * extends android.view.View
#-keep public class com.android.vending.licensing.ILicensingService

# 保留support下的所有類及其內(nèi)部類
-keep class android.support.** {*;}

# 保留繼承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**

# 保留R下面的資源
-keep class **.R$* {*;}

# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
  native <methods>;
}

# 保留在Activity中的方法參數(shù)是view的方法,
# 這樣以來我們在layout中寫的onClick就不會被影響
-keepclassmembers class * extends android.app.Activity{
  public void *(android.view.View);
}

# 保留枚舉類不被混淆
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

# 保留我們自定義控件(繼承自View)不被混淆
-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);
}

# 保留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;
  !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();
}

# 對于帶有回調(diào)函數(shù)的onXXEvent、**On*Listener的,不能被混淆
-keepclassmembers class * {
  void *(**On*Event);
  void *(**On*Listener);
}

# webView處理,項目中沒有使用到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);

保留自己的項目部分代碼不能被混淆(需要更具自己項目)

  1.  網(wǎng)絡(luò)請求(如果混淆,就會發(fā)生字段的錯亂,無法正常解析)

  2. 加密類

  3. 數(shù)據(jù)庫實體類

  4. 工具類

  5. 項目中應(yīng)用到的第三方工具類(如okhttp,eventbus,rxjava等),需要根據(jù)具體的工具介紹進行操作

  6. 保留lib和compile引用的第三方j(luò)ar包不被混淆的方法:

java -keep class 包名.** { *; } 。

如:保留引用的科大訊飛的第三方j(luò)ar包不被混淆

java -keep class com.iflytek.** { *; }

#網(wǎng)絡(luò)請求等與外界通信不能混淆
-keep class com.xxxxx.function.**.net.** { *; }
-keep class com.xxxxx.function.**.bean.** { *; }
-keep class com.xxxxx.common.net.** { *; }
-keep class com.xxxxx.common.bean.** { *; }
#加密不能混淆
-keep class com.xxxxx.crypt.** {*;}

#數(shù)據(jù)庫實體類不能混淆
-keep class com.xxxxxx.function.**.dao.** { *; }
#工具類不混淆
-keep class com.xxxxx.common.utils.** { *; }
#greenDAO 3
#-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
#public static java.lang.String TABLENAME;
#}
#-keep class **$Properties
#-dontwarn org.greenrobot.greendao.database.**
#-dontwarn rx.**
#greenDAO 3

# Fresco
#-keep class com.facebook.** {*;}
#-keep interface com.facebook.** {*;}
#-keep enum com.facebook.** {*;}

# OkHttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

#Picasso
#-dontwarn com.squareup.okhttp.**

#zxing
-dontwarn com.google.zxing.**
-keep class com.google.zxing.** { *; }

#webview
-dontwarn com.tencent.**

#eventbus不能混淆
-keepattributes *Annotation*
-keepclassmembers class ** {
  @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
  <init>(java.lang.Throwable);
}
#如果項目中倒入了de.greenrobot.even的beta1版本,需要添加此行代碼
-keepclassmembers class ** {
  public void onEvent*(**);
}

#高德
-dontwarn com.amap.api.**
-keep class com.amap.api.** {*;}

#bugout
-dontwarn com.qamaster.android.**
-dontwarn com.testin.agent.**
-keepattributes InnerClasses
-keep class com.testin.agent.** { *; }
-keepattributes SourceFile, LineNumberTable

#butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
  @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
  @butterknife.* <methods>;
}

#sharesdk
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class **.R$* {*;}
-keep class **.R{*;}
-dontwarn cn.sharesdk.**
-dontwarn **.R$*
-dontwarn com.tencent.**
-keep class com.tencent.** {*;}

# rx
-dontwarn rx.**
-keepclassmembers class rx.** { *; }
# retrolambda
-dontwarn java.lang.invoke.*

# Glide specific rules #
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

#友盟統(tǒng)計
-keep class com.umeng.message.protobuffer.* {
   public <fields>;
     public <methods>;
}
-keep class com.umeng.message.* {
   public <fields>;
     public <methods>;
}

#ormLite
-keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper
-keep public class * extends com.j256.ormlite.android.apptools.OpenHelperManager
-keepclassmembers class * {@com.j256.ormlite.field.DatabaseField *;}
-keep class com.j256.ormlite.** {*;}

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }

#zbar
-keep class net.sourceforge.zbar.**{*;}

-keep class com.nineoldandroids.** {*;}

#身份證ocr
-keep class com.yd.ocr.idcard.** { *; }
-keep class com.googlecode.** { *; }
-keep class org.opencv.** { *; }

#訊飛語音
-keep class com.iflytek.** { *; }

# FastJson 混淆代碼
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
-keepattributes Signature
-keepattributes *Annotation*

以上是“Android怎么實現(xiàn)代碼混淆”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI