Android技术知识Android开发Android开发经验谈

谈谈代码混淆技术的原理、方法和未来

2024-02-21  本文已影响0人  蚍蜉一生

代码混淆是什么?

    混淆从字面意思来说是混合、杂糅,使一个事物变得难以区分或识别。代码混淆是将计算机程序的源代码或机器代码,转换成功能上等价,但是难于阅读和理解形式的行为。本文就Android上代码混淆技术进行展开讨论。

代码混淆具体方案

混淆开启

在对应模块比如的build.gradle android 配置下进行开启

android {  
    buildTypes {  
        release {  
            // 启用代码压缩 开启混淆,这是使用 ProGuard 的前提。
            minifyEnabled true    
           // 启用资源压缩,移除未使用的资源
            shrinkResources true   
          // 混淆配置,proguard-android-optimize.txt是Android默认配置,在Android SDK 工具目录下,proguard-rules.pro是用户自定义配置,该文件在项目根目录下
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  
        }  
    }  
}

开启混淆后,在编译过程中会将代码中的类名、方法名和变量名替换为无意义的字符,从而使编译后代码变得难以理解,增加了黑客和其他开发者反编译SDK或者APK读懂源码的难度吗,一定程度上增加了APK的安全性。混淆过程过程其实就是一些字符映射替换的过程,为了方便开发者自己定位问题,Android Studio 是有把这个这个映射文件打印出来的

混淆映射文件.png
混淆map大概是如下样子
com.example.MyClass -> com.example.a.b.c.MyClass:  
    java.lang.String myField -> myField  
    int myMethod(java.lang.String) -> a(java.lang.String)

混淆配置

    主要是指定哪些代码需要被混淆,以及哪些代码不被混淆(比如一些类、方法在代码中被反射调用就不能随便更改方法名),这些在两种文件中:proguard-rules.pro 和 consumer-rules.pro

混淆规则示例:

-keep public class com.example.MyClass:保留指定的类不被混淆。
-keep class com.example.** { *; }:保留指定包下的所有类和类成员。
-keepclassmembers class com.example.MyClass { public void myMethod(); }:保留类中的特定方法不被混淆。
-keepclassmembers class com.example.MyClass { *; }:保留类中的所有成员(字段和方法)。
-keepattributes *Annotation*:保留所有的注解。
-keepclassmembers enum * { *; }:保留所有枚举类型的成员

代码混淆技术的未来

    代码混淆和理解混淆代码是盾和矛的故事,未来AI大模型加持下 代码混淆将变得更加容易,但阅读起来更加难,同样的AI加持的混淆代码解析也会变得更加容易,具体来说AI大模型可能在以下方面混淆场景发挥作用:

上一篇 下一篇

猜你喜欢

热点阅读