App.kt 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. package com.adealink.weparty
  2. import android.content.Context
  3. import android.content.SharedPreferences
  4. import android.content.res.Configuration
  5. import android.os.SystemClock
  6. import androidx.room.Room
  7. import com.adealink.frame.aab.AAB
  8. import com.adealink.frame.aab.util.getCompatString
  9. import com.adealink.frame.apm.initAPMService
  10. import com.adealink.frame.base.AppBase
  11. import com.adealink.frame.crash.installCrashProtector
  12. import com.adealink.frame.debug.datasource.performanceDataController
  13. import com.adealink.frame.debug.floatkit.floatKitManager
  14. import com.adealink.frame.deviceid.createDeviceIdService
  15. import com.adealink.frame.download.IDownloadService
  16. import com.adealink.frame.download.createDownloadService
  17. import com.adealink.frame.download.initDownloadService
  18. import com.adealink.frame.effect.IEffect
  19. import com.adealink.frame.effect.createEffect
  20. import com.adealink.frame.effect.initEffect
  21. import com.adealink.frame.googleservice.createGoogleService
  22. import com.adealink.frame.image.imageService
  23. import com.adealink.frame.imkit.IMService
  24. import com.adealink.frame.initStorageService
  25. import com.adealink.frame.locale.language.createLanguageManager
  26. import com.adealink.frame.log.Log
  27. import com.adealink.frame.log.XLogHelper
  28. import com.adealink.frame.log.manager.ILogService
  29. import com.adealink.frame.log.manager.LogService
  30. import com.adealink.frame.media.createMediaService
  31. import com.adealink.frame.network.INetworkService
  32. import com.adealink.frame.network.NetworkService
  33. import com.adealink.frame.oss.IOssService
  34. import com.adealink.frame.oss.alibaba.AliyunOssService
  35. import com.adealink.frame.oss.initOssService
  36. import com.adealink.frame.push.manager.pushService
  37. import com.adealink.frame.router.Router
  38. import com.adealink.frame.router.manager.deeplinkRouterManager
  39. import com.adealink.frame.security.createSecurityService
  40. import com.adealink.frame.share.initShareManager
  41. import com.adealink.frame.sound.createSoundPlayer
  42. import com.adealink.frame.startup.dispatcher.StartTaskDispatcher
  43. import com.adealink.frame.startup.task.MainThreadStartUpTask
  44. import com.adealink.frame.startup.task.StartUpTask
  45. import com.adealink.frame.startup.task.SubNoWaitStartUpTask
  46. import com.adealink.frame.startup.task.SubWaitStartUpTask
  47. import com.adealink.frame.statistics.report.initStat
  48. import com.adealink.frame.storage.file.logPath
  49. import com.adealink.frame.storageService
  50. import com.adealink.frame.tceffect.TCEffectManager
  51. import com.adealink.frame.util.ActivityLifecycleCallbacksExt
  52. import com.adealink.frame.util.AppUtil
  53. import com.adealink.frame.util.ScreenAutoSizeUtil
  54. import com.adealink.frame.util.registerNetworkReceiver
  55. import com.adealink.tcturing.TCTuringManager
  56. import com.adealink.weparty.aab.AABConfig
  57. import com.adealink.weparty.apm.APMConfig
  58. import com.adealink.weparty.apm.initAPM
  59. import com.adealink.weparty.base.AppBaseImpl
  60. import com.adealink.weparty.commonui.WEUI
  61. import com.adealink.weparty.commonui.widget.floatview.WindowManagerProxy
  62. import com.adealink.weparty.constant.TAG_TIME_APP_START
  63. import com.adealink.weparty.constant.TAG_TOO_LARGE_TOOL
  64. import com.adealink.weparty.constant.logTime
  65. import com.adealink.weparty.crash.CrashConfig
  66. import com.adealink.weparty.crash.initCrash
  67. import com.adealink.weparty.debug.Debug
  68. import com.adealink.weparty.debug.DebugPrefs
  69. import com.adealink.weparty.deeplink.DeepLinkConfig
  70. import com.adealink.weparty.deviceidservice.DeviceIdServiceConfig
  71. import com.adealink.weparty.deviceidservice.TCTuringConfig
  72. import com.adealink.weparty.download.DownloadConfig
  73. import com.adealink.weparty.effect.EffectConfig
  74. import com.adealink.weparty.effect.SVGA_CONFIG
  75. import com.adealink.weparty.effect.TCEffectConfig
  76. import com.adealink.weparty.googleservice.GoogleServiceConfig
  77. import com.adealink.weparty.hardware.HardwareManager
  78. import com.adealink.weparty.hardware.IHardwareManager
  79. import com.adealink.weparty.im.IMConfig
  80. import com.adealink.weparty.image.ImageConfig
  81. import com.adealink.weparty.locale.LanguageConfig
  82. import com.adealink.weparty.log.LogConfig
  83. import com.adealink.weparty.media.IMediaManager
  84. import com.adealink.weparty.media.MediaConfig
  85. import com.adealink.weparty.media.MediaManager
  86. import com.adealink.weparty.module.attribution.AttributionModule
  87. import com.adealink.weparty.module.call.CallModule
  88. import com.adealink.weparty.module.message.MessageModule
  89. import com.adealink.weparty.module.operation.OperationModule
  90. import com.adealink.weparty.network.INetworkManager
  91. import com.adealink.weparty.network.NetworkConfig
  92. import com.adealink.weparty.network.NetworkManager
  93. import com.adealink.weparty.oss.AliyunOssConfig
  94. import com.adealink.weparty.push.NotificationUtil
  95. import com.adealink.weparty.push.PushServiceConfig
  96. import com.adealink.weparty.router.RouterConfig
  97. import com.adealink.weparty.security.SecurityConfig
  98. import com.adealink.weparty.share.ShareConfig
  99. import com.adealink.weparty.sound.SoundPlayerConfig
  100. import com.adealink.weparty.stat.StatConfig
  101. import com.adealink.weparty.storage.config.StorageConfig
  102. import com.adealink.weparty.storage.db.AppDatabase
  103. import com.adealink.weparty.url.urlConfigService
  104. import com.adealink.weparty.webview.JSBridgeConfig
  105. import com.adealink.weparty.webview.WebResourceConfig
  106. import com.adealink.weparty.webview.jsbridge.manager.createJSBridgeManager
  107. import com.adealink.weparty.webview.jsbridge.manager.initJSBridgeManager
  108. import com.adealink.weparty.webview.loader.initWebResourceLoader
  109. import com.adealink.weparty.webview.payermax.PayerMaxHelper
  110. import com.facebook.FacebookSdk
  111. import com.facebook.LoggingBehavior
  112. import com.google.android.play.core.splitcompat.SplitCompatApplication
  113. import com.google.firebase.analytics.FirebaseAnalytics
  114. import com.google.firebase.analytics.FirebaseAnalytics.UserProperty.ALLOW_AD_PERSONALIZATION_SIGNALS
  115. import com.gu.toolargetool.DefaultFormatter
  116. import com.gu.toolargetool.Logger
  117. import com.gu.toolargetool.TooLargeTool
  118. import com.opensource.svgaplayer.control.SVGAManager
  119. import com.tencent.mars.xlog.Xlog
  120. import io.rong.imlib.model.InitOption
  121. /**
  122. * Created by sunxiaodong on 2021/3/25.
  123. * WARN: 启动路径代码使用Lambda,aab机制会导致部分机型启动崩溃
  124. */
  125. class App : SplitCompatApplication(), ActivityLifecycleCallbacksExt {
  126. companion object {
  127. lateinit var instance: App
  128. }
  129. val networkService: INetworkService by lazy { NetworkService.create(NetworkConfig()) }
  130. private val networkManager: INetworkManager by lazy { NetworkManager() }
  131. val ossService: IOssService by lazy { AliyunOssService.create(AliyunOssConfig()) }
  132. val downloadService: IDownloadService by lazy { createDownloadService(DownloadConfig()) }
  133. val effect: IEffect by lazy { createEffect(EffectConfig()) }
  134. val googleService by lazy { createGoogleService(GoogleServiceConfig()) }
  135. val deviceIdService by lazy { createDeviceIdService(DeviceIdServiceConfig()) }
  136. val jsBridgeManager by lazy { createJSBridgeManager(JSBridgeConfig()) }
  137. val mediaService by lazy { createMediaService(MediaConfig) }
  138. val mediaManager: IMediaManager by lazy { MediaManager() }
  139. val soundPlayer by lazy { createSoundPlayer(SoundPlayerConfig()) }
  140. val languageManager by lazy { createLanguageManager(LanguageConfig()) }
  141. val securityService by lazy { createSecurityService(SecurityConfig()) }
  142. val database by lazy {
  143. Room.databaseBuilder(applicationContext, AppDatabase::class.java, "weparty_app_db").build()
  144. }
  145. val logService: ILogService by lazy { LogService(LogConfig()) }
  146. val imService by lazy { IMService.create(IMConfig()) }
  147. val hardwareManager: IHardwareManager by lazy { HardwareManager() }
  148. var appStartTime = 0L
  149. override fun attachBaseContext(base: Context?) {
  150. logTime(TAG_TIME_APP_START, "app attachBaseContext start")
  151. instance = this
  152. AppBase.init(AppBaseImpl())
  153. AppUtil.init(this)
  154. super.attachBaseContext(base)
  155. appStartTime = SystemClock.elapsedRealtime()
  156. AppUtil.registerActivityLifecycleCallbacks(this)
  157. logTime(TAG_TIME_APP_START, "app attachBaseContext end")
  158. }
  159. override fun onCreate() {
  160. super.onCreate()
  161. val appOnCreateTs = SystemClock.elapsedRealtime()
  162. Log.i(TAG_TIME_APP_START, "app onCreate start")
  163. //基础任务
  164. baseStartTask()
  165. //APP并发初始化任务
  166. StartTaskDispatcher.create().apply {
  167. addAppStartTask(InitNetwork())
  168. addAppStartTask(InitPush())
  169. addAppStartTask(InitUI())
  170. addAppStartTask(InitTCEffect())
  171. addAppStartTask(InitSVGA())
  172. addAppStartTask(InitImageService())
  173. addAppStartTask(InitRouter())
  174. addAppStartTask(InitLanguage())
  175. addAppStartTask(InitSecurityService())
  176. addAppStartTask(InitGoogleService())
  177. addAppStartTask(InitStorageService())
  178. addAppStartTask(InitShareManager())
  179. addAppStartTask(InitOssService())
  180. addAppStartTask(InitJSBridgeManager())
  181. addAppStartTask(InitWebResourceLoader())
  182. addAppStartTask(InitDownloadService())
  183. addAppStartTask(InitEffect())
  184. addAppStartTask(InitFirebaseAnalytics())
  185. addAppStartTask(InitFB())
  186. addAppStartTask(InitPayerMax())
  187. addAppStartTask(InitIM())
  188. addAppStartTask(InitCall1())
  189. addAppStartTask(InitCall2())
  190. addAppStartTask(InitTCTuringManager())
  191. //其他子任务(不卡主流程)
  192. addAppStartTask(InitOther())
  193. if (!AppBase.isRelease) {
  194. addAppStartTask(InitDebugKit())
  195. }
  196. }.start().await()
  197. Log.i(TAG_TIME_APP_START, "app onCreate end, cost:${SystemClock.elapsedRealtime() - appOnCreateTs}")
  198. }
  199. /**
  200. * 所有模块最基础启动任务,必须执行完该任务才能执行其他启动任务
  201. * - 日志
  202. * - 组件/模块配置
  203. */
  204. private fun baseStartTask() {
  205. val startTs = SystemClock.elapsedRealtime()
  206. Log.i(TAG_TIME_APP_START, "baseStartTask start")
  207. initXLog()
  208. initAPMService(APMConfig())
  209. initAPM(this@App)
  210. initStat { StatConfig() }
  211. installCrashProtector(CrashConfig())
  212. initCrash(this@App) //依赖xlog,stat,crash protector
  213. AAB.init(AABConfig())
  214. Log.i(TAG_TIME_APP_START, "baseStartTask end, cost: ${SystemClock.elapsedRealtime() - startTs}")
  215. }
  216. private fun initXLog() {
  217. XLogHelper.initXLog(
  218. if (BuildConfig.OFFICIAL || BuildConfig.DEBUG) Xlog.LEVEL_ALL else Xlog.LEVEL_INFO,
  219. logPath,
  220. logPath,
  221. BuildConfig.DEBUG
  222. )
  223. Log.setLogConfig(LogConfig())
  224. }
  225. /**
  226. * APP初始化任务(阻塞主线程)
  227. */
  228. inner class InitPush : MainThreadStartUpTask() {
  229. override fun run() {
  230. pushService.init(PushServiceConfig())
  231. NotificationUtil.createNotificationChannel(getCompatString(R.string.channel_event))
  232. }
  233. }
  234. inner class InitUI : MainThreadStartUpTask() {
  235. override fun run() {
  236. //UI初始化
  237. WEUI.init(this@App)
  238. ScreenAutoSizeUtil.init(this@App, !AppBase.isRelease)
  239. WindowManagerProxy.init()
  240. }
  241. }
  242. inner class InitImageService : MainThreadStartUpTask() {
  243. override fun run() {
  244. imageService.init(ImageConfig())
  245. }
  246. override val dependsTaskList: List<Class<out StartUpTask>>
  247. get() = listOf(InitUI::class.java)
  248. }
  249. inner class InitTCEffect : SubWaitStartUpTask() {
  250. override fun run() {
  251. TCEffectManager.init(TCEffectConfig())
  252. }
  253. override val dependsTaskList: List<Class<out StartUpTask>>
  254. get() = listOf(InitUI::class.java)
  255. }
  256. inner class InitSVGA : SubWaitStartUpTask() {
  257. override fun run() {
  258. SVGAManager.init(this@App, SVGA_CONFIG)
  259. }
  260. override val dependsTaskList: List<Class<out StartUpTask>>
  261. get() = listOf(InitUI::class.java)
  262. }
  263. inner class InitRouter : SubWaitStartUpTask() {
  264. override fun run() {
  265. Router.config = RouterConfig()
  266. deeplinkRouterManager.init(DeepLinkConfig())
  267. }
  268. }
  269. inner class InitLanguage : SubWaitStartUpTask() {
  270. override fun run() {
  271. languageManager.init()
  272. }
  273. }
  274. inner class InitSecurityService : SubWaitStartUpTask() {
  275. override fun run() {
  276. securityService.init()
  277. }
  278. }
  279. inner class InitGoogleService : SubWaitStartUpTask() {
  280. override fun run() {
  281. googleService.init()
  282. }
  283. }
  284. inner class InitStorageService : SubWaitStartUpTask() {
  285. override fun run() {
  286. initStorageService(StorageConfig())
  287. }
  288. }
  289. inner class InitShareManager : SubWaitStartUpTask() {
  290. override fun run() {
  291. initShareManager(ShareConfig())
  292. }
  293. }
  294. inner class InitOssService : SubWaitStartUpTask() {
  295. override fun run() {
  296. initOssService { ossService }
  297. }
  298. }
  299. inner class InitJSBridgeManager : SubWaitStartUpTask() {
  300. override fun run() {
  301. initJSBridgeManager { jsBridgeManager }
  302. }
  303. }
  304. inner class InitWebResourceLoader : SubWaitStartUpTask() {
  305. override fun run() {
  306. initWebResourceLoader(WebResourceConfig())
  307. }
  308. override val dependsTaskList: List<Class<out StartUpTask>>
  309. get() = listOf(InitNetwork::class.java)
  310. }
  311. inner class InitDownloadService : SubWaitStartUpTask() {
  312. override fun run() {
  313. initDownloadService { downloadService }
  314. }
  315. override val dependsTaskList: List<Class<out StartUpTask>>
  316. get() = listOf(InitNetwork::class.java)
  317. }
  318. inner class InitEffect : SubWaitStartUpTask() {
  319. override fun run() {
  320. initEffect { effect }
  321. }
  322. }
  323. inner class InitFirebaseAnalytics : SubWaitStartUpTask() {
  324. override fun run() {
  325. val analytics = FirebaseAnalytics.getInstance(applicationContext)
  326. analytics.setUserProperty(ALLOW_AD_PERSONALIZATION_SIGNALS, "true")
  327. analytics.setAnalyticsCollectionEnabled(true)
  328. }
  329. }
  330. inner class InitFB : SubWaitStartUpTask() {
  331. override fun run() {
  332. if (!AppBase.isRelease) {
  333. FacebookSdk.setIsDebugEnabled(AppBase.isRelease)
  334. FacebookSdk.addLoggingBehavior(LoggingBehavior.APP_EVENTS)
  335. }
  336. }
  337. }
  338. inner class InitPayerMax : SubWaitStartUpTask() {
  339. override fun run() {
  340. PayerMaxHelper.init(this@App)
  341. }
  342. }
  343. inner class InitNetwork : SubWaitStartUpTask() {
  344. override fun run() {
  345. networkManager.init(this@App)
  346. registerNetworkReceiver()
  347. }
  348. }
  349. inner class InitIM : SubWaitStartUpTask() {
  350. override fun run() {
  351. imService.init(
  352. this@App,
  353. InitOption.Builder()
  354. .setAreaCode(
  355. when (AppBase.isProdEnv) {
  356. true -> InitOption.AreaCode.SG
  357. else -> InitOption.AreaCode.BJ
  358. }
  359. )
  360. .setMainProcess(true)
  361. .enablePush(false)
  362. .enableSyncEmptyTopConversation(true)
  363. .build()
  364. )
  365. MessageModule.appOnCreateMainTask(this@App)
  366. }
  367. }
  368. //1v1呼叫主线程
  369. inner class InitCall1 : SubWaitStartUpTask() {
  370. override val isRunOnMainThread: Boolean = true
  371. override fun run() {
  372. CallModule.appOnCreateMainTask(this@App)
  373. }
  374. }
  375. //1v1呼叫子线程
  376. inner class InitCall2 : SubWaitStartUpTask() {
  377. override fun run() {
  378. CallModule.appOnCreateSubTask(this@App)
  379. }
  380. override val dependsTaskList: List<Class<out StartUpTask>>
  381. get() = listOf(
  382. *super.dependsTaskList.toTypedArray(),
  383. InitCall1::class.java
  384. )
  385. }
  386. inner class InitTCTuringManager : SubWaitStartUpTask() {
  387. override fun run() {
  388. TCTuringManager.init(TCTuringConfig())
  389. }
  390. }
  391. inner class InitDebugKit : SubWaitStartUpTask() {
  392. override val isRunOnMainThread: Boolean = true
  393. override fun run() {
  394. if (AppBase.isRelease) {
  395. return
  396. }
  397. if (DebugPrefs.showPerformanceFloatView) {
  398. floatKitManager.install(this@App, true)
  399. floatKitManager.onMainIconDoubleClick = {
  400. AppUtil.currentActivity?.let {
  401. Router.build(it, Debug.Debug.PATH).start()
  402. }
  403. }
  404. performanceDataController.start()
  405. }
  406. TooLargeTool.startLogging(this@App, DefaultFormatter(), object : Logger {
  407. override fun log(msg: String) {
  408. Log.i(TAG_TOO_LARGE_TOOL, msg)
  409. }
  410. override fun logException(e: Exception) {
  411. Log.e(TAG_TOO_LARGE_TOOL, "logException", e)
  412. }
  413. })
  414. }
  415. }
  416. /**
  417. * 其他任务(非阻塞主线程)
  418. */
  419. inner class InitOther : SubNoWaitStartUpTask() {
  420. override fun run() {
  421. deviceIdService.updateDeviceId()
  422. networkService.fetchNetAntiBanConfig()
  423. urlConfigService.init()
  424. soundPlayer.prepare()
  425. AttributionModule.initialize()
  426. AttributionModule.start()
  427. AttributionModule.reportFirstOpen()
  428. OperationModule.init()
  429. }
  430. }
  431. override fun onTerminate() {
  432. super.onTerminate()
  433. Log.appenderClose()
  434. }
  435. override fun onConfigurationChanged(newConfig: Configuration) {
  436. super.onConfigurationChanged(newConfig)
  437. languageManager.onConfigurationChanged(newConfig)
  438. }
  439. override fun getSharedPreferences(name: String, mode: Int): SharedPreferences {
  440. if (name == "") {
  441. return super.getSharedPreferences(name, mode)
  442. }
  443. return storageService.hookSharedPreferences(
  444. name,
  445. mode,
  446. super.getSharedPreferences(name, mode)
  447. )
  448. }
  449. override fun onTrimMemory(level: Int) {
  450. super.onTrimMemory(level)
  451. imageService.onTrimMemory(level)
  452. }
  453. /**
  454. * 立即ping网络状态
  455. */
  456. fun pingNow() {
  457. networkManager.pingNow()
  458. }
  459. }