Confusion Android (y compris confusion des quatre composants principaux)

ps : Cet article est principalement ma propre compréhension de la confusion

Table des matières

concept:

utiliser:

Règles d'obscurcissement de base :

Règles d'obscurcissement couramment utilisées :

Règles d'obscurcissement personnalisées :

Confondre les quatre composants majeurs :

Précautions:

Adresse de démonstration :


concept:

Pour faire simple, cela rend le code source difficile à comprendre. Si vous ne souhaitez pas être décompilé une fois l'application mise en rayon et obtenir le code source directement dans le CV, il est recommandé d'y jeter un œil. , haha

  • avantage:

        Augmenter la difficulté de lire le code source uniquement décompilé

        Optimisez automatiquement le code pour réduire la taille de l'application et supprimer les classes et les membres inutilisés

        Effectuez des optimisations au niveau du bytecode pour accélérer l'exécution des applications.

Sans plus attendre, comparons les deux images :

Avant l'obscurcissement :

Après obscurcissement :

À partir de la comparaison de ces deux images, il est facile de constater que de nombreux noms de packages et noms de classes ici sont confondus, ainsi que l'optimisation du code 

utiliser:

Ajouter du code dans le projet principal Android build.gradle

android{
 buildTypes {

        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

Voilà, n'est-ce pas très simple ? 

minifyEnabled est le commutateur de confusion.
Il y aura un fichier proguard-rules.pro dans le module correspondant. Si vous devez personnaliser vous-même les règles de confusion, vous pouvez les modifier dans ce fichier.

Règles d'obscurcissement de base :

J'ai la flemme de lancer un lien :

Référence des règles d'obscurcissement

Règles d'obscurcissement couramment utilisées :

Les paresseux peuvent utiliser directement CV Dafa dans le projet

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.

# Optimizations can be turned on and off in the 'postProcessing' DSL block.
# The configuration below is applied if optimizations are enabled.
# Adding optimization introduces certain risks, since for example not all optimizations performed by
# ProGuard works on all versions of Dalvik.  The following flags turn off various optimizations
# known to have issues, but the list may not be complete or up to date. (The "arithmetic"
# optimization can be used if you are only targeting Android 2.0 or later.)  Make sure you test
# thoroughly if you go this route.
# --------------------------------------------基本指令区-------------------------------------------# 指定代码的压缩级别(在0~7之间,默认为5)
-optimizationpasses 5
# 是否使用大小写混合(windows大小写不敏感,建议加入)
-dontusemixedcaseclassnames
 # 是否混淆非公共的库的类
-dontskipnonpubliclibraryclasses
# 是否混淆非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers
# 混淆时是否做预校验(Android不需要预校验,去掉可以加快混淆速度)
# 混淆时是否记录日志(混淆后会生成映射文件)
-verbose


# 混淆时所采用的算法(谷歌推荐算法)
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable
-useuniqueclassmembernames
-allowaccessmodification
# 将文件来源重命名为“SourceFile”字符串
-renamesourcefileattribute SBFile

# 保持注解不被混淆
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation {*;}

# 保持泛型不被混淆
-keepattributes Signature
# 保持反射不被混淆
-keepattributes EnclosingMethod
# 保持异常不被混淆
-keepattributes Exceptions
# 保持内部类不被混淆
-keepattributes Exceptions,InnerClasses
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable

# --------------------------------------------默认保留区--------------------------------------------#
# 保持基本组件不被混淆
-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


# Support包规则
-dontwarn android.support.**
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**

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

# 保留自定义控件(继承自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);
}

# 保留指定格式的构造方法不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

# 保留在Activity中的方法参数是view的方法(避免布局文件里面onClick被影响)
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}

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

# 保持R(资源)下的所有类及其方法不能被混淆
-keep class **.R$* { *; }

# 保持 Parcelable 序列化的类不被混淆(注:aidl文件不能去混淆)
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

# 需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆)
-keepnames class * implements java.io.Serializable

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

# 保持 BaseAdapter 类不被混淆
-keep public class * extends android.widget.BaseAdapter { *; }

# --------------------------------------------webView区--------------------------------------------#
# WebView处理,项目中没有使用到webView忽略即可
# 保持Android与JavaScript进行交互的类不被混淆
-keep class **.AndroidJavaScript { *; }
-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.WebChromeClient {
     public void *(android.webkit.WebView,java.lang.String);
}

