Ale*_*exG 22 android metadata proguard kotlin
我正在开发一个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
)
}
}
Run Code Online (Sandbox Code Playgroud)在这个示例中,internal.kt保存了我想要混淆的类:
package com.example.mylibrary
class InternalClass {
fun doSomething(firstArgument: Int, secondArgument: Int) {
System.out.println("Arguments are : $firstArgument, $secondArgument")
}
}
Run Code Online (Sandbox Code Playgroud)使用此版本闭包将proguard规则注入到gradle项目中:
buildTypes {
release {
minifyEnabled true
proguardFiles 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
这里是proguard-rules.pro(只有一行,仅此而已):
-keep class com.example.mylibrary.MyFacade {*;}
Run Code Online (Sandbox Code Playgroud)
结果:当我./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 {
...
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否有可能摆脱这些注释,我是唯一面临这个问题的人,还是我错过了什么?
最后我找到了删除Kotlin元数据注释的方法。
为了隐藏 Kotlin 元数据注释,您需要启用 R8 完整模式。
这是有关我的环境的信息。
环境
OS: macOS 10.15.1
Android Studio: 3.5.1
Gradle: 5.4.1
Android Gradle Tool: 3.5.2
Run Code Online (Sandbox Code Playgroud)
您所要做的只是添加gradle.properties如下属性
gradle.properties
android.enableR8.fullMode=true
Run Code Online (Sandbox Code Playgroud)
这是我的 Proguard 规则
proguard-rules.pro
-dontwarn kotlin.**
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
仅供参考,R8 完整模式现在仍在测试中,因此有时效果不佳。然而,对我来说,它现在工作得很好。
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |