2017-09-14 52 views
3

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

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

+0

This sucks ...既然你已经删除了默认的Android?''proguardFiles'的pro'文件,我猜想,Kotlin Gradle插件会强制注释保持不变。您可能需要使用单独的Proguard通道从您的jar中删除这些通道, - Proguard只是Java库/ Ant任务,所以您可以声明classpath依赖关系,并自定义Gradle任务/ Android插件转换。 – user1643723

+0

@ user1643723感谢您的建议,我没有怀疑这可能来自kotlin-gradle插件,我会尝试分离的proguard调用技巧。 – AlexG

+0

我检查了这个解决方案,实际上注释被删除。 但是,这不是工业,我不得不重做我的proguard文件使其工作,并且我还没有尝试在运行时使用AAR ... – AlexG

回答

0

如果你正在打算被其他人使用的库项目,不要混淆和缩小项目,而是通过实施以下行提供消费者ProGuard的文件,为您的用户:

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

Source

在这个consumer-proguard-rules.pro,你与你的船库,你应该记住相应的更新,但永远记住的枚举和注解声明至少要保持,否则让消费者的getDefaultProguardFile('proguard-android.txt')照顾其余。

它去缩水相同的 - 你只应该真正关心确保所有必需的(在运行时)资源通过实施keep rules他们保持