大家好,又见面了,我是你们的朋友全栈君。
一、前言
混淆是一种代码保护手段,通过将原本正常的项目文件,对其类、方法、字段进行重新命名,如a、b、c、d、e、f等字母组合,达到混淆代码的目的。这样反编译出来的代码结构会变得混乱,阅读起来更加困难。本文的混淆总结基于Android Studio的IDE开发环境。
二、官方默认的混淆配置
在Android Studio中进行混淆,主要是对Proguard-rules.pro文件的操作。混淆的过程是有规律可循的。首先,我们可以查看官方提供的proguard-android.txt文件,该文件位于/tools/proguard目录下。如果不知道如何编写混淆规则,可以将该文件作为模板,复制一份到自己的工程中,并根据项目需求修改相应的混淆配置。以下是proguard-android.txt文件的内容:
```
# 保留所有类不被混淆
-keep class * {
public protected *;
}
# 保留所有实现了某接口的类不被混淆
-keep class * implements com.example.MyInterface {
public protected *;
}
# 保留所有继承了某类的类不被混淆
-keep class * extends com.example.MyClass {
public protected *;
}
# 保留所有带有某个注解的类不被混淆
-keep @com.example.MyAnnotation class * {
public protected *;
}
# 保留所有带有某个注解的方法不被混淆
-keepclassmembers class * {
@com.example.MyAnnotation
}
```
以上就是官方默认的混淆配置,你可以根据实际项目需求进行相应的修改和调整。
```
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Optimization is turned off by default. Dex does not like code run through the ProGuard optimize and preverify steps (and performs some of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just include optimization flags in your own project configuration file; instead you will need to point to the "proguard-android-optimize.txt" file instead of this one from your project.properties file.
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * { native <methods>; }
# keep setters in Views so that animations can still work. see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); }
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
-keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; }
-keepclassmembers class **.R$* { public static <fields>; }
# The support library contains references to newer platform versions. Don't warn about those in case this app is linking against an older platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * { @android.support.annotation.Keep <methods>; }
-keepclasseswithmembers class * { @android.support.annotation.Keep <fields>; }
-keepclasseswithmembers class * { @android.support.annotation.Keep <init>(...); }
```
混淆是Android开发中常用的一种代码保护手段,它可以对代码进行加密,使得代码在未被授权的情况下无法被阅读和使用。在混淆过程中,有一些默认的规则需要遵循,例如view、activity、Parcelable、注解、R文件、枚举等这类的东西都不会被混淆,否则release版本会报错。
要开启Android Studio的混淆配置,只需设置minifyEnabled为true即可。具体操作如下:
```java
buildTypes {
release {
minifyEnabled true // true表示开启混淆配置,false表示关闭
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.duqian_android_keystore
}
debug {//省略}
}
```
在Android混淆中,有一些通用的规则需要遵循。首先是系统混淆配置,包括以下选项:
1. dontusemixedcaseclassnames:混淆时不使用大小写混合类名。
2. dontskipnonpubliclibraryclasses:不跳过library中的非public的类。
3. verbose:打印混淆的详细信息。
4. dontoptimize:不进行优化,建议使用此选项。
5. dontpreverify:不进行预校验,Android不需要,可加快混淆速度。
6. ignorewarnings:忽略警告。
7. optimizationpasses 5:指定代码的压缩级别。
此外,还有一些常用的一些混淆配置,可以根据实际需求进行选择和调整。
请根据以下内容完成重构并保持段落结构:
```java
-keepattributes Signature # 范型 # native方法不混淆
-keepclasseswithmembernames class * { native <methods>; } # v4包不混淆
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
# Gson混淆配置
-keep class sun.misc.Unsafe { *; }
-keep class com.idea.fifaalarmclock.entity.***
-keep class com.google.gson.** { *; }
# JavaBean
-keepclassmembers public class cn.net.duqian.bean.** {
void set*(***);
*** get*();
}
-keep class com.xx.duqian_cloud.JavaScriptInterface { *; }
# webview js
# 忽略 libiary混淆
-keep class io.vov.vitamio.** { *; }
# butterknife不混淆
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.*
}
-keepclasseswithmembernames class * {
@butterknife.*
}
```
在Android项目中,混淆是一种保护代码不被轻易逆向分析的方法。在混淆过程中,需要对一些特定的类和方法进行保留,以确保程序的正常运行。以下是关于Android混淆的一些建议和注意事项:
1. 保留必要的类和方法:在混淆配置文件中,使用`-keepclassmembers`和`-keep`指令来保留必要的类和方法。例如:
```java
-keepclassmembers class * { public <init> (org.json.JSONObject); }
```
2. 不要混淆Java反射相关的类和方法:因为代码混淆后,反射会按照原来的类名和方法名去查找,导致找不到对应的方法而引发程序崩溃。所以,不要混淆包含Java反射的类和方法。
3. 不要混淆Activity、自定义View等带有完整包名的类:这些类在AndroidManifest.xml文件中有完整的类名,如果混淆后找不到对应的类名,会导致应用无法正常启动。
4. 混淆后使用时常见问题及解决方法:当项目中出现so的native代码找不到Java的方法时,可以尝试将
```java
-keepclasseswithmembernames class * { native <methods>; }
```
更改为:
```java
-keep class * { native <methods>; }
```
总之,在Android项目中进行混淆时,需要注意保留必要的类和方法,避免混淆影响程序的正常运行。同时,要关注混淆后可能出现的问题,并及时调整混淆配置以解决问题。