著作者
这篇文章是由两点水提交的,博客地址:http://www.apkbus.com/myspaceblog-911082.html
前言
今天包装新产品的时候,突然忘了混淆的参数怎么写了。虽然之前很迷茫,但是具体的配置参数代码不记得了,所以决定花点时间写个博客记录下来,方便以后搜索和自己记忆。
Android Studio代码混淆了基本配置
在项目目录中,找到proguard-rules.pro文件,也就是你要写混淆配置的文件,在这个文件中写混淆规则
当然,在此之前,您还需要参考模块的build.gradle文件中的混淆文件:
上面的文件proguard-android.txt是系统默认的混淆文件,具体在目录中../sdk/tools/proguard/,里面包含了安卓最基本的混淆,一般不需要改动。我们需要配置的是项目中app下的proguard-rules.pro文件。
混淆规则
1.基本规则
两个常用的混淆命令,注意一颗星只保留了包下的类名,但是子包下的类名还是会混淆;两颗星表示将类名保存在这个包和包含的子包下
-keepclasscn.hadcn.test.**
-keepclasscn.hadcn.test.*
使用以上方法保持类后,你会发现虽然类名没有混淆,但是里面具体的方法和变量名都变了。此时,如果您想同时保留类名和内容,我们需要以下方法
-keep class com . example . bean . * * { *;}
在此基础上,我们还可以利用Java的基本规则来保护特定的类不被混淆,比如我们可以利用这些Java规则进行扩展和实现等。以下示例防止所有继承活动的类被混淆
#保留我们使用的四个组件、自定义应用程序等。这些类并没有混淆#因为这些子类可能在外部被称为-keep public class * extends Android . app . activity。
-保留public class * extendsandroid . app . application action
-保留公共类*extendsandroid.app.Service
-keep public class * extendsandroid . content . BroadcastReceiver
-keep public class * extendsandroid . content . ContentProvider
-keep public class * extendsandroid . app . backup . backup AgentHelper
-保留公共类* extendsandroid . preference . preference
-保留公共类*extendsandroid.view.View
-keep public class com . Android . venking . licensing . ilickensingServiCe
2.什么时候才不会迷茫
一般以下情况不会混淆:
1.如果您使用自定义控件,请确保它们不会混淆
2.枚举用于确保枚举不被混淆
3.不要混淆第三方库中的类
4.使用反射的类不会混淆
5.Gson之类的工具用来做JavaBean类,也就是实体类,不要混淆
6.引用第三方库时,一般会标注库的混淆规则。建议在使用时加入混淆规则,以免最后发现
7.使用WebView的JS调用也需要确保编写的接口方法不会混淆,原因与第一个相同
8.8的子类。Parcelable不要和Creator的静态成员变量混淆,否则会生成Android . OS . baddparcelableexception
基本混淆模板
最后,提供一个基本的混淆模板,当然是第三方库,或者上面提到的地方,根据自己的实际需要进行混淆
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #添加一些基本说明。
#代码混淆压缩率,在0~7之间,默认为5,一般不变
-优化通过5次
#混合时不要使用大小写混合,混合类名为小写
-dontusemixedcaseclassnames
#指定不忽略非公共库的类
-dontskippnonpubliclibraryclass
#这句话可能会混淆我们的项目,并产生一个映射文件
#包含类名->;混淆类名的映射关系
-冗长
#指定不忽略非公共库的类成员
-dontskippnonpubliclibraryclassmembers
#不要进行预验证。预验证是编程的四个步骤之一。安卓不需要预验证。消除这一步会加快混乱。
-dontpreverify
#不混淆地留下注释
-keepattributes *Annotation*,InnerClasses
#避免混淆泛型
-保留属性签名
#抛出异常时保留代码行号
-保留属性源文件,行号表
#指定用于模糊处理的算法,以下参数是过滤器
#这个过滤器是Google推荐的算法,一般不变
优化!代码/简化/cast,!field/*,!分类/合并/*
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#保留我们使用的四个组件、自定义应用程序等。这些类并不混乱
#因为这些子类可能被外部调用
-保留公共类* extendsandroid.app.Activity
-保留public class * extendsandroid . app . application action
-保留公共类* extendsandroid.app.Service
-keep public class * extendsandroid . content . BroadcastReceiver
-keep public class * extendsandroid . content . ContentProvider
-keep public class * extendsandroid . app . backup . backup AgentHelper
-保留公共类* extendsandroid . preference . preference
-保留公共类* extendsandroid.view.View
-keep public class com . Android . venking . licensing . ilickensingServiCe
#保留所有支持的类及其内部类
-keep class Android . support . * * { *;} #保留继承的
-keep public class * extendsandroid . support . v4 . * *
-keep public class * extendsandroid . support . V7 . * *
-keep public class * extendsandroid . support . annotation . * *
#保留r下的资源。
——保持阶级**。R $ * { *}
#避免混淆本地本地方法
-keepclasseswithmembernames类* { native & lt方法>。;}
#活动中保留的方法参数是视图的方法。
#这样我们在布局中写的onClick就不会受到影响
-keepclassmembers class * extendsandroid . app . activity { public void *(Android . view . view);}
#防止枚举类混淆-keepclassmembersenum * { public static * *[]values();public static * * value of(Java . lang . string);}
#防止我们的自定义控件(从视图继承)混淆
-keep public class *扩展了Android . view . view { * * * get *(1);void set *(* * *);公共<。init>。(Android . content . context);公共<。init>。(android.content.Context,Android . util . AttributeSet);公共<。init>。(android.content.Context,android.util.AttributeSet,int);}
#避免混淆可打包的序列化类
-keep class *实现Android . OS . Parcelable { public static final Android . OS . Parcelable $ Creator *;}
#防止可序列化的序列化类被混淆
-keepclassmembers类*实现Java . io . serializable { static final long SerVices version id;私有静态最终Java . io . ObjectStreamField[]SerVices persistentFields;!静止!瞬态<。字段>。;!私人<。字段>。;!私人<。方法>。;private void WriteObject(Java . io . ObjectOutputStream);private void ReadObject(Java . io . ObjectInputStream);Java . lang . object WriteReplace();Java . lang . object read resolve();}
#对于带回调函数的onXXEvent和* * On *监听器,不能混淆
-keep class members class * { void *(On * *)Event;void *(开*监听器);}
# webView处理,webView不在项目中使用,可以忽略
-keepclassmembers class fqcn . of . Java . interface . for . web view { public *;}-keepclassmembers class * extendsandroid . web kit . WebView client { public void *(Android . web kit . WebView,java.lang.String,Android . graphics . Bitmap);public boolean *(Android . web kit . WebView,Java . lang . string);}-keepclassmembers class * extendsandroid . web kit . WebView client { public void *(Android . web kit . WebView,jav . lang . string);}
所有人都在看
欢迎来到安卓公交论坛的博文
1.《代码混淆 Android Studio 代码混淆》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《代码混淆 Android Studio 代码混淆》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1236525.html