Сокращение Скалы с ProGuard - PullRequest
       9

Сокращение Скалы с ProGuard

0 голосов
/ 20 сентября 2018

, если коротко: я не могу сжать свои более сложные программы скалы с 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, поэтому я отказался от этого подхода

1 Ответ

0 голосов
/ 24 сентября 2018

Ошибка, которую я сделал, состояла в том, что я не включил java jar runtime от jdk

Вот градл с задающей задачей

import proguard.gradle.ProGuardTask

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'net.sf.proguard:proguard-gradle:6.0.3'
    }
}

plugins { ... }

version '1.0'

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\\" + project.name + "-" +  version + ".jar"
    outjars "$buildDir\\libs\\" + project.name + "-" +  version + "_shrunk" + ".jar"
}

А вот правила про-стражаinside proguard-rules.pro

-keep class app.** { *; }

#-dontoptimize
-dontobfuscate
#-dontnote
#-dontusemixedcaseclassnames
-ignorewarnings
-forceprocessing

-libraryjars  C:/Program Files/Java/jdk1.8.0_181/jre/lib/rt.jar
-libraryjars  C:/Program Files/Java/jdk1.8.0_181/jre/lib/ext/jfxrt.jar

Теперь я не получаю никаких предупреждений, и все прекрасно скомпилируется.

...