如何使用 Proguard 和 SBT 混淆胖 Scala Jar
How to obfuscate fat Scala Jar with Proguard and SBT
我设法混淆了我的 Scala 代码,但我不知道如何运行 混淆通过 sbt assembly
步骤构建的 jar 文件。或者至少如何在 proguard
步骤中构建一个 fat jar。我发现混淆器有一个 injar
参数,但我不知道如何将它应用到 build.sbt
。谁能指出我该怎么做。
UPD 实际上,由 Proguard 构建的 JAR 仅包含混淆的 classes 而不是来自那些被 Proguard 忽略的单个 class。
为了 运行 Proguard 混淆之前由 assembly
任务构建的 jar 文件,您应该覆盖 build.sbt 中的 inputs
设置:
proguardInputs in Proguard := Seq((assemblyOutputPath in assembly).value)
这会将您的 fat jar 指定为 Proguard 的单个输入。此外,您可能还想修改用于混淆的输入库。以下是如何排除所有库的示例:
proguardLibraries in Proguard := Seq()
最后禁用输入过滤器,因为你只有一个来源 类:
proguardInputFilter in Proguard := { file => None }
上面的设置是必需的,因为 Proguard 默认会排除 META-INF/MANIFEST.MF
文件。也不再需要合并步骤,因为 assembly
任务已经执行了此步骤:
proguardMerge in Proguard := false
最后将 assembly
依赖项添加到您的 Proguard 任务:
(ProguardKeys.proguard in Proguard) <<= (ProguardKeys.proguard in Proguard).dependsOn(assembly)
我设法混淆了我的 Scala 代码,但我不知道如何运行 混淆通过 sbt assembly
步骤构建的 jar 文件。或者至少如何在 proguard
步骤中构建一个 fat jar。我发现混淆器有一个 injar
参数,但我不知道如何将它应用到 build.sbt
。谁能指出我该怎么做。
UPD 实际上,由 Proguard 构建的 JAR 仅包含混淆的 classes 而不是来自那些被 Proguard 忽略的单个 class。
为了 运行 Proguard 混淆之前由 assembly
任务构建的 jar 文件,您应该覆盖 build.sbt 中的 inputs
设置:
proguardInputs in Proguard := Seq((assemblyOutputPath in assembly).value)
这会将您的 fat jar 指定为 Proguard 的单个输入。此外,您可能还想修改用于混淆的输入库。以下是如何排除所有库的示例:
proguardLibraries in Proguard := Seq()
最后禁用输入过滤器,因为你只有一个来源 类:
proguardInputFilter in Proguard := { file => None }
上面的设置是必需的,因为 Proguard 默认会排除 META-INF/MANIFEST.MF
文件。也不再需要合并步骤,因为 assembly
任务已经执行了此步骤:
proguardMerge in Proguard := false
最后将 assembly
依赖项添加到您的 Proguard 任务:
(ProguardKeys.proguard in Proguard) <<= (ProguardKeys.proguard in Proguard).dependsOn(assembly)