Java ProGuard Obufscation和阴影依赖
我试图使用ProGuard混淆我的代码,然后使用输出的代码,使用Shadow将所需的依赖项添加到JAR中 目前,我只得到一个Java ProGuard Obufscation和阴影依赖,java,gradle,proguard,Java,Gradle,Proguard,我试图使用ProGuard混淆我的代码,然后使用输出的代码,使用Shadow将所需的依赖项添加到JAR中 目前,我只得到一个-obfJAR和一个-allJAR。我需要的是一个带有模糊代码的-allJAR import proguard.gradle.ProGuardTask apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'java' buildscript { repositories { mavenC
-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.** { *; }
#包含java运行时类
-libraryjars/lib/rt.jar
#输出源映射文件
-printmapping proguard.map
#保留文件名和行号
-keepattributes源文件,LineNumberTable
#禁用某些删除stackframes的proguard优化(与Android默认设置相同)
-优化!方法/内联/*
-保持公开课*{
受公众保护*;
}
-keepclassmembernames类*{
java.lang.Class类$(java.lang.String);
java.lang.Class类$(java.lang.String,布尔值);
}
-KeepClassSwithMemberNames类*{
本地人;
}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
-上课!com.skcraft.*{*;}
提前感谢您需要删除以下规则:
-keep public class * {
public protected *;
}
此规则将隐式保留除您自己的代码之外的所有内容:
-keep class !com.skcraft.** { *; }
它使用了一个排除模式(
!
)来结束规则,这意味着所有与该模式不匹配的内容都将被保留。我想出来了,我想在这里发布解决方案
使用Shadow任务,我可以指定要从中读取的文件:
shadowJar {
from file("${buildDir}/libs/launcher-${version}-obf.jar")
dependencies {
exclude(dependency('org.projectlombok:lombok'))
}
}
谢谢 没有工作,它仍然试图修改所有文件,抛出错误。对不起,我误解了你的问题。您的模糊任务中有以下内容:
libraryjars文件(configurations.compile.collect())
,而如果您希望使用ProGuard将所有依赖项收集到单个uber jar中,则应将其更改为injars。此外,这个INJAR必须高于OUTJAR才能正常工作。你仍然有误解。我已经能够传入一个包含所有依赖项的JAR,我需要修改我的proguard配置,以便它完全忽略除代码之外的所有内容—在包com中。skcraft
id对我不起作用。我最初制作了一个模糊的薄jar,并将其作为参数传递到shadowjar中。但生成的jar没有任何模糊代码。您是否通过反编译fat jar来检查它是否对您有效?@wizneel Yes,“from”似乎不起作用,您找到解决方案了吗?这将只通过proguard运行您自己的类文件。如果你想混淆/优化一切,你必须切换顺序,并使用shadowJar作为proguard的injar。