### ProGuard概述与混淆策略详解 #### 一、ProGuard简介 ProGuard是一款用于Java类文件的缩减器、优化器、混淆器和预验证器工具。它可以移除未使用的类、字段、方法和属性;对剩余元素进行重命名并简化其描述;优化类结构和执行流程;最终对整个结果进行预验证确保兼容性。通过这种方式,ProGuard不仅能够减少应用的体积大小,还能提高执行效率,并且增加代码的难度,使其难以被反编译分析。 #### 二、ProGuard配置详解 根据提供的部分内容,我们可以看到一系列的ProGuard指令,下面将逐条解释这些指令的具体含义和应用场景。 1. **-dontwarncom.joniy.** - 这条指令用于告诉ProGuard忽略所有以`com.joniy.`开头的类产生的警告。这在处理第三方库或依赖项时特别有用,因为它们可能包含无法混淆或不希望混淆的部分。 2. **-dontpreverify** - 表示禁用预验证。ProGuard默认会对输出的类文件进行预验证,但这一步骤可能会导致性能开销。如果确认输出的类文件会被JVM正确处理,可以考虑禁用此选项以提高混淆速度。 3. **-dontoptimize** - 禁止ProGuard执行任何优化操作。通常情况下,ProGuard会尝试优化代码以减小文件大小并提高运行效率。但在某些场景下,禁用优化可以避免引入潜在问题。 4. **-optimizationpasses5** - 设置优化传递次数为5次。更多的优化传递次数意味着更深入的优化过程,但同时也会增加混淆所需的时间。 5. **-dontusemixedcaseclassnames** - 表示混淆后不会使用大小写字母混合的类名。这样可以进一步降低文件大小,但会降低反编译后的可读性。 6. **-dontskipnonpubliclibraryclasses** - 指令表明即使非公共库类也应该被包含在内。这对于那些依赖于私有库API的应用程序来说非常重要。 7. **-verbose** - 打开详细输出模式。ProGuard将在控制台输出更多细节信息,便于调试和问题排查。 8. **-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*** - 这里指定了优化时要排除的部分类型:包括代码简化、算术运算、字段以及类合并等。这些排除项有助于避免优化过程中可能引入的问题。 9. **-keeppublicclass*extendsandroid.app.Activity** - 保留所有继承自`android.app.Activity`的公共类。这是因为Activity是Android应用程序的重要组成部分,必须保持可见以便其他组件(如Intent)能够引用。 10. **-keeppublicclass*extendsandroid.app.Application** - 保留所有继承自`android.app.Application`的公共类。`Application`类是应用程序全局状态和生命周期事件的核心,因此需要保持不变。 11. **-keeppublicclass*extendsandroid.app.Service** - 保留所有继承自`android.app.Service`的公共类。服务组件是后台执行长时间运行操作的主要方式之一。 12. **-keeppublicclass*extendsandroid.content.BroadcastReceiver** - 保留所有继承自`android.content.BroadcastReceiver`的公共类。广播接收器用于监听并响应来自系统或其他应用的特定事件。 13. **-keeppublicclass*extendsandroid.content.ContentProvider** - 保留所有继承自`android.content.ContentProvider`的公共类。内容提供者用于存储和检索数据,是Android四大组件之一。 14. **-keeppublicclass*extendsandroid.app.backup.BackupAgentHelper** - 保留所有继承自`android.app.backup.BackupAgentHelper`的公共类。备份代理帮助器用于支持数据备份和恢复功能。 15. **-keeppublicclass*extendsandroid.preference.Preference** - 保留所有继承自`android.preference.Preference`的公共类。偏好设置框架允许用户定制应用的行为。 16. **-keeppublicclasscom.android.vending.licensing.ILicensingService** - 保留指定类`com.android.vending.licensing.ILicensingService`。这是Google Play授权服务接口,用于实现应用内购买等功能。 17. **-keeppublicabstractinterfacecom.asqw.android.Listener** - 保留公共抽象接口`com.asqw.android.Listener`及其成员方法。这是一个自定义的监听器接口。 18. **-keeppublicclasscom.asqw.android{publicvoidStart(java.lang.String);}** - 保留类`com.asqw.android`中的`public void Start(java.lang.String)`方法。这是一种典型的保留自定义类的方法的方式。 19. **-keepclasseswithmembernamesclass*{native<methods>;}** - 保留包含原生方法的所有类。这是因为JNI调用依赖于具体的原生方法签名。 20. **-keepclasseswithmembersclass*{public<init>(android.content.Context,android.util.AttributeSet);}** - 保留包含构造函数`public <init>(android.content.Context, android.util.AttributeSet)`的所有类。这是Android视图和布局组件常用的构造函数。 21. **-keepclasseswithmembersclass*{public<init>(android.content.Context,android.util.AttributeSet,int);}** - 保留包含带有额外整型参数的构造函数`public <init>(android.content.Context, android.util.AttributeSet, int)`的所有类。 22. **-keepclassmembersclass*extendsandroid.app.Activity{publicvoid*(android.view.View);}** - 保留所有继承自`android.app.Activity`的类中的所有`public void*(android.view.View)`方法。这是Activity处理点击事件的标准方法。 23. **-keepclassmembersenum*{publicstatic**[]values(); publicstatic**valueOf(java.lang.String);}** - 保留所有枚举类型中的`values()`和`valueOf(String)`方法。这些方法是枚举类型的关键部分。 24. **-keepclass*implementsandroid.os.Parcelable{publicstaticfinalandroid.os.Parcelable$Creator*;}** - 保留实现了`Parcelable`接口的所有类中的`Parcelable.Creator`字段。`Parcelable`接口允许对象序列化并传递到其他组件中。 25. **-keepclasseswithmembersclasscom.joniy.utils.collections.ConcNodeCachingLinkedQueue{<fields>; <methods>; }** - 保留`com.joniy.utils.collections.ConcNodeCachingLinkedQueue`类中的所有字段和方法。这是一个自定义的集合类。 #### 三、总结 通过以上对ProGuard配置指令的详细解读,我们可以了解到如何有效地使用ProGuard来减少应用体积、提升执行效率并保护源代码免受逆向工程的威胁。合理地配置这些指令对于开发高质量的Android应用至关重要。此外,还需要注意的是,在实际项目中,应根据具体需求调整配置以达到最佳效果。
2、java.lang.ArrayIndexOutOfBoundsException -dontpreverify【不预校验】 改成 -dontoptimize【不优化】
-optimizationpasses 5 【优化过程】等级dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】
-dontpreverify 【不预校验】
-verbose 【是否罗列详细信息,默认不罗列】
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】
-keep public class * extends android.app.Activity 【对keep后的类将不进行混淆保持原样打入到jar中或dex中】
-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【对单个类的保护】
-keep public abstract interface com.asqw.android.Listener{
public protected <methods>; 【访问权限为protected级别的所有方法不进行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}
-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】
native <methods>;
}
-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
- 粉丝: 14
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助