我怎样才能混淆我的编码与kotlin的sdk(并摆脱元数据)

我正在开发一个SDK(Android库),我必须混淆我的代码的很大一部分,所以客户可能不会尝试玩内部代码。 我的lib是用kotlin编码的,我用proguard来混淆代码。 问题是在编译和混淆之后,代码中仍然存在@ kotlin.Metadata(运行时)注释。 通过这些注释,检索产生这个“(非那么混淆)”字节码的java代码是很容易的。

我首先想到这是我的错,而且我的项目有太多的熵源可能导致了这种行为,所以我做了一个样本项目来证明这个问题不是来自我的sdk实现。 我用AS创建了一个新项目,然后是一个带有2个文件的lib模块:

  • facade.kt是我的门面类,我不想混淆,所以客户可以使用它:

    package com.example.mylibrary class MyFacade(val internalClass:InternalClass) { fun doSomething() { internalClass.doSomething( firstArgument=1, secondArgument=2 ) } } 
  • 在这个例子中,internal.kt拥有我想混淆的类:

     package com.example.mylibrary class InternalClass { fun doSomething(firstArgument: Int, secondArgument: Int) { System.out.println("Arguments are : $firstArgument, $secondArgument") } } 

proguard规则被注入到gradle项目中,并释放这个闭包:

 buildTypes { release { minifyEnabled true proguardFiles 'proguard-rules.pro' } } 

这里是proguard-rules.pro (只有一行,没有更多):

 -keep class com.example.mylibrary.MyFacade {*;} 

结果是:当我./gradlew clean myLib:assembleRelease ,我得到了一个保留了我的外观的aar,而且我的内部类已经被重命名为'a',只有一个方法'a',除了类仍然用kotlin @Metadata注解,它保存有助于反编译器检索原始类名,方法,属性和参数名等的所有信息…因此,我的代码根本没有被模糊处理…

 @Metadata( mv = {1, 1, 7}, bv = {1, 0, 2}, k = 1, d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\b\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u0016\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u00062\u0006\u0010\u0007\u001a\u00020\u0006¨\u0006\b"}, d2 = {"Lcom/example/mylibrary/InternalClass;", "", "()V", "doSomething", "", "firstArgument", "", "secondArgument", "mylibrary_release"} ) public final class a { ... } 

所以我的问题是:是否有可能摆脱这些注释,我是唯一面临这个问题,还是我错过了什么?

Interesting Posts