我正在開發一個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 {
...
}
所以我的問題:是否有可能擺脫那些註釋,是我面臨這個問題只有一個,或有我錯過了什麼?
This sucks ...既然你已經刪除了默認的Android?''proguardFiles'的pro'文件,我猜想,Kotlin Gradle插件會強制註釋保持不變。您可能需要使用單獨的Proguard通道從您的jar中刪除這些通道, - Proguard只是Java庫/ Ant任務,所以您可以聲明classpath依賴關係,並自定義Gradle任務/ Android插件轉換。 – user1643723
@ user1643723感謝您的建議,我沒有懷疑這可能來自kotlin-gradle插件,我會嘗試分離的proguard調用技巧。 – AlexG
我檢查了這個解決方案,實際上註釋被刪除。 但是,這不是工業,我不得不重做我的proguard文件使其工作,並且我還沒有嘗試在運行時使用AAR ... – AlexG