# 网络请求相关
-keep public class android.net.http.SslError



################retrofit###############
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

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

################gson###############
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.sunloto.shandong.bean.** { *; }


################okhttp###############
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn com.squareup.okhttp.**

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

################autolayout###############
-keep class com.zhy.autolayout.** { *; }
-keep interface com.zhy.autolayout.** { *; }

################RxJava and RxAndroid###############
-dontwarn org.mockito.**
-dontwarn org.junit.**
-dontwarn org.robolectric.**

-keep class io.reactivex.** { *; }
-keep interface io.reactivex.** { *; }

-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-dontwarn okio.**
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

-dontwarn io.reactivex.**
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}


-dontwarn java.lang.invoke.*


-keepclassmembers class io.reactivex.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}

Règles d'obscurcissement personnalisées :

Sur les deux premières images, vous pouvez voir que les noms confus sont tous a, b, c, etc., mais si vous souhaitez personnaliser de cette façon, c'est également très simple et vous devez l'ajouter aux règles de proguard. profil

#指定外部模糊字典
-obfuscationdictionary filename.txt
#指定class模糊字典
-classobfuscationdictionary filename.txt
#指定package模糊字典
-packageobfuscationdictionary filename.txt

J'ai mis le fichier filename.txt dans la démo, l'emplacement est ..app/filename.txt, copiez-le directement,

Bien entendu, si vous souhaitez contrôler vous-même le contenu de filename.txt, veuillez suivre les étapes ci-dessous :

  1. télécharger la démo
  2. Copiez le package proguardcreater dans votre propre projet, ou exécutez la méthode main dans la classe Main dans la démo (n'oubliez pas de modifier les règles vous-même) (ps : cela peut être en chinois hahaha, jouez simplement, car le journal imprimé ne peut pas transmettre le mappage regarder)
  3. Copiez le fichier généré dans votre propre projet

Le répertoire apk généré par le dictionnaire d'obscurcissement personnalisé :

 Vous pouvez voir que c'est devenu une règle définie par moi-même, le nom du package composé de 0, o, O, bien sûr le nom de la classe et la méthode sont les mêmes

Confondre les quatre composants majeurs :

Quiconque ayant un peu de connaissances doit savoir que dans des circonstances normales, il n'est pas permis de confondre les quatre composants principaux, ce qui empêcherait le programme de trouver le composant et de signaler une erreur. Cependant, l'obscurcissement des quatre composants principaux ici est obtenu par obscurcissement incrémentiel.À cette époque, j'ai trouvé un projet open source écrit par un grand gars, alors je l'ai enregistré.

Adresse GitHub : cliquez-moi GGG~~

Précautions:

Certaines classes ne peuvent être confondues et sont documentées ci-dessous :

  • Utilisez une vue personnalisée pour vous assurer qu'elle ne peut pas être confondue
  • L'énumération est utilisée pour garantir que l'énumération n'est pas confuse
  • Ne masquez pas les classes dans les bibliothèques tierces
  • Les classes qui utilisent la réflexion ne sont pas confuses
  • Des outils tels que Gson sont utilisés pour éviter la confusion entre la classe JavaBean, c'est-à-dire la classe d'entité.
  • Lorsqu'on cite une bibliothèque tierce, les règles d'obscurcissement de la bibliothèque sont généralement marquées. Il est recommandé d'ajouter les règles d'obscurcissement lors de son utilisation, afin de ne pas les retrouver à la fin
  • Les appels JS utiles à WebView doivent également garantir que les méthodes d'interface écrites ne sont pas confondues, la raison est la même que la première.
  • Les sous-classes des variables membres statiques Parcelable et Creator ne sont pas confondues, sinon Android.os.BadParcelableException sera généré
  • Les quatre composants principaux utilisés, la classe d'entité Application* personnalisée
  • Classes appelées en JNI
  • Constructeur de vue (contrôle personnalisé), android:onClick, etc. utilisé par la mise en page.

Adresse de démonstration :

Application GO ~ https://gitee.com/li-weihao1010/text-proguard


 

Je suppose que tu aimes

Origine blog.csdn.net/lwh1212/article/details/130100070
conseillé
Classement