# ============================================================ # Symja 3.2.0 在 Android 上需要的 R8 规则 # 实测:不加这些规则,:app:minifyReleaseWithR8 会直接构建失败 # Missing class org.osgi.framework.ServiceReference # (referenced from org.apache.logging.log4j.util.OsgiServiceLocator.loadServices) # ============================================================ # ---- Android 上不存在的、被 log4j / Symja 引用的类 ---- -dontwarn java.awt.** -dontwarn java.beans.** -dontwarn javax.imageio.** -dontwarn javax.lang.model.** -dontwarn java.lang.management.** -dontwarn org.osgi.framework.** -dontwarn org.owasp.encoder.** -dontwarn org.apache.lucene.** # 实测第二轮 R8 又报的三个(Symja 的 @NotThreadSafe 注解、JAS 的 RMI、findbugs 注解) -dontwarn javax.annotation.concurrent.** -dontwarn edu.umd.cs.findbugs.annotations.** -dontwarn java.rmi.** # ---- log4j 反射加载 StackLocator,CalApplication 会去 patch 它 ---- -keep class org.apache.logging.log4j.util.StackLocator { *; } -keep class org.matheclipse.core.basic.AndroidLoggerFix { *; } # ---- log4j2-android 的 ContextFactory ---- # 【真机实测发现的坑】这个类是 log4j 通过 system property 里的【字符串】 # "log4j2.loggerContextFactory" 反射加载的,R8 看不到引用关系就会把它改名, # 于是运行时 ClassNotFoundException -> AbstractFunctionEvaluator. 抛 # ExceptionInInitializerError -> 整个 Symja 求值失败。 # 症状:JVM 上一切正常,release(minify) 包在真机上每次求值都返回 ExceptionInInitializerError。 -keep class com.celeral.android.logging.log4j.** { *; } # log4j 还会按名字加载若干 provider / context factory -keep class org.apache.logging.log4j.core.** { *; } -keep class org.apache.logging.log4j.spi.** { *; } -keep class org.apache.logging.log4j.message.** { *; } # ---- Symja 本体:保守起见整体保留 ---- # 调研显示 Symja 里 Class.forName 只出现在 AndroidLoggerFix 一处,理论上可混淆; # 但本机没有设备/模拟器(无 KVM),无法做真机回归,所以选择保守策略: # 保功能、不保体积。等设备上回归通过后再放开收缩。 -keep class org.matheclipse.core.** { *; } -keep class org.matheclipse.parser.** { *; } -keep class org.matheclipse.external.** { *; } -keep class edu.jas.** { *; } -keep class org.hipparchus.** { *; }