我怎样才能模糊我用kotlin编码的sdk(并摆脱元数据)
我正在开发一个SDK(Android库),并且我必须混淆我的代码的大部分,因此客户可能不会尝试和玩内部代码。 我的库在kotlin中编码,我使用proguard来混淆代码。问题是编译和混淆后,代码中仍有@ kotlin.Metadata(运行时)注释。通过这些注释,检索产生这个“(非那么混乱)”字节码的java代码真的很容易。我怎样才能模糊我用kotlin编码的sdk(并摆脱元数据)
我首先认为这是我的错,我的项目有太多的熵源可能会导致这种行为,所以我做了一个示例项目来证明问题不是来自我的sdk实现。 我创建了作为一个新的项目,然后用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 {
...
}
所以我的问题:是否有可能摆脱那些注释,是我面临这个问题只有一个,或有我错过了什么?
如果你正在打算被其他人使用的库项目,不要混淆和缩小项目,而是通过实施以下行提供消费者ProGuard的文件,为您的用户:
android {
defaultConfig {
consumerProguardFiles 'consumer-proguard-rules.pro'
}
}
在这个consumer-proguard-rules.pro
,你与你的船库,你应该记住相应的更新,但永远记住的枚举和注解声明至少要保持,否则让消费者的getDefaultProguardFile('proguard-android.txt')
照顾其余。
它去缩水相同的 - 你只应该真正关心确保所有必需的(在运行时)资源通过实施keep rules他们保持。
This sucks ...既然你已经删除了默认的Android?''proguardFiles'的pro'文件,我猜想,Kotlin Gradle插件会强制注释保持不变。您可能需要使用单独的Proguard通道从您的jar中删除这些通道, - Proguard只是Java库/ Ant任务,所以您可以声明classpath依赖关系,并自定义Gradle任务/ Android插件转换。 – user1643723
@ user1643723感谢您的建议,我没有怀疑这可能来自kotlin-gradle插件,我会尝试分离的proguard调用技巧。 – AlexG
我检查了这个解决方案,实际上注释被删除。 但是,这不是工业,我不得不重做我的proguard文件使其工作,并且我还没有尝试在运行时使用AAR ... – AlexG