2017-09-14 50 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他們保持