ryanw-mobile / OctoMeter

šŸ”„Kotlin Multiplatform Desktop/Android/iOS Energy Tracker app
Other
88 stars 8 forks source link

Fix desktop release builds #184

Closed ryanw-mobile closed 1 month ago

ryanw-mobile commented 1 month ago

We are distributing debug builds for Mac and Windows desktop installers without obfuscation or optimization. The file size is quite large.

If we suppress all the notes and warnings by ProGuard, the binary just does not run. It means there is something we must have to fix.

ProGuard, version 7.2.2
Note: duplicate definition of resource file [META-INF/MANIFEST.MF]
Note: duplicate definition of program class [androidx.compose.desktop.ui.tooling.preview.Preview]
Note: duplicate definition of resource file [META-INF/library.kotlin_module]
Note: duplicate definition of program class [module-info]
Note: duplicate definition of resource file [META-INF/MANIFEST.MF]
Note: duplicate definition of resource file [META-INF/AL2.0]
Note: duplicate definition of resource file [META-INF/LGPL2.1]
Note: duplicate definition of resource file [META-INF/LICENSE]
Note: duplicate definition of resource file [META-INF/MANIFEST.MF]
Note: duplicate definition of resource file [META-INF/AL2.0]
Note: duplicate definition of resource file [META-INF/LGPL2.1]
Note: duplicate definition of resource file [META-INF/LICENSE]
Note: duplicate definition of program class [com.sun.jna.AltCallingConvention]
Note: duplicate definition of program class [com.sun.jna.Callback$UncaughtExceptionHandler]
Note: duplicate definition of program class [com.sun.jna.Callback]
Note: duplicate definition of program class [com.sun.jna.CallbackParameterContext]
Note: duplicate definition of program class [com.sun.jna.CallbackProxy]
Note: duplicate definition of program class [com.sun.jna.CallbackReference$AttachOptions]
Note: duplicate definition of program class [com.sun.jna.CallbackReference$DefaultCallbackProxy]
Note: duplicate definition of program class [com.sun.jna.CallbackReference$NativeFunctionHandler]
Note: duplicate definition of program class [com.sun.jna.CallbackReference]
Note: duplicate definition of program class [com.sun.jna.CallbackResultContext]
Note: duplicate definition of program class [com.sun.jna.CallbackThreadInitializer]
Note: duplicate definition of program class [com.sun.jna.DefaultTypeMapper$Entry]
Note: duplicate definition of program class [com.sun.jna.DefaultTypeMapper]
Note: duplicate definition of program class [com.sun.jna.ELFAnalyser$1]
Note: duplicate definition of program class [com.sun.jna.ELFAnalyser$ArmAeabiAttributesTag$ParameterType]
Note: duplicate definition of program class [com.sun.jna.ELFAnalyser$ArmAeabiAttributesTag]
Note: duplicate definition of program class [com.sun.jna.ELFAnalyser$ELFSectionHeaderEntry]
Note: duplicate definition of program class [com.sun.jna.ELFAnalyser$ELFSectionHeaders]
Note: duplicate definition of program class [com.sun.jna.ELFAnalyser]
Note: duplicate definition of program class [com.sun.jna.FromNativeContext]
Note: duplicate definition of program class [com.sun.jna.FromNativeConverter]
Note: duplicate definition of program class [com.sun.jna.Function$NativeMappedArray]
Note: duplicate definition of program class [com.sun.jna.Function$PointerArray]
Note: duplicate definition of program class [com.sun.jna.Function$PostCallRead]
Note: duplicate definition of program class [com.sun.jna.Function]
Note: duplicate definition of program class [com.sun.jna.FunctionMapper]
Note: duplicate definition of program class [com.sun.jna.FunctionParameterContext]
Note: duplicate definition of program class [com.sun.jna.FunctionResultContext]
Note: duplicate definition of program class [com.sun.jna.IntegerType]
Note: duplicate definition of program class [com.sun.jna.InvocationMapper]
Note: duplicate definition of program class [com.sun.jna.JNIEnv]
Note: duplicate definition of program class [com.sun.jna.Klass]
Note: duplicate definition of program class [com.sun.jna.LastErrorException]
Note: duplicate definition of program class [com.sun.jna.Library$Handler$FunctionInfo]
Note: duplicate definition of program class [com.sun.jna.Library$Handler]
Note: duplicate definition of program class [com.sun.jna.Library]
Note: duplicate definition of program class [com.sun.jna.Memory$LinkedReference]
Note: duplicate definition of program class [com.sun.jna.Memory$SharedMemory]
Note: duplicate definition of program class [com.sun.jna.Memory]
Note: duplicate definition of program class [com.sun.jna.MethodParameterContext]
Note: duplicate definition of program class [com.sun.jna.MethodResultContext]
Note: duplicate definition of program class [com.sun.jna.Native$1]
Note: duplicate definition of program class [com.sun.jna.Native$2]
Note: duplicate definition of program class [com.sun.jna.Native$3]
Note: duplicate definition of program class [com.sun.jna.Native$4]
Note: duplicate definition of program class [com.sun.jna.Native$5]
Note: duplicate definition of program class [com.sun.jna.Native$6]
Note: duplicate definition of program class [com.sun.jna.Native$7]
Note: duplicate definition of program class [com.sun.jna.Native$AWT]
Note: duplicate definition of program class [com.sun.jna.Native$Buffers]
Note: duplicate definition of program class [com.sun.jna.Native$ffi_callback]
Note: duplicate definition of program class [com.sun.jna.Native]
Note: duplicate definition of program class [com.sun.jna.NativeLibrary$1]
Note: duplicate definition of program class [com.sun.jna.NativeLibrary$2]
Note: duplicate definition of program class [com.sun.jna.NativeLibrary]
Note: duplicate definition of program class [com.sun.jna.NativeLong]
Note: duplicate definition of program class [com.sun.jna.NativeMapped]
Note: duplicate definition of program class [com.sun.jna.NativeMappedConverter]
Note: duplicate definition of program class [com.sun.jna.NativeString$StringMemory]
Note: duplicate definition of program class [com.sun.jna.NativeString]
Note: duplicate definition of program class [com.sun.jna.Platform]
Note: duplicate definition of program class [com.sun.jna.Pointer$1]
Note: duplicate definition of program class [com.sun.jna.Pointer$Opaque]
Note: duplicate definition of program class [com.sun.jna.Pointer]
Note: duplicate definition of program class [com.sun.jna.PointerType]
Note: duplicate definition of program class [com.sun.jna.StringArray]
Note: duplicate definition of program class [com.sun.jna.Structure$1]
Note: duplicate definition of program class [com.sun.jna.Structure$2]
Note: duplicate definition of program class [com.sun.jna.Structure$3]
Note: duplicate definition of program class [com.sun.jna.Structure$AutoAllocated]
Note: duplicate definition of program class [com.sun.jna.Structure$ByReference]
Note: duplicate definition of program class [com.sun.jna.Structure$ByValue]
Note: duplicate definition of program class [com.sun.jna.Structure$FFIType$FFITypes]
Note: duplicate definition of program class [com.sun.jna.Structure$FFIType$size_t]
Note: duplicate definition of program class [com.sun.jna.Structure$FFIType]
Note: duplicate definition of program class [com.sun.jna.Structure$FieldOrder]
Note: duplicate definition of program class [com.sun.jna.Structure$LayoutInfo]
Note: duplicate definition of program class [com.sun.jna.Structure$NativeStringTracking]
Note: duplicate definition of program class [com.sun.jna.Structure$StructField]
Note: duplicate definition of program class [com.sun.jna.Structure$StructureSet]
Note: duplicate definition of program class [com.sun.jna.Structure]
Note: duplicate definition of program class [com.sun.jna.StructureReadContext]
Note: duplicate definition of program class [com.sun.jna.StructureWriteContext]
Note: duplicate definition of program class [com.sun.jna.ToNativeContext]
Note: duplicate definition of program class [com.sun.jna.ToNativeConverter]
Note: duplicate definition of program class [com.sun.jna.TypeConverter]
Note: duplicate definition of program class [com.sun.jna.TypeMapper]
Note: duplicate definition of program class [com.sun.jna.Union]
Note: duplicate definition of program class [com.sun.jna.VarArgsChecker$1]
Note: duplicate definition of program class [com.sun.jna.VarArgsChecker$NoVarArgsChecker]
Note: duplicate definition of program class [com.sun.jna.VarArgsChecker$RealVarArgsChecker]
Note: duplicate definition of program class [com.sun.jna.VarArgsChecker]
Note: duplicate definition of program class [com.sun.jna.Version]
Note: duplicate definition of program class [com.sun.jna.WString]
Note: duplicate definition of program class [com.sun.jna.WeakMemoryHolder]
Note: duplicate definition of resource file [com/sun/jna/aix-ppc/libjnidispatch.a]
Note: duplicate definition of resource file [com/sun/jna/aix-ppc64/libjnidispatch.a]
Note: duplicate definition of resource file [com/sun/jna/darwin-aarch64/libjnidispatch.jnilib]
Note: duplicate definition of resource file [com/sun/jna/darwin-x86-64/libjnidispatch.jnilib]
Note: duplicate definition of resource file [com/sun/jna/freebsd-x86-64/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/freebsd-x86/libjnidispatch.so]
Note: duplicate definition of program class [com.sun.jna.internal.ReflectionUtils]
Note: duplicate definition of resource file [com/sun/jna/linux-aarch64/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-arm/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-armel/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-mips64el/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-ppc/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-ppc64le/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-riscv64/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-s390x/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-x86-64/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/linux-x86/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/openbsd-x86-64/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/openbsd-x86/libjnidispatch.so]
Note: duplicate definition of program class [com.sun.jna.ptr.ByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.ByteByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.DoubleByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.FloatByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.IntByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.LongByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.NativeLongByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.PointerByReference]
Note: duplicate definition of program class [com.sun.jna.ptr.ShortByReference]
Note: duplicate definition of resource file [com/sun/jna/sunos-sparc/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/sunos-sparcv9/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/sunos-x86-64/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/sunos-x86/libjnidispatch.so]
Note: duplicate definition of resource file [com/sun/jna/win32-aarch64/jnidispatch.dll]
Note: duplicate definition of resource file [com/sun/jna/win32-x86-64/jnidispatch.dll]
Note: duplicate definition of resource file [com/sun/jna/win32-x86/jnidispatch.dll]
Note: duplicate definition of program class [com.sun.jna.win32.DLLCallback]
Note: duplicate definition of program class [com.sun.jna.win32.StdCall]
Note: duplicate definition of program class [com.sun.jna.win32.StdCallFunctionMapper]
Note: duplicate definition of program class [com.sun.jna.win32.StdCallLibrary$StdCallCallback]
Note: duplicate definition of program class [com.sun.jna.win32.StdCallLibrary]
Note: duplicate definition of program class [com.sun.jna.win32.W32APIFunctionMapper]
Note: duplicate definition of program class [com.sun.jna.win32.W32APIOptions$1]
Note: duplicate definition of program class [com.sun.jna.win32.W32APIOptions$2]
Note: duplicate definition of program class [com.sun.jna.win32.W32APIOptions]
Note: duplicate definition of program class [com.sun.jna.win32.W32APITypeMapper$1]
Note: duplicate definition of program class [com.sun.jna.win32.W32APITypeMapper$2]
Note: duplicate definition of program class [com.sun.jna.win32.W32APITypeMapper]
Note: duplicate definition of resource file [META-INF/MANIFEST.MF]
Note: there were 233 duplicate class definitions.
      (https://www.guardsquare.com/proguard/manual/troubleshooting#duplicateclass)
Note: androidx.lifecycle.ClassesInfoCache calls 'Method.getAnnotation'
Note: com.sun.jna.Structure calls 'Class.getAnnotation'
Note: com.sun.jna.platform.win32.COM.util.CallbackProxy calls 'Class.getAnnotation'
Note: com.sun.jna.platform.win32.COM.util.CallbackProxy calls 'Method.getAnnotation'
Note: com.sun.jna.platform.win32.COM.util.ObjectFactory calls 'Class.getAnnotation'
Note: com.sun.jna.platform.win32.COM.util.ProxyObject calls 'Method.getAnnotation'
Note: com.sun.jna.platform.win32.COM.util.ProxyObject calls 'Class.getAnnotation'
Note: de.jangassen.jfa.JavaToObjc calls 'Class.getAnnotation'
Note: kotlinx.serialization.internal.PlatformKt calls 'Class.getAnnotation'
Note: androidx.compose.ui.text.platform.ReflectionUtil$findAssignableField$result$1 calls 'Field.getType'
Note: com.sun.jna.Native calls 'Field.getType'
Note: com.sun.jna.Structure calls 'Field.getType'
Note: com.sun.jna.StructureReadContext calls 'Field.getType'
Note: kotlinx.serialization.internal.PlatformKt calls 'Field.getType'
Note: com.sun.jna.Native calls 'Class.getDeclaringClass'
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nullable
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nullable
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nullable
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nullable
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.Version: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: io.github.g00fy2.versioncompare.VersionComparator: can't find referenced class javax.annotation.Nonnull
Warning: org.slf4j.LoggerFactory: can't find referenced class org.slf4j.impl.StaticLoggerBinder
Warning: org.slf4j.LoggerFactory: can't find referenced class org.slf4j.impl.StaticLoggerBinder
Warning: org.slf4j.LoggerFactory: can't find referenced class org.slf4j.impl.StaticLoggerBinder
Warning: org.slf4j.LoggerFactory: can't find referenced class org.slf4j.impl.StaticLoggerBinder
Warning: org.slf4j.LoggerFactory: can't find referenced class org.slf4j.impl.StaticLoggerBinder
Warning: org.slf4j.MDC: can't find referenced class org.slf4j.impl.StaticMDCBinder
Warning: org.slf4j.MDC: can't find referenced class org.slf4j.impl.StaticMDCBinder
Warning: org.slf4j.MDC: can't find referenced class org.slf4j.impl.StaticMDCBinder
Warning: org.slf4j.MDC: can't find referenced class org.slf4j.impl.StaticMDCBinder
Warning: org.slf4j.MarkerFactory: can't find referenced class org.slf4j.impl.StaticMarkerBinder
Warning: org.slf4j.MarkerFactory: can't find referenced class org.slf4j.impl.StaticMarkerBinder
Warning: org.slf4j.MarkerFactory: can't find referenced class org.slf4j.impl.StaticMarkerBinder
Warning: org.slf4j.MarkerFactory: can't find referenced class org.slf4j.impl.StaticMarkerBinder
Note: androidx.lifecycle.viewmodel.internal.JvmViewModelProviders accesses a declared constructor '<init>()' dynamically
Note: androidx.savedstate.Recreator accesses a declared constructor '<init>()' dynamically
Note: androidx.savedstate.SavedStateRegistry accesses a declared constructor '<init>()' dynamically
Note: com.sun.jna.Klass accesses a declared constructor '<init>()' dynamically
Note: com.sun.jna.Native accesses a field 'OPTIONS' dynamically
Note: com.sun.jna.Structure accesses a constructor '<init>()' dynamically
Note: com.sun.jna.platform.WindowUtils$MacWindowUtils$1 accesses a method 'getPeer()' dynamically
Note: com.sun.jna.platform.WindowUtils$MacWindowUtils$1 accesses a method 'setAlpha(float)' dynamically
Note: com.sun.jna.platform.WindowUtils$X11WindowUtils accesses a method 'getVisual()' dynamically
Note: com.sun.jna.platform.win32.COM.util.Convert accesses a method 'values()' dynamically
Note: com.sun.jna.ptr.ByReference accesses a method 'getValue()' dynamically
Note: io.ktor.network.sockets.UnixSocketAddress accesses a method 'getPath()' dynamically
Note: kotlinx.serialization.internal.PlatformKt accesses a field 'INSTANCE' dynamically
Note: org.slf4j.helpers.SubstituteLogger accesses a method 'log(org.slf4j.event.LoggingEvent)' dynamically
Warning: there were 35 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (https://www.guardsquare.com/proguard/manual/troubleshooting#unresolvedclass)
Unexpected error
java.io.IOException: Please correct the above warnings first.
        at proguard.Initializer.execute(Initializer.java:544) ~[proguard-base-7.2.2.jar:7.2.2]
        at proguard.pass.PassRunner.run(PassRunner.java:24) ~[proguard-base-7.2.2.jar:7.2.2]
        at proguard.ProGuard.initialize(ProGuard.java:328) ~[proguard-base-7.2.2.jar:7.2.2]
        at proguard.ProGuard.execute(ProGuard.java:130) ~[proguard-base-7.2.2.jar:7.2.2]
        at proguard.ProGuard.main(ProGuard.java:623) [proguard-base-7.2.2.jar:7.2.2]
ryanw-mobile commented 1 month ago

Github Issue discussions related to Google and JetBrains are FUNNY to read:

https://github.com/Kotlin/kotlinx.coroutines/issues/4025 We don't do anything funny with our dispatcher factories, it's the standard Java mechanism

The documentation of obfuscation should mention Proguard -keep rules https://github.com/JetBrains/compose-multiplatform/issues/4288

FR: Add support for running R8 on JVM Desktop https://github.com/JetBrains/compose-multiplatform/issues/1604

JetBrains, come on!