2步完成代码混淆

【第一步】:

修改module下的build.gradle
     buildTypes {
       release {
           // 是否进行混淆
           minifyEnabled true
           // 混淆文件的位置
           // proguard是一个压缩、优化和混淆Java字节码文件的免费的工具
           proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
       }
     }

【第二步】:

在proguard-rules.pro中添加:
#指定代码的压缩级别
-optimizationpasses 5

#包明不混合大小写
-dontusemixedcaseclassnames

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

#优化 不优化输入的类文件
-dontoptimize

#预校验
-dontpreverify

#混淆时是否记录日志
-verbose

# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#保护注解
-keepattributes *Annotation*

# 保持哪些类不被混淆
-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
-keep public class com.android.vending.licensing.ILicensingService
#如果有引用v4包可以添加下面这行
-keep public class * extends android.support.v4.app.Fragment

#忽略警告
-ignorewarning

##记录生成的日志数据,gradle build时在本项目根目录输出##

#apk 包内所有 class 的内部结构
-dump class_files.txt
#未混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt

########记录生成的日志数据,gradle build时 在本项目根目录输出-end######

#####混淆保护自己项目的部分代码以及引用的第三方jar包library#######

#-libraryjars libs/umeng-analytics-v5.2.4.jar

#三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar
#-libraryjars libs/sdk-v1.0.0.jar
#-libraryjars libs/look-v1.0.1.jar

#如果不想混淆 keep 掉
-keep class com.lippi.recorder.iirfilterdesigner.** {*; }
#友盟
-keep class com.umeng.**{*;}
#项目特殊处理代码

#忽略警告
-dontwarn com.lippi.recorder.utils**
#保留一个完整的包
-keep class com.lippi.recorder.utils.** {
*;
}

-keep class com.lippi.recorder.utils.AudioRecorder{*;}

#如果引用了v4或者v7包
-dontwarn android.support.**

####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####

-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}

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

#保持自定义控件类不被混淆
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}

#保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable

#保持 Serializable 不被混淆并且enum 类也不被混淆
-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();
}

#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
#-keepclassmembers enum * {
# public static **[] values();
# public static ** valueOf(java.lang.String);
#}

-keepclassmembers class * {
public void *ButtonClicked(android.view.View);
}

#不混淆资源类
-keepclassmembers class **.R$* {
public static <fields>;
}

#避免混淆泛型 如果混淆报错建议关掉
#–keepattributes Signature

#移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志
#-assumenosideeffects class android.util.Log {
# public static boolean isLoggable(java.lang.String, int);
# public static int v(...);
# public static int i(...);
# public static int w(...);
# public static int d(...);
# public static int e(...);
#}

#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
#gson
#-libraryjars libs/gson-2.2.2.jar
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

时间: 2024-08-05 15:20:43

2步完成代码混淆的相关文章

Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)

第一步:代码混淆(注意引入的第三方jar) 在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. 新建一个项目的时候,会自动生成project.properties和proguard-project.txt文件,无需自己新建,如果你的项目无法自动生成,那么你就要检查一下你的ADT版本了 如果需要对项目进行全局混码,只需要进行一步操作: 将project.properties的中 “#progua

Android Studio多渠道批量打包及代码混淆

一.批量打包 1.集成了友盟统计,并在AndroidManifest.xml中添加了如下代码 <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}"/> 2.在app的build.gradle的android标签下添加如下代码: productFlavors { myapp {} _360 {} appchina {} hiapk {} } productFlavo

android对app进行代码混淆

接到一个新的任务,对现有项目进行代码混淆.之前对混淆有过一些了解,但是不够详细和完整,知道有些东西混淆起来还是比较棘手的.不过幸好目前的项目不是太复杂(针对混淆这块来说),提前完成--现总结之. 第一部分 介绍下操作流程(eclipse): 1.打开混淆器:找到项目根目录下的project.properties文件,将"#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt"

android 代码混淆

android 代码 混淆- 原来如此简单 一个xxx.apk提交给测试. ok,去倒杯水,看看网页~~~~~ 呃,忽然觉得 是不是应该 给我的代码 提高点安全性, 记得看过 apk直接可以 解压,然后很容易的就可以 反编译出 .java 找了找,果然,这一切 只不过是 一分钟的事儿, 1.得到 classes.dex文件:直接用你机器上的  解压软件 打开 .apk 文件 解压出 classes.dex 文件,(这个就是 .jar 的前生--- 其实应该说 后世) 2.还原.jar文件:这一步

代码混淆之道——控制流扁平与不透明谓词理论篇

控制流是指代码执行时指令的执行顺序.在各种控制逻辑的作用下,程序会沿着特定的逻辑顺序执行.一般控制逻辑包括有无条件分支.循环.函数调用等. 本文原创作者:i春秋签约作家--penguin_wwy 一.扁平化的定义 本篇讲代码混淆的一个重要手段,控制流扁平化. 所谓控制流是指代码执行时指令的执行顺序.在各种控制逻辑的作用下,程序会沿着特定的逻辑顺序执行.一般控制逻辑包括有\无条件分支.循环.函数调用等.在正常情况下程序的逻辑非常好理解(代码逻辑不好的程序员都死了...),开发过程中有各种人为的行为

ProGuard代码混淆技术详解

前言 受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI和利用MobileAPI处理Json还是蛮无聊的,做着重复的事情,没有技术的上提升空间的.所以,根据里面提到的Android应用开发人员所需要精通的20个技术点,写篇文章进行总结,一方面是梳理下基础知识和巩固知识,另一方面也是弥补自我不足之处. 那么,今天就来讲讲ProGuard代码混淆的相关技术知识点. 内容目录

玩一下android的反编译和代码混淆

这次准备系统的玩儿一下android从导出apk到反编译再到代码混淆然后再次反编译的过程,有图有真相的记录一下~~ 第一步,导出未加混淆的普通apk 首先创建了一个fuckcode项目,有基本的Activity:MainActivity一个,Other类一个,代码很简单,在MainActivity中调用Other的静态方法xx,xx方法只是输出一个字符串,预想目的是为了看看混淆后Other是否还可以反编译出来.附图: ok,很业余很简单哈,MainActivity中代码也很业余很简单,如下: 1

Android代码混淆,就这么简单

前言 在这个乞丐都精通C++的时代,我们的代码安全实在是不敢保证,为了保护我们的代码不被牛逼的乞丐篡改,代码混淆还是必须的.大多数人还是认为代码混淆是很复杂的事情,我自己也这么认为... 看完这篇博客,也许就会发现,其实没那么难. 段子 老规矩,在节目开始之前,先来一个搞笑段子: 女孩:你为什么对我这么好啊? 男孩:我希望有朝一日- 女孩:滚!混蛋 男孩:哎,我还没说完呢~ 五步搞定 1 打开项目中的proguard-rules.pro,将下面的代码复制进去.我的思路是将混淆分为2个主要部分 定

Android代码混淆那些事

代码混淆的作用就不说了.这里以BaiduMapDemo作为例子说一下代码混淆: 这是这个工程大致轮廓: (1)没有混淆apk反编译之后的情况: 具体到每个包下的情况:         可以看出来混淆的只是第三方的jar包,这并不是我们混淆的,而是第三方的jar包自带的混淆. (2)那我们就开始混淆: 分两步走: (|)   第一步:打开project.properties 原来这个文件是这样的: 看到第11行了吧,把第11行前面的#去掉. 变成了这样: 到了这里我们的却是已经混淆了.混淆的结果是