| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- package com.narutohuo.xindazhou.launch
- import android.app.Application
- import com.alibaba.android.arouter.launcher.ARouter
- import com.narutohuo.xindazhou.auth.AuthManager
- import com.narutohuo.xindazhou.common.config.ServerConfigManager
- import com.narutohuo.xindazhou.common.network.ApiManager
- import com.narutohuo.xindazhou.common.version.VersionUpdateManager
- import com.narutohuo.xindazhou.core.log.ILog
- import com.narutohuo.xindazhou.core.storage.StorageImpl
- import com.narutohuo.xindazhou.push.PushKit
- import com.narutohuo.xindazhou.share.ShareKit
- /**
- * 应用初始化管理器
- *
- * 统一管理所有模块的初始化,简化 Application 代码
- *
- * 位置:app 模块(应用层)
- * 职责:协调所有层的初始化(base-core、base-common、capability-*)
- *
- * 使用方式:
- * ```kotlin
- * // 在 Application.onCreate() 中调用
- * AppInitializer.init(this)
- * ```
- */
- object AppInitializer {
-
- private const val TAG = "AppInitializer"
- private var initialized = false
-
- /**
- * 初始化所有模块
- *
- * 按顺序初始化各个模块,确保依赖关系正确
- *
- * @param application Application 实例
- */
- fun init(application: Application) {
- if (initialized) {
- ILog.w(TAG, "AppInitializer 已初始化,跳过重复初始化")
- return
- }
-
- try {
- // 1. 初始化日志系统(必须在其他初始化之前,因为其他模块可能依赖日志)
- initLogging(application)
-
- // 2. 初始化统一存储(必须在其他初始化之前,因为其他模块可能依赖存储)
- StorageImpl.init(application.applicationContext)
- ILog.d(TAG, "统一存储初始化完成")
-
- // 3. 初始化 ARouter(必须在其他初始化之前)
- initARouter(application)
-
- // 4. 初始化配置管理器(base-common)
- ServerConfigManager.init(application.applicationContext)
-
- // 5. 设置认证管理器上下文(懒加载模式,不立即初始化)
- // AuthManager 会在第一次使用时自动初始化,并统一配置所有认证相关模块:
- // - Network 模块的 Token Provider、刷新 Provider 和刷新失败回调
- // - SocketIO 模块的 Token 刷新 Provider 和登录状态检查 Provider
- AuthManager.setContext(application)
- ILog.d(TAG, "✅ 认证管理器上下文已设置(懒加载模式,统一管理所有认证相关配置)")
-
- // 7. 初始化版本更新管理器(base-common)
- VersionUpdateManager.init(application.applicationContext)
- ILog.d(TAG, "✅ 版本更新管理器初始化完成")
-
- // 8. SocketIO 管理器(capability-socketio,完全懒加载)
- // 注意:Token 刷新和登录状态检查的回调已在 AuthManager.setContext() 中统一配置
- ILog.d(TAG, "✅ SocketIO 管理器(完全懒加载,首次使用时自动初始化,Token 刷新配置已统一管理)")
-
- // 9. 初始化分享服务(capability-share,可选)
- initShareService(application)
-
- // 10. 推送服务已通过 Startup Library 自动初始化,无需手动调用
- // 如需自定义监听器,可以调用 PushKit.getInstance().setMessageListener()
- ILog.d(TAG, "✅ 推送服务已自动初始化(Startup Library)")
-
- initialized = true
- ILog.d(TAG, "所有模块初始化完成")
- } catch (e: Exception) {
- ILog.e(TAG, "初始化失败", e)
- throw e
- }
- }
-
- /**
- * 初始化日志系统
- *
- * 自动启动 LogcatViewer:通过 ActivityLifecycleCallbacks 在第一个 Activity resume 时自动启动
- */
- private fun initLogging(application: Application) {
- val isDebug = isDebugMode(application)
- // 传入 application,内部会自动注册 ActivityLifecycleCallbacks 来启动 LogcatViewer
- ILog.init(application, enableLogging = isDebug)
- ILog.d(TAG, "日志系统初始化完成(使用 LogcatViewer),将在 Activity 启动时自动显示悬浮按钮")
- }
-
- /**
- * 初始化 ARouter
- */
- private fun initARouter(application: Application) {
- val isDebug = isDebugMode(application)
- if (isDebug) {
- // 开启日志
- ARouter.openLog()
- // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
- ARouter.openDebug()
- }
- // 初始化 ARouter
- ARouter.init(application)
- ILog.d(TAG, "ARouter 初始化完成")
- }
-
- /**
- * 初始化分享服务
- *
- * app 模块直接依赖 capability-share,可以直接导入使用,不需要反射
- */
- private fun initShareService(application: Application) {
- try {
- ShareKit.init(application)
- ILog.d(TAG, "分享服务初始化成功")
- } catch (e: Exception) {
- // 分享服务初始化失败不影响应用运行,但分享功能将不可用
- ILog.e(TAG, "分享服务初始化失败,分享功能将不可用", e)
- }
- }
-
-
- /**
- * 获取是否为调试模式
- *
- * 安全地获取 BuildConfig.DEBUG,避免模块未引入时崩溃
- */
- private fun isDebugMode(application: Application): Boolean {
- return try {
- val buildConfigClass = Class.forName("${application.packageName}.BuildConfig")
- val debugField = buildConfigClass.getField("DEBUG")
- debugField.getBoolean(null)
- } catch (e: Exception) {
- ILog.e(TAG, "无法获取 BuildConfig.DEBUG,默认返回 false", e)
- false
- }
- }
- }
|