, если коротко: я не могу сжать свои более сложные программы скалы с Proguard.Я думаю, что что-то упускаю, но в настоящее время я понятия не имею, что это может быть.
Моя текущая настройка использует файл build.gradle для сжатия моей скомпилированной фаст-фляги.
import proguard.gradle.ProGuardTask
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.2.1'
}
}
plugins {
id 'application'
id 'java'
id 'scala'
}
mainClassName = 'app.Main'
sourceCompatibility = 1.8
repositories {
...
}
dependencies {
...
}
jar {
manifest {
attributes(
'Class-Path': configurations.compileClasspath.files.collect {"$it.name"}.join(' '),
'Main-Class': 'app.Main'
)
}
from {
configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
task proguarding(type: ProGuardTask, dependsOn: jar) {
configuration 'proguard-rules.pro'
libraryjars files(configurations.compileClasspath.collect { it })
injars "$buildDir/libs/Main.jar"
outjars "$buildDir/libs/Shrunk.jar"
}
Это мои правила proguard в файле proguard-rules.pro
-keep class testing.** { *; }
-dontoptimize
-dontobfuscate
#-dontpreverify
#-dontnote
-ignorewarnings
-forceprocessing
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-dontwarn scala.**
-keep class !scala*.** { *; }
-dontwarn **$$anonfun$*
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keep class ... # imagine like 5-thousend different keep-rules I tried
-keepclassmembers class * {
** MODULE$;
}
Все программы / библиотеки, которые я пытался сжать до сих пор, не работали после сжатия.
Кромедля самой простой программы scala:
package main
import java.io._
object Main extends App {
val pw = new PrintWriter(new File("hello.txt" ))
pw.write("Hello, world")
pw.close()
}
Эта программа может быть уменьшена с 5,5 МБ до 432 КБ, но все остальное не будет работать и вместо этого выдает мне ошибки времени выполнения, такие как NullPointerExceptions или что-то в отношении стековой карты.
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 14
Exception Details:
Location:
generator/Main$.parameters()Lscalafx/application/JFXApp$Parameters; @4: ifne
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 2ab4 0010 9a00 0a2a b700 1ca7 0007 2ab4
0x0000010: 0011 b0
at generator.Main.main(Main.scala)
Я обнаружил, что эти проблемы возникли через опцию dontpreverify, но если я не использую "-dontpreverify", она даже не скомпилируется.
Без этой опции ProGuard не сможет найти суперклассы (точно так же, как этот парень )
Поэтому я перепробовал все варианты хранения, которые смог найти.Ни одно из найденных мной решений никоим образом не помогло.Если кто-то знает, в чем дело, помогите, пожалуйста, я в замешательстве.
Если кто-то знает другую усадку для файлов jar, которая на самом деле проста в использовании, пожалуйста, скажите мне.
Кстати,GUI был даже более запутанным, чем плагин gradle, поэтому я отказался от этого подхода