首页 > 编程知识 正文

代码混淆器到底是不是病毒,安卓哪些不能混淆

时间:2023-05-05 21:26:44 阅读:111584 作者:4064

一、混淆基本原理和目的:

目的:使反编译APP的码不明显。 只是让别人难以理解。

基本原理:将代码中原本具有具体意义的包名、类名、变量名、方法名等名称全部替换为按顺序排列的无意义英文字母a、b、c….代码结构不变,得到相同的结果。

功能:【优化】优化java字节码,加快程序运行减少【压缩】APP大小,找出并删除混淆过程中未使用的类和类成员; 【混淆】反编译,难以理解。

二、安卓中代码混淆的介绍和配置:

Android的SDK附带了混淆工具Proguard,位于SDK根toolsproguard下。 代码混淆需要理解以下三个文件:

1 .默认混淆规则,包括1.proguard-Android.txt:SDK根 toolsproguardproguard-Android.txt中的相对常规规则

2.proguard-rules.pro :您的项目必须特别定义混淆规则。 那个在项目根目录下,内容需要自己制作

3.aapt_rules.txt :打包时在混淆过程中生成的文件。 如果混淆过程中发生错误,可以在此确定位置。 项目根目录的: buildintermediatesproguard-rulesreleaseaapt _ rules.txt

在Android Studio中启用自己的代码混淆规则。 如下构成。 在gradle需要发布的生产环境(即配置)中,添加以下红色边框代码:

图像

参数说明:

minifyEnabled : true,启用自定义混淆规则,即proguard-rules.pro; false,相反不使用自定义混淆规则

shrinkResources (打开并删除无用的资源,即未引用的文件(实际测量是drawable,layout,实际上不是完全删除,而是保留文件名,但没有内容等) )

proguardfilesgetdefaultproguardfile (proguard-android.txt )、(proguard-rules.pro ) :在SDK上)获取proguard-Android 注:此代码意味着混淆规则采用proguard-Android.txt proguard-rules.pro,因此在自定义混淆规则时不要重复。 当然,重复一遍也没什么大问题。

三、混淆规则(命令说明基础模板) :

混淆命令说明:

|代码|说明|

| -优化过程5 |代码混淆压缩率,0到7之间默认值为5,通常不更改|

| -dontusemixedcaseclassnames |不混合大小写,使混合类名小写|

|-dontskipnonpubliclibraryclasses |指定不忽略非公用库的类|

| -verbose | #混淆时是否记录|

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

| -dontpreverify |无预检查。 预览是proguard的四个步骤之一,Android不需要预览。 消除这一步可以加速混淆。 |

| -优化|

采用的模糊化算法。 指定采用模糊处理的算法,后面的参数是过滤器。 此过滤器是谷歌推荐的算法,通常不更改。

-优化! 代码/简化/快速! field/class/merging/

|

| -dontshrink |压缩功能,默认启用。 |

| -dontoptimize |代码优化,java字节码优化,启用缺省|

|

-keep ``class XXXX

|类名保持不变,即类名不混淆,不保证类中的成员名称。 当然,也可以避免混淆继承XXX类的所有类名|

|

- keepclasseswithmembers ` ` class xxxx

|保存类名和成员名。 当然,也可以是类中的特定方法|

.

项目中的公告部分复制到你的项目中即可,其他部分根据自己的项目添加。 不能混淆的代码: 1、需要反射的代码

2、系统接口; 3、Jni接口4、需要

序列号和反序列化的代码(即实现Serializable接口的JavaBean);5、与服务端进行元数据交互的JavaBean(JSON、XML中对应的类);6、实体类,json解析类;7、第三方jar包。等等

#-------------------------公共部分 start-------------------------------

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontskipnonpubliclibraryclassmembers

-dontpreverify

-verbose

-printmapping proguardMapping.txt

-optimizations !code/simplification/cast,!field/*,!class/merging/*

-keepattributes *Annotation*,InnerClasses

-keepattributes Signature

-keepattributes SourceFile,LineNumberTable

# 保留了继承自Activity、Application这些类的子类

# 因为这些子类有可能被外部调用

# 比如第一行就保证了所有Activity的子类不要被混淆

-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

#如果引用了v4或者v7包,

-dontwarn android.support.**

-keep class android.support.** {*;}

-keepclasseswithmembernames class * {

native ;

}

-keepclassmembers class * extends android.app.Activity{

public void *(android.view.View);

}

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

-keep public class * extends android.view.View{

*** get*();

void set*(***);

public (android.content.Context);

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

-keepclasseswithmembers class * {

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

-keepclassmembers class * implements java.io.Serializable {

static final long serialVersionUID;

private static final java.io.ObjectStreamField[] serialPersistentFields;

private void writeObject(java.io.ObjectOutputStream);

private void readObject(java.io.ObjectInputStream);

java.lang.Object writeReplace();

java.lang.Object readResolve();

}

-keep class **.R$* {

*;

}

-keepclassmembers class * {

void *(**On*Event);

}

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

}

#-------------------------公共部分 end-------------------------------

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。