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 } } }