Android 代码混淆

Android 代码混淆Android代码混淆简介在我们日常开发中,对已经开发完成的源代码,需做一些代码混淆工作,以对代码起到一种保护和降低安装包体积的作用。开启混淆在app的build.gradle文件中如下代码:android{……buildTypes{release{//开启代码混淆minifyEnabledtrue//开启资源混淆,移除未使用的资源shri

大家好,又见面了,我是你们的朋友全栈君。

Android 代码混淆

简介
在我们日常开发中,对已经开发完成的源代码,需做一些代码混淆工作,以对代码起到一种保护和降低安装包体积的作用。

开启混淆
在app的build.gradle文件中如下代码:

android {
    ......
    buildTypes {
        release {
            //开启代码混淆
            minifyEnabled true
            //开启资源混淆,移除未使用的资源
            shrinkResources true
            //proguard-android-optimize.txt:SDK提供的默认混淆文件
            //proguard-rules.pro:自定义混淆文件
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

配置混淆文件
在app的proguard-rules.pro文件中编写混淆代码即可
在这里插入图片描述
在这里插入图片描述

混淆语法

命令 作用
-keep 防止类和成员被移除或者被重命名
-keepnames 防止类和成员被重命名
-keepclassmembers 防止成员被移除或者被重命名
-keepclassmembersname 防止成员被重命名
-keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名
-keepclasseswithmembernames 防止拥有该成员的类和成员被重命名
类通配符 * 匹配任意长度字符,但不含包名分隔符(.)
类通配符 ** 匹配任意长度字符,并且包含包名分隔符(.)
类extends 即可以指定类的基类
类implements 匹配实现了某接口的类
类$ 内部类
成员(方法)通配符 * 匹配任意长度字符,但不含包名分隔符(.)
成员(方法)通配符 ** 匹配任意长度字符,并且包含包名分隔符(.)
成员(方法)通配符 *** 匹配任意参数类型
成员(方法)通配符 … 匹配任意长度的任意类型参数
成员(方法)通配符 <> 匹配方法名,eg.

常用基本混淆

#############################################
#
# 基本指令区域(没什么别的需求不需要动)
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5

# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames

# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses

# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose

# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers

# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify

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

# 避免混淆泛型
-keepattributes Signature

# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable

# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*


#############################################
#
# Android开发中一些需要保留的公共部分(没什么别的需求不需要动)
#
#############################################

# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-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.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下的所有类及其内部类
-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中的方法参数是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();
}

# 对于带有回调函数的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);
}

#-----------处理实体类---------------
# 在开发的时候我们可以将所有的实体类放在一个包内,这样我们写一次混淆就行了。
-keep class com.zzs.wanandroidmvvm.model.bean.** { *; }

常见第三方混淆

ButterKnife

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

EventBus

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

OkHttp3

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

Retrofit

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

RxJava RxAndroid

# 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;
}

Glide

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

Gson

# Gson
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.** { <fields>; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

GreenDao

# GreenDao
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
    public static java.lang.String TABLENAME;
}
-keep class **$Properties { *; }

不混淆第三方库(包括jar、aar、依赖)

-keep class 第三方库包名.** { *;}
如:
-keep class com.baidu.map.** { *;}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139079.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql workbench如何导入数据库_sql数据库脚本导入

    mysql workbench如何导入数据库_sql数据库脚本导入首先,打开MySQLworkbench,先新建数据库(我们会把.sql文件导入之这个数据库),新建数据库过程如下:先点击1处,新建数据库,给数据库起个名字,点击appy,就创建成功了。之后点击2处,就可以看到现有的数据库了。这里圈出来的是我新建的数据库,双击选中这个数据库(双击选中很重要,因为选中之后才能将.sql文件导入这个数据库中)。然后点击左上方的第二个图标(图中圈出来的那…

  • magento soap api

    magento soap apiSOAP:simpleobjectaccessprotocol;WSDL:webservicedescriptionlanguage;MagentoSoapV1v1扩展案例step1:在etc下新建api.xml,内容如下

  • 华为服务器重装操作系统,华为服务器安装操作系统[通俗易懂]

    华为服务器重装操作系统,华为服务器安装操作系统[通俗易懂]《华为服务器安装操作系统》由会员分享,可在线阅读,更多相关《华为服务器安装操作系统(24页珍藏版)》请在人人文库网上搜索。1、华为服务器安装操作系统1.把网线接到服务器管理口上,2288服务器管理口在服务器背后中下部位置,有Mgmt的指示字样。5885服务器管理口在服务器背后右中部位置,有Mgmt的指示字样。2.另一端连接到电脑上,并配上ip地址,192.168.2.1段地址。3.在浏览器输入管理…

  • 流量相关说明

    流量相关说明

  • maven的使用教程_maven使用教程

    maven的使用教程_maven使用教程maven面临的问题一个项目就是一个工程。如果项目非常大,最好是每一个模块对应一个工程。借助maven可以将一个项目拆分成多个工程项目中需要的jar必须要手动”复制”,”粘贴”到WEB-INF/lib目录下,带来的问题是:同样的jar包文件重复出现在不同的项目工程中,浪费空间。maven可以将jar仅仅保存在”仓库”中,有需要使用的工程”引用”这个文件接口,并不需要真的把jar包复制过来jar包需要别人替我们准备好,或到官网下载。不同技术的官网提供jar包下载的形式是五花八门的,有些技术的官网就是

  • 稻城亚丁4天自由行攻略_稻城亚丁3天旅行攻略

    稻城亚丁4天自由行攻略_稻城亚丁3天旅行攻略有人说向往什么,就去追求什么,才能求仁得仁。稻城亚丁,人称“最后的香格里拉”,藏语也称香巴拉,意为“心中的日月”,外人视为世外桃源,是作为川西秘境中最值得我们去探访的圣地。如果向往真爱和自由,那就带上

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号