AppInitializer.kt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package com.narutohuo.xindazhou.launch
  2. import android.app.Application
  3. import com.alibaba.android.arouter.launcher.ARouter
  4. import com.narutohuo.xindazhou.auth.AuthManager
  5. import com.narutohuo.xindazhou.common.config.ServerConfigManager
  6. import com.narutohuo.xindazhou.common.network.ApiManager
  7. import com.narutohuo.xindazhou.common.version.VersionUpdateManager
  8. import com.narutohuo.xindazhou.core.log.ILog
  9. import com.narutohuo.xindazhou.core.storage.StorageImpl
  10. import com.narutohuo.xindazhou.push.PushKit
  11. import com.narutohuo.xindazhou.share.ShareKit
  12. /**
  13. * 应用初始化管理器
  14. *
  15. * 统一管理所有模块的初始化,简化 Application 代码
  16. *
  17. * 位置:app 模块(应用层)
  18. * 职责:协调所有层的初始化(base-core、base-common、capability-*)
  19. *
  20. * 使用方式:
  21. * ```kotlin
  22. * // 在 Application.onCreate() 中调用
  23. * AppInitializer.init(this)
  24. * ```
  25. */
  26. object AppInitializer {
  27. private const val TAG = "AppInitializer"
  28. private var initialized = false
  29. /**
  30. * 初始化所有模块
  31. *
  32. * 按顺序初始化各个模块,确保依赖关系正确
  33. *
  34. * @param application Application 实例
  35. */
  36. fun init(application: Application) {
  37. if (initialized) {
  38. ILog.w(TAG, "AppInitializer 已初始化,跳过重复初始化")
  39. return
  40. }
  41. try {
  42. // 1. 初始化日志系统(必须在其他初始化之前,因为其他模块可能依赖日志)
  43. initLogging(application)
  44. // 2. 初始化统一存储(必须在其他初始化之前,因为其他模块可能依赖存储)
  45. StorageImpl.init(application.applicationContext)
  46. ILog.d(TAG, "统一存储初始化完成")
  47. // 3. 初始化 ARouter(必须在其他初始化之前)
  48. initARouter(application)
  49. // 4. 初始化配置管理器(base-common)
  50. ServerConfigManager.init(application.applicationContext)
  51. // 5. 设置认证管理器上下文(懒加载模式,不立即初始化)
  52. // AuthManager 会在第一次使用时自动初始化,并统一配置所有认证相关模块:
  53. // - Network 模块的 Token Provider、刷新 Provider 和刷新失败回调
  54. // - SocketIO 模块的 Token 刷新 Provider 和登录状态检查 Provider
  55. AuthManager.setContext(application)
  56. ILog.d(TAG, "✅ 认证管理器上下文已设置(懒加载模式,统一管理所有认证相关配置)")
  57. // 7. 初始化版本更新管理器(base-common)
  58. VersionUpdateManager.init(application.applicationContext)
  59. ILog.d(TAG, "✅ 版本更新管理器初始化完成")
  60. // 8. SocketIO 管理器(capability-socketio,完全懒加载)
  61. // 注意:Token 刷新和登录状态检查的回调已在 AuthManager.setContext() 中统一配置
  62. ILog.d(TAG, "✅ SocketIO 管理器(完全懒加载,首次使用时自动初始化,Token 刷新配置已统一管理)")
  63. // 9. 初始化分享服务(capability-share,可选)
  64. initShareService(application)
  65. // 10. 推送服务已通过 Startup Library 自动初始化,无需手动调用
  66. // 如需自定义监听器,可以调用 PushKit.getInstance().setMessageListener()
  67. ILog.d(TAG, "✅ 推送服务已自动初始化(Startup Library)")
  68. initialized = true
  69. ILog.d(TAG, "所有模块初始化完成")
  70. } catch (e: Exception) {
  71. ILog.e(TAG, "初始化失败", e)
  72. throw e
  73. }
  74. }
  75. /**
  76. * 初始化日志系统
  77. *
  78. * 自动启动 LogcatViewer:通过 ActivityLifecycleCallbacks 在第一个 Activity resume 时自动启动
  79. */
  80. private fun initLogging(application: Application) {
  81. val isDebug = isDebugMode(application)
  82. // 传入 application,内部会自动注册 ActivityLifecycleCallbacks 来启动 LogcatViewer
  83. ILog.init(application, enableLogging = isDebug)
  84. ILog.d(TAG, "日志系统初始化完成(使用 LogcatViewer),将在 Activity 启动时自动显示悬浮按钮")
  85. }
  86. /**
  87. * 初始化 ARouter
  88. */
  89. private fun initARouter(application: Application) {
  90. val isDebug = isDebugMode(application)
  91. if (isDebug) {
  92. // 开启日志
  93. ARouter.openLog()
  94. // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
  95. ARouter.openDebug()
  96. }
  97. // 初始化 ARouter
  98. ARouter.init(application)
  99. ILog.d(TAG, "ARouter 初始化完成")
  100. }
  101. /**
  102. * 初始化分享服务
  103. *
  104. * app 模块直接依赖 capability-share,可以直接导入使用,不需要反射
  105. */
  106. private fun initShareService(application: Application) {
  107. try {
  108. ShareKit.init(application)
  109. ILog.d(TAG, "分享服务初始化成功")
  110. } catch (e: Exception) {
  111. // 分享服务初始化失败不影响应用运行,但分享功能将不可用
  112. ILog.e(TAG, "分享服务初始化失败,分享功能将不可用", e)
  113. }
  114. }
  115. /**
  116. * 获取是否为调试模式
  117. *
  118. * 安全地获取 BuildConfig.DEBUG,避免模块未引入时崩溃
  119. */
  120. private fun isDebugMode(application: Application): Boolean {
  121. return try {
  122. val buildConfigClass = Class.forName("${application.packageName}.BuildConfig")
  123. val debugField = buildConfigClass.getField("DEBUG")
  124. debugField.getBoolean(null)
  125. } catch (e: Exception) {
  126. ILog.e(TAG, "无法获取 BuildConfig.DEBUG,默认返回 false", e)
  127. false
  128. }
  129. }
  130. }