Explorar el Código

Configure Proguard for mirai-core-all

Him188 hace 4 años
padre
commit
b7743307a7

+ 1 - 0
buildSrc/src/main/kotlin/Versions.kt

@@ -52,6 +52,7 @@ object Versions {
     const val kotlinIntellijPlugin = "203-1.4.30-release-IJ7148.5" // keep to newest as kotlinCompiler
     const val intellij = "2020.3.2" // don't update easily unless you want your disk space -= 500MB
 
+    const val proguard = "7.0.1"
 }
 
 @Suppress("unused")

+ 69 - 1
mirai-core-all/build.gradle.kts

@@ -9,6 +9,12 @@
 
 @file:Suppress("UnusedImport")
 
+buildscript {
+    dependencies {
+        classpath("com.guardsquare:proguard-gradle:${Versions.proguard}")
+    }
+}
+
 plugins {
     kotlin("jvm")
     kotlin("plugin.serialization")
@@ -26,4 +32,66 @@ dependencies {
     api(project(":mirai-core-utils"))
 }
 
-configurePublishing("mirai-core-all")
+configurePublishing("mirai-core-all")
+
+afterEvaluate {
+    tasks.register<proguard.gradle.ProGuardTask>("proguard") {
+        group = "mirai"
+        dependsOn("jar", "shadowJar")
+
+        verbose()
+
+        injars("build/libs/${project.name}-${project.version}-all.jar")
+
+        kotlin.runCatching {
+            file("build/libs/${project.name}-${project.version}-all-min.jar").delete()
+        }.exceptionOrNull()?.printStackTrace()
+        outjars("build/libs/${project.name}-${project.version}-all-min.jar")
+
+        val kotlinLibraries = kotlin.target.compilations["main"].compileDependencyFiles
+        //        .plus(kotlin.target.compilations["main"].runtimeDependencyFiles)
+
+        kotlinLibraries.distinctBy { it.normalize().name }.forEach { file ->
+            if (file.name.contains("-common")) return@forEach
+            if (file.name.contains("-metadata")) return@forEach
+            if (file.extension == "jar") libraryjars(file)
+        }
+
+        val javaHome = System.getProperty("java.home")
+        // Automatically handle the Java version of this build.
+        if (System.getProperty("java.version").startsWith("1.")) {
+            // Before Java 9, the runtime classes were packaged in a single jar file.
+            libraryjars("$javaHome/lib/rt.jar")
+        } else {
+            File(javaHome, "jmods").listFiles().orEmpty().forEach { file ->
+                libraryjars(
+                    mapOf(
+                        "jarfilter" to "!**.jar",
+                        "filter" to "!module-info.class"
+                    ), file
+                )
+            }
+//        // As of Java 9, the runtime classes are packaged in modular jmod files.
+//        libraryjars(
+//            // filters must be specified first, as a map
+//            mapOf("jarfilter" to "!**.jar",
+//                "filter" to "!module-info.class"),
+//            "$javaHome/jmods/java.base.jmod"
+//        )
+        }
+
+        configuration("mirai.pro")
+        configuration("kotlinx-serialization.pro")
+
+        dontobfuscate()
+        keep("""class net.mamoe.mirai.message.**""")
+        keep("""class net.mamoe.mirai.network.**""")
+        keep("""class net.mamoe.mirai.utils.**""")
+        keep("""class net.mamoe.mirai.contact.**""")
+        keep("""class net.mamoe.mirai.internal.message.**""")
+        keep("""class net.mamoe.mirai.internal.utils.**""")
+        keep("""class net.mamoe.mirai.internal.contact.**""")
+        // keepattributes("*Annotation*,synthetic")
+    }
+
+}

+ 24 - 0
mirai-core-all/kotlinx-serialization.pro

@@ -0,0 +1,24 @@
+-keepattributes RuntimeVisibleAnnotations, InnerClasses, RuntimeVisibleTypeAnnotations, AnnotationDefault, LocalVariableTypeTable, Signature
+-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations
+
+# kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer
+-keepclassmembers class kotlinx.serialization.json.** {
+    *** Companion;
+}
+-keepclasseswithmembers class kotlinx.serialization.json.** {
+    kotlinx.serialization.KSerializer serializer(...);
+}
+-keepclassmembers class ** extends java.lang.Enum {
+    static <fields>;
+}
+-keepnames class ** extends java.lang.Enum
+
+# Change here com.yourcompany.yourpackage
+-keep,includedescriptorclasses class net.mamoe.mirai.**$$serializer { *; } # <-- change package name to your app's
+-keepclassmembernames class net.mamoe.mirai.** { # <-- change package name to your app's
+    *** Companion;
+}
+-keepclassmembernames class net.mamoe.mirai.** { # <-- change package name to your app's
+    kotlinx.serialization.KSerializer serializer(...);
+    static kotlinx.serialization.KSerializer serializer(...);
+}

+ 22 - 0
mirai-core-all/mirai.pro

@@ -0,0 +1,22 @@
+-dontwarn
+#-keep @io.netty.channel.ChannelHandler.Sharable class **
+
+-keepclassmembernames class kotlinx.** {
+    volatile <fields>;
+}
+
+-keepclassmembernames class kotlin.coroutines.SafeContinuation {
+    volatile <fields>;
+}
+
+-keepclassmembernames class ** extends kotlinx.serialization.internal.GeneratedSerializer
+
+-keep enum ** {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+
+#-keep class ** extends kotlin.internal.**
+
+-keepnames class net.mamoe.mirai.Mirai
+-keepnames class net.mamoe.mirai.MiraiImpl