首页 > 解决方案 > 混淆不适用于 kotlin 类和字段名称

问题描述

我正在 kotlin 中开发一个Android SDK试图对其进行混淆。R8混淆适用于java类 ,但不适用于kt类。

有谁知道如何混淆kotlin类和字段名称?

我写了4个类:
Android Studio 上的结构

来源:
KotlinClassToKeep.kt

class KotlinClassToKeep {
    var kotlinClassToObfuscate = KotlinClassToObfuscate()

    fun funToKeep() {
        kotlinClassToObfuscate.funToObfuscate()
        Log.d("TAG", "here in kotlin")
    }
}

KotlinClassToObfuscate.kt

class KotlinClassToObfuscate{
    var obfuscateStr: String = "default"

    fun funToObfuscate() {
        Log.d("TAG", obfuscateStr)
    }
}

JavaClassToObfuscate.java

public class JavaClassToKeep {
    public JavaClassToObfuscate javaClassToObfuscate;

    public void methodToKeep() {
        javaClassToObfuscate.methodToObfuscate();
        Log.d("TAG", "here in java");
    }
}

JavaClassToObfuscate.java

class JavaClassToObfuscate {

    public String strToObfuscate = "default";

    public void methodToObfuscate() {
        Log.d("TAG", strToObfuscate);
    }
}

proguard-rules.pro

-repackageclasses 'obfuscate.test.obfuscate'

-keep class obfuscate.test.java.JavaClassToKeep {
    *;
}

-keep class obfuscate.test.kotlin.KotlinClassToKeep {
    *;
}

然后,我打包了这个库。但是当我使用JD-GUI检查它时,有一些我想混淆的信息就像KotlinClassToObfuscate它一样。

@Metadata(mv = {1, 5, 1}, k = 1, xi = 48, d1 = {"\000\032\n\002\030\002\n\002\020\000\n\002\b\002\n\002\020\016\n\002\b\005\n\002\020\002\n\000\030\0002\0020\001B\005\006\002\020\002J\006\020\t\032\0020\nR\032\020\003\032\0020\004X\016\006\016\n\000\032\004\b\005\020\006\"\004\b\007\020\b\006\013"}, d2 = {"Lobfuscate/test/kotlin/KotlinClassToObfuscate;", "", "()V", "obfuscateStr", "", "getObfuscateStr", "()Ljava/lang/String;", "setObfuscateStr", "(Ljava/lang/String;)V", "funToObfuscate", "", "obfuscate-test_release"})
public final class b {}

而当我在一个应用项目中使用这个SDK的时候,可以看到上面的类名和val名:
structure on Android Studio
反编译后

但是正如我所料,java类被混淆了:

混淆的java类

这是构建后生成的mapping.txt:

# compiler: R8
# compiler_version: 2.1.75
# pg_map_id: 2e561a0
# common_typos_disable
obfuscate.test.java.JavaClassToObfuscate -> obfuscate.test.obfuscate.a:
obfuscate.test.kotlin.KotlinClassToKeep -> obfuscate.test.kotlin.KotlinClassToKeep:
    1:1:void obfuscate.test.kotlin.KotlinClassToObfuscate.funToObfuscate():0:0 -> funToKeep
    1:1:void funToKeep():0 -> funToKeep
    2:2:void funToKeep():0:0 -> funToKeep
obfuscate.test.kotlin.KotlinClassToObfuscate -> obfuscate.test.obfuscate.b:

它还表明它KotlinClassToObfuscate会被混淆,但事实是它并没有完全混淆。
有谁知道如何混淆 kotlin 类和字段名称?

标签: javaandroidkotlinproguardandroid-r8

解决方案


推荐阅读