App.kt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. package com.adealink.weparty
  2. import android.content.Context
  3. import android.content.SharedPreferences
  4. import android.content.res.Configuration
  5. import android.graphics.Bitmap
  6. import android.os.SystemClock
  7. import androidx.room.Room
  8. import com.adealink.frame.aab.AAB
  9. import com.adealink.frame.aab.util.getCompatString
  10. import com.adealink.frame.apm.initAPMService
  11. import com.adealink.frame.base.AppBaseInfo
  12. import com.adealink.frame.coroutine.dispatcher.Dispatcher
  13. import com.adealink.frame.crash.installCrashProtector
  14. import com.adealink.frame.data.json.initJsonConfig
  15. import com.adealink.frame.debug.datasource.performanceDataController
  16. import com.adealink.frame.debug.floatkit.floatKitManager
  17. import com.adealink.frame.deviceid.createDeviceIdService
  18. import com.adealink.frame.download.IDownloadService
  19. import com.adealink.frame.download.createDownloadService
  20. import com.adealink.frame.download.initDownloadService
  21. import com.adealink.frame.effect.IEffect
  22. import com.adealink.frame.effect.createEffect
  23. import com.adealink.frame.effect.initEffect
  24. import com.adealink.frame.googleservice.createGoogleService
  25. import com.adealink.frame.image.imageService
  26. import com.adealink.frame.image.listener.IImageLoadResultListener
  27. import com.adealink.frame.initStorageService
  28. import com.adealink.frame.locale.language.createLanguageManager
  29. import com.adealink.frame.log.Log
  30. import com.adealink.frame.log.XLogHelper
  31. import com.adealink.frame.media.createMediaService
  32. import com.adealink.frame.network.INetworkService
  33. import com.adealink.frame.network.NetworkService
  34. import com.adealink.frame.oss.IOssService
  35. import com.adealink.frame.oss.alibaba.AliyunOssService
  36. import com.adealink.frame.oss.initOssService
  37. import com.adealink.frame.push.manager.pushService
  38. import com.adealink.frame.router.Router
  39. import com.adealink.frame.router.manager.deeplinkRouterManager
  40. import com.adealink.frame.security.createSecurityService
  41. import com.adealink.frame.share.initShareManager
  42. import com.adealink.frame.sound.createSoundPlayer
  43. import com.adealink.frame.statistics.report.initStat
  44. import com.adealink.frame.storageService
  45. import com.adealink.frame.tceffect.TCEffectManager
  46. import com.adealink.frame.util.ActivityLifecycleCallbacksExt
  47. import com.adealink.frame.util.AppUtil
  48. import com.adealink.frame.util.ScreenAutoSizeUtil
  49. import com.adealink.frame.util.registerNetworkReceiver
  50. import com.adealink.weparty.aab.AABConfig
  51. import com.adealink.weparty.apm.APMConfig
  52. import com.adealink.weparty.apm.initAPM
  53. import com.adealink.weparty.base.AppBaseConfig
  54. import com.adealink.weparty.commonui.WEUI
  55. import com.adealink.weparty.commonui.widget.floatview.WindowManagerProxy
  56. import com.adealink.weparty.constant.ProductFlavor
  57. import com.adealink.weparty.constant.TAG_TIME_APP_START
  58. import com.adealink.weparty.constant.TAG_TOO_LARGE_TOOL
  59. import com.adealink.weparty.constant.logTime
  60. import com.adealink.weparty.crash.CrashConfig
  61. import com.adealink.weparty.crash.initCrash
  62. import com.adealink.weparty.debug.Debug
  63. import com.adealink.weparty.debug.DebugPrefs
  64. import com.adealink.weparty.deeplink.DeepLinkConfig
  65. import com.adealink.weparty.deviceidservice.DeviceIdServiceConfig
  66. import com.adealink.weparty.download.DownloadConfig
  67. import com.adealink.weparty.effect.EffectConfig
  68. import com.adealink.weparty.effect.TCEffectConfig
  69. import com.adealink.weparty.googleservice.GoogleServiceConfig
  70. import com.adealink.weparty.image.ImageConfig
  71. import com.adealink.weparty.json.JsonConfig
  72. import com.adealink.weparty.locale.LanguageConfig
  73. import com.adealink.weparty.log.LogConfig
  74. import com.adealink.weparty.media.IMediaManager
  75. import com.adealink.weparty.media.MediaConfig
  76. import com.adealink.weparty.media.MediaManager
  77. import com.adealink.weparty.module.attribution.AttributionModule
  78. import com.adealink.weparty.module.call.CallModule
  79. import com.adealink.weparty.network.INetworkManager
  80. import com.adealink.weparty.network.NetworkConfig
  81. import com.adealink.weparty.network.NetworkManager
  82. import com.adealink.weparty.oss.AliyunOssConfig
  83. import com.adealink.weparty.push.NotificationUtil
  84. import com.adealink.weparty.push.PushServiceConfig
  85. import com.adealink.weparty.router.RouterConfig
  86. import com.adealink.weparty.security.SecurityConfig
  87. import com.adealink.weparty.share.ShareConfig
  88. import com.adealink.weparty.sound.SoundPlayerConfig
  89. import com.adealink.weparty.stat.StatConfig
  90. import com.adealink.weparty.storage.config.StorageConfig
  91. import com.adealink.weparty.storage.db.AppDatabase
  92. import com.adealink.weparty.storage.file.FilePath
  93. import com.adealink.weparty.webview.JSBridgeConfig
  94. import com.adealink.weparty.webview.WebResourceConfig
  95. import com.adealink.weparty.webview.jsbridge.manager.createJSBridgeManager
  96. import com.adealink.weparty.webview.jsbridge.manager.initJSBridgeManager
  97. import com.adealink.weparty.webview.loader.initWebResourceLoader
  98. import com.adealink.weparty.webview.payermax.PayerMaxHelper
  99. import com.facebook.FacebookSdk
  100. import com.facebook.LoggingBehavior
  101. import com.google.android.play.core.splitcompat.SplitCompatApplication
  102. import com.google.firebase.analytics.FirebaseAnalytics
  103. import com.google.firebase.analytics.FirebaseAnalytics.UserProperty.ALLOW_AD_PERSONALIZATION_SIGNALS
  104. import com.gu.toolargetool.DefaultFormatter
  105. import com.gu.toolargetool.Logger
  106. import com.gu.toolargetool.TooLargeTool
  107. import com.opensource.svgaplayer.control.SVGAManager
  108. import com.opensource.svgaplayer.control.SvgaConfig
  109. import com.opensource.svgaplayer.disk.DiskCacheParamsSupplier
  110. import com.opensource.svgaplayer.disk.DiskTrimStrategy
  111. import com.opensource.svgaplayer.executor.ExecutorsSupplier
  112. import com.opensource.svgaplayer.remote.ImageFetchCallback
  113. import com.opensource.svgaplayer.remote.ImageFetcher
  114. import com.opensource.svgaplayer.utils.ByteConstants
  115. import com.tencent.mars.xlog.Xlog
  116. import me.weishu.reflection.Reflection
  117. import java.io.File
  118. import java.util.concurrent.Executor
  119. import java.util.concurrent.TimeUnit
  120. /**
  121. * Created by sunxiaodong on 2021/3/25.
  122. * WARN: 启动路径代码使用Lambda,aab机制会导致部分机型启动崩溃
  123. */
  124. class App : SplitCompatApplication(), ActivityLifecycleCallbacksExt {
  125. companion object {
  126. lateinit var instance: App
  127. }
  128. val networkService: INetworkService by lazy { NetworkService.create(NetworkConfig()) }
  129. private val networkManager: INetworkManager by lazy { NetworkManager() }
  130. val ossService: IOssService by lazy { AliyunOssService.create(AliyunOssConfig()) }
  131. val downloadService: IDownloadService by lazy { createDownloadService(DownloadConfig()) }
  132. val effect: IEffect by lazy { createEffect(EffectConfig()) }
  133. val googleService by lazy { createGoogleService(GoogleServiceConfig()) }
  134. val deviceIdService by lazy { createDeviceIdService(DeviceIdServiceConfig()) }
  135. val jsBridgeManager by lazy { createJSBridgeManager(JSBridgeConfig()) }
  136. val mediaService by lazy { createMediaService(MediaConfig()) }
  137. val mediaManager: IMediaManager by lazy { MediaManager() }
  138. val soundPlayer by lazy { createSoundPlayer(SoundPlayerConfig()) }
  139. val languageManager by lazy { createLanguageManager(LanguageConfig()) }
  140. val securityService by lazy { createSecurityService(SecurityConfig()) }
  141. val database by lazy {
  142. Room.databaseBuilder(applicationContext, AppDatabase::class.java, "weparty_app_db").build()
  143. }
  144. var appStartTime = 0L
  145. override fun attachBaseContext(base: Context?) {
  146. logTime(TAG_TIME_APP_START, "app attachBaseContext start")
  147. instance = this
  148. AppBaseInfo.init(AppBaseConfig())
  149. AppUtil.init(this)
  150. super.attachBaseContext(base)
  151. try {
  152. Reflection.unseal(base)
  153. } catch (e: Throwable) {
  154. Log.e("App", "Reflection", e)
  155. }
  156. appStartTime = SystemClock.elapsedRealtime()
  157. AppUtil.registerActivityLifecycleCallbacks(this)
  158. logTime(TAG_TIME_APP_START, "app attachBaseContext end")
  159. }
  160. override fun onCreate() {
  161. super.onCreate()
  162. logTime(TAG_TIME_APP_START, "app onCreate start")
  163. initAPMService(APMConfig())
  164. securityService.init()
  165. initXLog()
  166. initStorageService(StorageConfig())
  167. installCrashProtector(CrashConfig())
  168. initJsonConfig(JsonConfig())
  169. initShareManager(ShareConfig())
  170. AAB.init(AABConfig())
  171. initStat { StatConfig() }
  172. initCrash(this) //依赖xlog,stat,crash protector
  173. googleService.init()
  174. initRouter()
  175. initLanguage()
  176. initNetwork()
  177. registerNetworkReceiver()
  178. imageService.init(ImageConfig())
  179. initOssService { ossService }
  180. initJSBridgeManager { jsBridgeManager }
  181. initWebResourceLoader(WebResourceConfig())
  182. initDownloadService { downloadService }
  183. initEffect { effect }
  184. WEUI.init(this)
  185. WindowManagerProxy.init()
  186. initTCEffect()
  187. initSVGA()
  188. initFirebaseAnalytics()
  189. initDeeplinkConfig()
  190. initPush()
  191. initFB()
  192. initPayerMax()
  193. initAPM(this)
  194. networkService.fetchNetAntiBanConfig()
  195. deviceIdService.updateDeviceId()
  196. initAttribution()
  197. initAutoSize()
  198. initDebugKit()
  199. soundPlayer.prepare()
  200. initTooLargeTool()
  201. logTime(TAG_TIME_APP_START, "app onCreate end")
  202. }
  203. private fun initTooLargeTool() {
  204. TooLargeTool.startLogging(this, DefaultFormatter(), object : Logger {
  205. override fun log(msg: String) {
  206. Log.i(TAG_TOO_LARGE_TOOL, msg)
  207. }
  208. override fun logException(e: Exception) {
  209. Log.e(TAG_TOO_LARGE_TOOL, "logException", e)
  210. }
  211. })
  212. }
  213. private fun initRouter() {
  214. Router.config = RouterConfig()
  215. }
  216. private fun initNetwork() {
  217. networkManager.init(this)
  218. }
  219. private fun initLanguage() {
  220. languageManager.init()
  221. }
  222. private fun initXLog() {
  223. XLogHelper.initXLog(
  224. if (BuildConfig.OFFICIAL || BuildConfig.DEBUG) Xlog.LEVEL_ALL else Xlog.LEVEL_INFO,
  225. FilePath.logPath,
  226. FilePath.logPath,
  227. BuildConfig.DEBUG
  228. )
  229. Log.setLogConfig(LogConfig())
  230. }
  231. private fun initTCEffect() {
  232. if (ProductFlavor.isCurrProductLite()) {
  233. //Lite目前不支持
  234. return
  235. }
  236. TCEffectManager.init(TCEffectConfig())
  237. }
  238. private fun initSVGA() {
  239. val config = SvgaConfig(
  240. diskCacheParamsSupplier = object : DiskCacheParamsSupplier {
  241. override fun getPath(): File = File(applicationContext.cacheDir, "svga")
  242. override fun getDiskTrimStrategy(): DiskTrimStrategy {
  243. return object : DiskTrimStrategy {
  244. override fun maxSize(): Long = ByteConstants.MB * 100L
  245. override fun timeExpired(): Long = TimeUnit.DAYS.toMillis(10)
  246. }
  247. }
  248. },
  249. executorsSupplier = object : ExecutorsSupplier {
  250. override fun getBackgroundExecutor(): Executor {
  251. return Dispatcher.wenextThreadPoolExecutor
  252. }
  253. override fun getIOExecutor(): Executor {
  254. return Dispatcher.wenextThreadPoolExecutor
  255. }
  256. override fun getNetWorkExecutor(): Executor {
  257. return Dispatcher.wenextThreadPoolExecutor
  258. }
  259. },
  260. debuggable = !AppBaseInfo.isRelease,
  261. imageFetcher = object : ImageFetcher {
  262. override fun fetchDynamicImage(
  263. url: String,
  264. forKey: String,
  265. callback: ImageFetchCallback?
  266. ) {
  267. imageService.fetchImage(url, object : IImageLoadResultListener {
  268. override fun onSuccess(bitmap: Bitmap) {
  269. super.onSuccess(bitmap)
  270. callback?.onFetched(bitmap, forKey)
  271. }
  272. override fun onFailed() {
  273. super.onFailed()
  274. callback?.onFailure(Exception("load image failed"), forKey)
  275. }
  276. override fun onCancel() {
  277. super.onCancel()
  278. callback?.onFailure(Exception("load image canceled"), forKey)
  279. }
  280. })
  281. }
  282. },
  283. designWidthPx = 750f,
  284. enableSvgaChecker = !AppBaseInfo.isRelease && DebugPrefs.enableSvgaChecker,
  285. enableShowSvgaCheckResult = !AppBaseInfo.isRelease && DebugPrefs.enableSvgaChecker && DebugPrefs.enableShowSvgaCheckResult
  286. )
  287. SVGAManager.init(applicationContext, config)
  288. }
  289. private fun initFirebaseAnalytics() {
  290. val analytics = FirebaseAnalytics.getInstance(applicationContext)
  291. analytics.setUserProperty(ALLOW_AD_PERSONALIZATION_SIGNALS, "true")
  292. analytics.setAnalyticsCollectionEnabled(true)
  293. }
  294. private fun initDeeplinkConfig() {
  295. deeplinkRouterManager.init(DeepLinkConfig())
  296. }
  297. private fun initAttribution() {
  298. AttributionModule.initialize()
  299. AttributionModule.start()
  300. AttributionModule.reportFirstOpen()
  301. }
  302. private fun initFB() {
  303. if (!AppBaseInfo.isRelease) {
  304. FacebookSdk.setIsDebugEnabled(AppBaseInfo.isRelease)
  305. FacebookSdk.addLoggingBehavior(LoggingBehavior.APP_EVENTS)
  306. }
  307. }
  308. private fun initPush() {
  309. pushService.init(PushServiceConfig())
  310. NotificationUtil.createNotificationChannel(getCompatString(R.string.channel_event))
  311. }
  312. private fun initPayerMax() {
  313. PayerMaxHelper.init(this)
  314. }
  315. private fun initAutoSize() {
  316. ScreenAutoSizeUtil.init(this, !AppBaseInfo.isRelease)
  317. }
  318. private fun initDebugKit() {
  319. if (BuildConfig.IS_RELEASE.not() && DebugPrefs.showPerformanceFloatView) {
  320. floatKitManager.install(this, true)
  321. floatKitManager.onMainIconDoubleClick = {
  322. AppUtil.currentActivity?.let {
  323. Router.build(it, Debug.Debug.PATH).start()
  324. }
  325. }
  326. performanceDataController.start()
  327. }
  328. }
  329. override fun onTerminate() {
  330. super.onTerminate()
  331. Log.appenderClose()
  332. }
  333. override fun onConfigurationChanged(newConfig: Configuration) {
  334. super.onConfigurationChanged(newConfig)
  335. languageManager.onConfigurationChanged(newConfig)
  336. }
  337. override fun onEnterForeGround() {
  338. super.onEnterForeGround()
  339. CallModule.stopKeepCallForeground()
  340. }
  341. override fun onEnterBackGround() {
  342. super.onEnterBackGround()
  343. CallModule.startKeepCallForeground()
  344. }
  345. override fun getSharedPreferences(name: String, mode: Int): SharedPreferences {
  346. return storageService.hookSharedPreferences(
  347. name,
  348. mode,
  349. super.getSharedPreferences(name, mode)
  350. )
  351. }
  352. override fun onTrimMemory(level: Int) {
  353. super.onTrimMemory(level)
  354. imageService.onTrimMemory(level)
  355. }
  356. }