| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- package com.adealink.weparty
- import android.content.Context
- import android.content.SharedPreferences
- import android.content.res.Configuration
- import android.graphics.Bitmap
- import android.os.SystemClock
- import androidx.room.Room
- import com.adealink.frame.aab.AAB
- import com.adealink.frame.aab.util.getCompatString
- import com.adealink.frame.apm.initAPMService
- import com.adealink.frame.base.AppBaseInfo
- import com.adealink.frame.coroutine.dispatcher.Dispatcher
- import com.adealink.frame.crash.installCrashProtector
- import com.adealink.frame.data.json.initJsonConfig
- import com.adealink.frame.debug.datasource.performanceDataController
- import com.adealink.frame.debug.floatkit.floatKitManager
- import com.adealink.frame.deviceid.createDeviceIdService
- import com.adealink.frame.download.IDownloadService
- import com.adealink.frame.download.createDownloadService
- import com.adealink.frame.download.initDownloadService
- import com.adealink.frame.effect.IEffect
- import com.adealink.frame.effect.createEffect
- import com.adealink.frame.effect.initEffect
- import com.adealink.frame.googleservice.createGoogleService
- import com.adealink.frame.image.imageService
- import com.adealink.frame.image.listener.IImageLoadResultListener
- import com.adealink.frame.initStorageService
- import com.adealink.frame.locale.language.createLanguageManager
- import com.adealink.frame.log.Log
- import com.adealink.frame.log.XLogHelper
- import com.adealink.frame.media.createMediaService
- import com.adealink.frame.network.INetworkService
- import com.adealink.frame.network.NetworkService
- import com.adealink.frame.oss.IOssService
- import com.adealink.frame.oss.alibaba.AliyunOssService
- import com.adealink.frame.oss.initOssService
- import com.adealink.frame.push.manager.pushService
- import com.adealink.frame.router.Router
- import com.adealink.frame.router.manager.deeplinkRouterManager
- import com.adealink.frame.security.createSecurityService
- import com.adealink.frame.share.initShareManager
- import com.adealink.frame.sound.createSoundPlayer
- import com.adealink.frame.statistics.report.initStat
- import com.adealink.frame.storageService
- import com.adealink.frame.tceffect.TCEffectManager
- import com.adealink.frame.util.ActivityLifecycleCallbacksExt
- import com.adealink.frame.util.AppUtil
- import com.adealink.frame.util.ScreenAutoSizeUtil
- import com.adealink.frame.util.registerNetworkReceiver
- import com.adealink.weparty.aab.AABConfig
- import com.adealink.weparty.apm.APMConfig
- import com.adealink.weparty.apm.initAPM
- import com.adealink.weparty.base.AppBaseConfig
- import com.adealink.weparty.commonui.WEUI
- import com.adealink.weparty.commonui.widget.floatview.WindowManagerProxy
- import com.adealink.weparty.constant.ProductFlavor
- import com.adealink.weparty.constant.TAG_TIME_APP_START
- import com.adealink.weparty.constant.TAG_TOO_LARGE_TOOL
- import com.adealink.weparty.constant.logTime
- import com.adealink.weparty.crash.CrashConfig
- import com.adealink.weparty.crash.initCrash
- import com.adealink.weparty.debug.Debug
- import com.adealink.weparty.debug.DebugPrefs
- import com.adealink.weparty.deeplink.DeepLinkConfig
- import com.adealink.weparty.deviceidservice.DeviceIdServiceConfig
- import com.adealink.weparty.download.DownloadConfig
- import com.adealink.weparty.effect.EffectConfig
- import com.adealink.weparty.effect.TCEffectConfig
- import com.adealink.weparty.googleservice.GoogleServiceConfig
- import com.adealink.weparty.image.ImageConfig
- import com.adealink.weparty.json.JsonConfig
- import com.adealink.weparty.locale.LanguageConfig
- import com.adealink.weparty.log.LogConfig
- import com.adealink.weparty.media.IMediaManager
- import com.adealink.weparty.media.MediaConfig
- import com.adealink.weparty.media.MediaManager
- import com.adealink.weparty.module.attribution.AttributionModule
- import com.adealink.weparty.module.call.CallModule
- import com.adealink.weparty.network.INetworkManager
- import com.adealink.weparty.network.NetworkConfig
- import com.adealink.weparty.network.NetworkManager
- import com.adealink.weparty.oss.AliyunOssConfig
- import com.adealink.weparty.push.NotificationUtil
- import com.adealink.weparty.push.PushServiceConfig
- import com.adealink.weparty.router.RouterConfig
- import com.adealink.weparty.security.SecurityConfig
- import com.adealink.weparty.share.ShareConfig
- import com.adealink.weparty.sound.SoundPlayerConfig
- import com.adealink.weparty.stat.StatConfig
- import com.adealink.weparty.storage.config.StorageConfig
- import com.adealink.weparty.storage.db.AppDatabase
- import com.adealink.weparty.storage.file.FilePath
- import com.adealink.weparty.webview.JSBridgeConfig
- import com.adealink.weparty.webview.WebResourceConfig
- import com.adealink.weparty.webview.jsbridge.manager.createJSBridgeManager
- import com.adealink.weparty.webview.jsbridge.manager.initJSBridgeManager
- import com.adealink.weparty.webview.loader.initWebResourceLoader
- import com.adealink.weparty.webview.payermax.PayerMaxHelper
- import com.facebook.FacebookSdk
- import com.facebook.LoggingBehavior
- import com.google.android.play.core.splitcompat.SplitCompatApplication
- import com.google.firebase.analytics.FirebaseAnalytics
- import com.google.firebase.analytics.FirebaseAnalytics.UserProperty.ALLOW_AD_PERSONALIZATION_SIGNALS
- import com.gu.toolargetool.DefaultFormatter
- import com.gu.toolargetool.Logger
- import com.gu.toolargetool.TooLargeTool
- import com.opensource.svgaplayer.control.SVGAManager
- import com.opensource.svgaplayer.control.SvgaConfig
- import com.opensource.svgaplayer.disk.DiskCacheParamsSupplier
- import com.opensource.svgaplayer.disk.DiskTrimStrategy
- import com.opensource.svgaplayer.executor.ExecutorsSupplier
- import com.opensource.svgaplayer.remote.ImageFetchCallback
- import com.opensource.svgaplayer.remote.ImageFetcher
- import com.opensource.svgaplayer.utils.ByteConstants
- import com.tencent.mars.xlog.Xlog
- import me.weishu.reflection.Reflection
- import java.io.File
- import java.util.concurrent.Executor
- import java.util.concurrent.TimeUnit
- /**
- * Created by sunxiaodong on 2021/3/25.
- * WARN: 启动路径代码使用Lambda,aab机制会导致部分机型启动崩溃
- */
- class App : SplitCompatApplication(), ActivityLifecycleCallbacksExt {
- companion object {
- lateinit var instance: App
- }
- val networkService: INetworkService by lazy { NetworkService.create(NetworkConfig()) }
- private val networkManager: INetworkManager by lazy { NetworkManager() }
- val ossService: IOssService by lazy { AliyunOssService.create(AliyunOssConfig()) }
- val downloadService: IDownloadService by lazy { createDownloadService(DownloadConfig()) }
- val effect: IEffect by lazy { createEffect(EffectConfig()) }
- val googleService by lazy { createGoogleService(GoogleServiceConfig()) }
- val deviceIdService by lazy { createDeviceIdService(DeviceIdServiceConfig()) }
- val jsBridgeManager by lazy { createJSBridgeManager(JSBridgeConfig()) }
- val mediaService by lazy { createMediaService(MediaConfig()) }
- val mediaManager: IMediaManager by lazy { MediaManager() }
- val soundPlayer by lazy { createSoundPlayer(SoundPlayerConfig()) }
- val languageManager by lazy { createLanguageManager(LanguageConfig()) }
- val securityService by lazy { createSecurityService(SecurityConfig()) }
- val database by lazy {
- Room.databaseBuilder(applicationContext, AppDatabase::class.java, "weparty_app_db").build()
- }
- var appStartTime = 0L
- override fun attachBaseContext(base: Context?) {
- logTime(TAG_TIME_APP_START, "app attachBaseContext start")
- instance = this
- AppBaseInfo.init(AppBaseConfig())
- AppUtil.init(this)
- super.attachBaseContext(base)
- try {
- Reflection.unseal(base)
- } catch (e: Throwable) {
- Log.e("App", "Reflection", e)
- }
- appStartTime = SystemClock.elapsedRealtime()
- AppUtil.registerActivityLifecycleCallbacks(this)
- logTime(TAG_TIME_APP_START, "app attachBaseContext end")
- }
- override fun onCreate() {
- super.onCreate()
- logTime(TAG_TIME_APP_START, "app onCreate start")
- initAPMService(APMConfig())
- securityService.init()
- initXLog()
- initStorageService(StorageConfig())
- installCrashProtector(CrashConfig())
- initJsonConfig(JsonConfig())
- initShareManager(ShareConfig())
- AAB.init(AABConfig())
- initStat { StatConfig() }
- initCrash(this) //依赖xlog,stat,crash protector
- googleService.init()
- initRouter()
- initLanguage()
- initNetwork()
- registerNetworkReceiver()
- imageService.init(ImageConfig())
- initOssService { ossService }
- initJSBridgeManager { jsBridgeManager }
- initWebResourceLoader(WebResourceConfig())
- initDownloadService { downloadService }
- initEffect { effect }
- WEUI.init(this)
- WindowManagerProxy.init()
- initTCEffect()
- initSVGA()
- initFirebaseAnalytics()
- initDeeplinkConfig()
- initPush()
- initFB()
- initPayerMax()
- initAPM(this)
- networkService.fetchNetAntiBanConfig()
- deviceIdService.updateDeviceId()
- initAttribution()
- initAutoSize()
- initDebugKit()
- soundPlayer.prepare()
- initTooLargeTool()
- logTime(TAG_TIME_APP_START, "app onCreate end")
- }
- private fun initTooLargeTool() {
- TooLargeTool.startLogging(this, DefaultFormatter(), object : Logger {
- override fun log(msg: String) {
- Log.i(TAG_TOO_LARGE_TOOL, msg)
- }
- override fun logException(e: Exception) {
- Log.e(TAG_TOO_LARGE_TOOL, "logException", e)
- }
- })
- }
- private fun initRouter() {
- Router.config = RouterConfig()
- }
- private fun initNetwork() {
- networkManager.init(this)
- }
- private fun initLanguage() {
- languageManager.init()
- }
- private fun initXLog() {
- XLogHelper.initXLog(
- if (BuildConfig.OFFICIAL || BuildConfig.DEBUG) Xlog.LEVEL_ALL else Xlog.LEVEL_INFO,
- FilePath.logPath,
- FilePath.logPath,
- BuildConfig.DEBUG
- )
- Log.setLogConfig(LogConfig())
- }
- private fun initTCEffect() {
- if (ProductFlavor.isCurrProductLite()) {
- //Lite目前不支持
- return
- }
- TCEffectManager.init(TCEffectConfig())
- }
- private fun initSVGA() {
- val config = SvgaConfig(
- diskCacheParamsSupplier = object : DiskCacheParamsSupplier {
- override fun getPath(): File = File(applicationContext.cacheDir, "svga")
- override fun getDiskTrimStrategy(): DiskTrimStrategy {
- return object : DiskTrimStrategy {
- override fun maxSize(): Long = ByteConstants.MB * 100L
- override fun timeExpired(): Long = TimeUnit.DAYS.toMillis(10)
- }
- }
- },
- executorsSupplier = object : ExecutorsSupplier {
- override fun getBackgroundExecutor(): Executor {
- return Dispatcher.wenextThreadPoolExecutor
- }
- override fun getIOExecutor(): Executor {
- return Dispatcher.wenextThreadPoolExecutor
- }
- override fun getNetWorkExecutor(): Executor {
- return Dispatcher.wenextThreadPoolExecutor
- }
- },
- debuggable = !AppBaseInfo.isRelease,
- imageFetcher = object : ImageFetcher {
- override fun fetchDynamicImage(
- url: String,
- forKey: String,
- callback: ImageFetchCallback?
- ) {
- imageService.fetchImage(url, object : IImageLoadResultListener {
- override fun onSuccess(bitmap: Bitmap) {
- super.onSuccess(bitmap)
- callback?.onFetched(bitmap, forKey)
- }
- override fun onFailed() {
- super.onFailed()
- callback?.onFailure(Exception("load image failed"), forKey)
- }
- override fun onCancel() {
- super.onCancel()
- callback?.onFailure(Exception("load image canceled"), forKey)
- }
- })
- }
- },
- designWidthPx = 750f,
- enableSvgaChecker = !AppBaseInfo.isRelease && DebugPrefs.enableSvgaChecker,
- enableShowSvgaCheckResult = !AppBaseInfo.isRelease && DebugPrefs.enableSvgaChecker && DebugPrefs.enableShowSvgaCheckResult
- )
- SVGAManager.init(applicationContext, config)
- }
- private fun initFirebaseAnalytics() {
- val analytics = FirebaseAnalytics.getInstance(applicationContext)
- analytics.setUserProperty(ALLOW_AD_PERSONALIZATION_SIGNALS, "true")
- analytics.setAnalyticsCollectionEnabled(true)
- }
- private fun initDeeplinkConfig() {
- deeplinkRouterManager.init(DeepLinkConfig())
- }
- private fun initAttribution() {
- AttributionModule.initialize()
- AttributionModule.start()
- AttributionModule.reportFirstOpen()
- }
- private fun initFB() {
- if (!AppBaseInfo.isRelease) {
- FacebookSdk.setIsDebugEnabled(AppBaseInfo.isRelease)
- FacebookSdk.addLoggingBehavior(LoggingBehavior.APP_EVENTS)
- }
- }
- private fun initPush() {
- pushService.init(PushServiceConfig())
- NotificationUtil.createNotificationChannel(getCompatString(R.string.channel_event))
- }
- private fun initPayerMax() {
- PayerMaxHelper.init(this)
- }
- private fun initAutoSize() {
- ScreenAutoSizeUtil.init(this, !AppBaseInfo.isRelease)
- }
- private fun initDebugKit() {
- if (BuildConfig.IS_RELEASE.not() && DebugPrefs.showPerformanceFloatView) {
- floatKitManager.install(this, true)
- floatKitManager.onMainIconDoubleClick = {
- AppUtil.currentActivity?.let {
- Router.build(it, Debug.Debug.PATH).start()
- }
- }
- performanceDataController.start()
- }
- }
- override fun onTerminate() {
- super.onTerminate()
- Log.appenderClose()
- }
- override fun onConfigurationChanged(newConfig: Configuration) {
- super.onConfigurationChanged(newConfig)
- languageManager.onConfigurationChanged(newConfig)
- }
- override fun onEnterForeGround() {
- super.onEnterForeGround()
- CallModule.stopKeepCallForeground()
- }
- override fun onEnterBackGround() {
- super.onEnterBackGround()
- CallModule.startKeepCallForeground()
- }
- override fun getSharedPreferences(name: String, mode: Int): SharedPreferences {
- return storageService.hookSharedPreferences(
- name,
- mode,
- super.getSharedPreferences(name, mode)
- )
- }
- override fun onTrimMemory(level: Int) {
- super.onTrimMemory(level)
- imageService.onTrimMemory(level)
- }
- }
|