ProGuard 混淆和影子依赖

ProGuard Obufscation and Shadow Dependencies

我正在尝试使用 ProGuard 来混淆我的代码,然后使用输出的代码,使用 Shadow 将所需的依赖项添加到 JAR 中。

目前,我只是得到一个 -obf JAR 和一个 -all JAR。我需要的是一个带有混淆代码的 -all JAR。

import proguard.gradle.ProGuardTask

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'

buildscript {
  repositories {
    mavenCentral()
    jcenter()
  }

  dependencies {
    classpath group: 'net.sf.proguard', name: 'proguard-gradle', version: '5.3.1'
    classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: '1.2.4'
  }
}

repositories {
  mavenCentral()
  jcenter()
}

jar {
  manifest { attributes("Main-Class": "com.skcraft.launcher.Launcher") }
}

dependencies {
  compile 'org.projectlombok:lombok:1.12.2'
  compile 'com.fasterxml.jackson.core:jackson-databind:2.3.0'
  compile 'commons-lang:commons-lang:2.6'
  compile 'commons-io:commons-io:1.2'
  compile 'com.google.guava:guava:15.0'
  compile 'com.beust:jcommander:1.32'
  compile 'com.miglayout:miglayout:3.7.4'
  compile 'com.google.code.findbugs:jsr305:3.0.0'
  compile files ('libs/javax-crypto.jar')
}

processResources {
  filesMatching('**/*.properties') {
    filter {
      it.replace('${project.version}', project.version)
    }
  }
}

task obfuscate(type: proguard.gradle.ProGuardTask) {
  configuration '../proguard.txt'

  injars jar
  outjars "${buildDir}/libs/launcher-${version}-obf.jar"

  libraryjars files(configurations.compile.collect())
}

shadowJar {
  dependencies {
    exclude(dependency('org.projectlombok:lombok'))
  }
}

build.dependsOn(obfuscate)
build.dependsOn(shadowJar)

task wrapper(type: Wrapper) { gradleVersion = "3.1" }

有什么想法吗?我确实想出了一个想法,使用 shadowJar 然后混淆它,但是我需要配置我的 proguard.txt 只混淆我的代码。我试图在下面这样做,但它仍然试图混淆所有的包,抛出错误:

# Include java runtime classes
-libraryjars  <java.home>/lib/rt.jar

# Output a source map file
-printmapping proguard.map

# Keep filenames and line numbers
-keepattributes SourceFile, LineNumberTable

# Disable certain proguard optimizations which remove stackframes (same as Android defaults)
-optimizations !method/inlining/*

-keep public class * {
    public protected *;
}

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String, boolean);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class !com.skcraft.** { *; }

提前致谢

您需要删除以下规则:

-keep public class * {
    public protected *;
}

此规则隐式将保留除您自己的代码之外的所有内容:

-keep class !com.skcraft.** { *; }

它使用结束规则的排除模式 (!),这意味着与该模式不匹配的所有其他内容都会被保留。

我想通了,我想我会post这里的解决方案。

使用 Shadow 任务,我能够指定我希望它从中读取的文件:

shadowJar {
 from file("${buildDir}/libs/launcher-${version}-obf.jar")
 dependencies {
   exclude(dependency('org.projectlombok:lombok'))
 }
}

谢谢!