build.gradle.kts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. plugins {
  2. id("com.android.application")
  3. // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
  4. id("dev.flutter.flutter-gradle-plugin")
  5. }
  6. android {
  7. namespace = "com.nonvioce.cal"
  8. compileSdk = flutter.compileSdkVersion
  9. compileOptions {
  10. sourceCompatibility = JavaVersion.VERSION_17
  11. targetCompatibility = JavaVersion.VERSION_17
  12. // Symja 使用 java.time(API 26 才有);minSdk 24 必须开 desugaring。
  13. // 注意:Ijs 在这一点上是错的(minSdk 24 却没开),这里顺手修掉。
  14. isCoreLibraryDesugaringEnabled = true
  15. }
  16. defaultConfig {
  17. applicationId = "com.nonvioce.cal"
  18. minSdk = 24
  19. targetSdk = flutter.targetSdkVersion
  20. versionCode = flutter.versionCode
  21. versionName = flutter.versionName
  22. // 光 Symja 就有约 42k 方法,必须 multiDex
  23. multiDexEnabled = true
  24. }
  25. buildTypes {
  26. release {
  27. // TODO: Add your own signing config for the release build.
  28. signingConfig = signingConfigs.getByName("debug")
  29. // 【真机实测的结论】不要对 Symja 开 R8 混淆。
  30. // Symja 及其依赖大量用「类名字符串」做反射创建,R8 看不到引用关系就会改名,
  31. // 运行时按原名找不到 -> 静态初始化直接炸。实测踩到两个:
  32. // 1. log4j2-android 的 com.celeral.android.logging.log4j.AndroidLoggerContextFactory
  33. // (由 system property "log4j2.loggerContextFactory" 指定)
  34. // 2. apfloat 的 org.apfloat.internal.LongBuilderFactory(由 "builderFactory" 属性指定)
  35. // -> F.<clinit> 抛 ExceptionInInitializerError
  36. // 官方的 Symja Android 参考工程 axkr/symja-example 同样不开 minify。
  37. // proguard-rules.pro 里的 -keep 规则保留着,将来若要重新开混淆可以从那里起步,
  38. // 但必须先在真机上回归。
  39. isMinifyEnabled = false
  40. isShrinkResources = false
  41. proguardFiles(
  42. getDefaultProguardFile("proguard-android-optimize.txt"),
  43. "proguard-rules.pro",
  44. )
  45. }
  46. }
  47. packaging {
  48. resources {
  49. excludes += setOf(
  50. "META-INF/DEPENDENCIES",
  51. "META-INF/LICENSE",
  52. "META-INF/LICENSE.txt",
  53. "META-INF/license.txt",
  54. "META-INF/NOTICE",
  55. "META-INF/NOTICE.txt",
  56. "META-INF/notice.txt",
  57. "META-INF/ASL2.0",
  58. "META-INF/*.kotlin_module",
  59. "Log4j2Plugins.dat",
  60. )
  61. pickFirsts += setOf(
  62. "**/*.xsd",
  63. )
  64. }
  65. }
  66. }
  67. kotlin {
  68. compilerOptions {
  69. jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
  70. }
  71. }
  72. dependencies {
  73. coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
  74. implementation("org.matheclipse:matheclipse-core:3.2.0")
  75. // log4j-api 在 Android 上需要一个实现,否则 Symja 的日志路径会抛错
  76. runtimeOnly("com.celeral:log4j2-android:1.0.0")
  77. // 用 Android 变体的 guava,避免 JRE 专属类(java.beans 等)
  78. implementation("com.google.guava:guava:33.5.0-android")
  79. // MCP 服务器用的内嵌 HTTP 服务器(JSON-RPC over HTTP)
  80. implementation("org.nanohttpd:nanohttpd:2.3.1")
  81. }
  82. configurations.all {
  83. resolutionStrategy {
  84. force("com.google.guava:guava:33.5.0-android")
  85. }
  86. }
  87. flutter {
  88. source = "../.."
  89. }