首页 文章

如何模糊我用kotlin编码的sdk(并摆脱元数据)

提问于
浏览
19

我正在开发一个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 {
    ...
}

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

1 回答

  • 3

    如果要创建供其他人使用的库项目,请通过实现以下行为您的用户提供消费者ProGuard文件:

    android {
        defaultConfig {
            consumerProguardFiles 'consumer-proguard-rules.pro'
        }
    }
    

    Source

    在您随库提供的 consumer-proguard-rules.pro 中,您应该记得相应更新,但始终要记住至少要声明要保留的枚举和注释,否则让消费者的 getDefaultProguardFile('proguard-android.txt') 来处理其余的事情 .

    收缩也是一样的 - 你应该只关心通过为它们实现keep rules来确保所有需要(在运行时) resources are kept .

相关问题