diff --git a/app/src/main/java/com/gh/common/util/LogUtils.java b/app/src/main/java/com/gh/common/util/LogUtils.java index b05f6b228d..569581cec3 100644 --- a/app/src/main/java/com/gh/common/util/LogUtils.java +++ b/app/src/main/java/com/gh/common/util/LogUtils.java @@ -16,7 +16,7 @@ import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.SpecialColumn; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.qa.entity.Questions; -import com.gh.loghub.LogHubUtils; +import com.gh.loghub.LoghubUtils; import com.halo.assistant.HaloApp; import com.lightgame.download.DownloadEntity; import com.lightgame.utils.Util_System_Phone_State; @@ -96,7 +96,7 @@ public class LogUtils { if (BuildConfig.DEBUG) { Utils.log("LogUtils->" + object.toString()); } - LogHubUtils.uploadLog(DeviceUtils.getIPAddress(context), object, "download_debug"); + LoghubUtils.log(object, "download_debug", false); } public static void uploadCommunityArticle(String tracers, String articleId, String articleTitle, int readTime, CommunityEntity community, SpecialColumn specialColumn) { @@ -301,7 +301,7 @@ public class LogUtils { } // 暂时除了曝光外的数据都是扔到 community 这个库的,要是不是这个这个库的话这里要改一下 - LogHubUtils.uploadLog(DeviceUtils.getIPAddress(context), object, "community"); + LoghubUtils.log(object, "community", true); } /** @@ -325,7 +325,7 @@ public class LogUtils { e.printStackTrace(); } - LogHubUtils.uploadLog(DeviceUtils.getIPAddress(context), object, "appointment"); + LoghubUtils.log(object, "appointment", false); } private static void uploadVideoStreaming(JSONObject object) { @@ -355,7 +355,8 @@ public class LogUtils { if (BuildConfig.DEBUG) { Utils.log("LogUtils->" + object.toString()); } - LogHubUtils.uploadLog(DeviceUtils.getIPAddress(context), object, "video_streaming"); + + LoghubUtils.log(object, "video_streaming", false); } public static void uploadVideoStreamingEnter(String entrance, String entranceDetail, String videoId, String streamingId) { diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index e5ee920755..78b1c6c89a 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -31,6 +31,7 @@ import com.gh.gamecenter.receiver.NetworkStateReceiver; import com.gh.gamecenter.receiver.UmengMessageReceiver; import com.gh.gamecenter.video.detail.CustomProxyCacheManager; import com.gh.gid.GidHelper; +import com.gh.loghub.LoghubUtils; import com.github.piasy.biv.BigImageViewer; import com.github.piasy.biv.loader.fresco.FrescoImageLoader; import com.leon.channel.helper.ChannelReaderUtil; @@ -149,6 +150,7 @@ public class HaloApp extends TinkerAppLike { BigImageViewer.initialize(FrescoImageLoader.with(getApplication())); ExposureManager.init(); + LoghubUtils.init(getApplication()); // 避免在华为设备上出现 `Register too many Broadcast Receivers` 异常,可见 https://github.com/llew2011/HuaWeiVerifier LoadedApkHuaWei.hookHuaWeiVerifier(getApplication()); diff --git a/libraries/LogHub/build.gradle b/libraries/LogHub/build.gradle index 048a59ea98..ab0589a40c 100644 --- a/libraries/LogHub/build.gradle +++ b/libraries/LogHub/build.gradle @@ -1,12 +1,23 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' // kotlin +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' dependencies { api fileTree(dir: 'libs', exclude: 'android-support-*.jar', include: '*.jar') + + implementation "androidx.room:room-runtime:$room" + kapt "androidx.room:room-compiler:$room" } android { defaultConfig { consumerProguardFiles 'proguard-library.txt' } + + androidExtensions { + experimental = true + } + buildToolsVersion '28.0.3' } \ No newline at end of file diff --git a/libraries/LogHub/src/main/java/com/gh/loghub/LogHubUtils.java b/libraries/LogHub/src/main/java/com/gh/loghub/LogHubUtils.java deleted file mode 100644 index 33ac198806..0000000000 --- a/libraries/LogHub/src/main/java/com/gh/loghub/LogHubUtils.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gh.loghub; - -import org.json.JSONObject; - -/** - * Created by khy on 2/01/18. - */ -public class LogHubUtils { - public static void uploadLog(String ip, JSONObject logJson, String logStore) { - LoghubHelper.getInstance().uploadLog(ip, logJson.toString(), logStore); - } -} diff --git a/libraries/LogHub/src/main/java/com/gh/loghub/LoghubDatabase.kt b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubDatabase.kt new file mode 100644 index 0000000000..3e716224d8 --- /dev/null +++ b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubDatabase.kt @@ -0,0 +1,21 @@ +package com.gh.loghub + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase + +@Database(entities = [LoghubEvent::class], version = 1, exportSchema = false) +abstract class LoghubDatabase : RoomDatabase() { + companion object { + private const val DATABASE = "gh_loghub_database" + + fun buildDatabase(context: Context): LoghubDatabase { + return Room.databaseBuilder(context, LoghubDatabase::class.java, DATABASE) + .fallbackToDestructiveMigration() + .build() + } + } + + abstract fun logHubEventDao(): LoghubEventDao +} \ No newline at end of file diff --git a/libraries/LogHub/src/main/java/com/gh/loghub/LoghubEvent.kt b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubEvent.kt new file mode 100644 index 0000000000..7452a36fba --- /dev/null +++ b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubEvent.kt @@ -0,0 +1,17 @@ +package com.gh.loghub + +import android.os.Parcelable +import androidx.annotation.Keep +import androidx.room.Entity +import androidx.room.PrimaryKey +import kotlinx.android.parcel.Parcelize +import java.util.* + +@Keep +@Parcelize +@Entity(tableName = "loghubEvent") +data class LoghubEvent(@PrimaryKey + val id: String = UUID.randomUUID().toString(), + var time: String, + var content: String, + var logStore: String) : Parcelable \ No newline at end of file diff --git a/libraries/LogHub/src/main/java/com/gh/loghub/LoghubEventDao.kt b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubEventDao.kt new file mode 100644 index 0000000000..92aa4b53ea --- /dev/null +++ b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubEventDao.kt @@ -0,0 +1,18 @@ +package com.gh.loghub + +import androidx.room.* + +@Dao +interface LoghubEventDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertMany(eventList: List) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(event: LoghubEvent) + + @Query("SELECT * FROM LoghubEvent") + fun getAll(): List + + @Delete + fun deleteMany(eventList: List) +} \ No newline at end of file diff --git a/libraries/LogHub/src/main/java/com/gh/loghub/LoghubUtils.kt b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubUtils.kt new file mode 100644 index 0000000000..4e6b659355 --- /dev/null +++ b/libraries/LogHub/src/main/java/com/gh/loghub/LoghubUtils.kt @@ -0,0 +1,84 @@ +package com.gh.loghub + +import android.app.Application +import com.aliyun.sls.android.sdk.model.Log +import com.aliyun.sls.android.sdk.model.LogGroup +import org.json.JSONObject +import java.util.concurrent.Executors +import kotlin.concurrent.fixedRateTimer + +object LoghubUtils { + + private const val STORE_SIZE = 100 + private const val STORE_FORCE_UPLOAD_INTERVAL = 120 * 1000L + + private lateinit var mApplication: Application + + private val loghubSet = hashSetOf() + private val loghubExecutor by lazy { Executors.newSingleThreadExecutor() } + private val loghubDao by lazy { LoghubDatabase.buildDatabase(mApplication).logHubEventDao() } + + @JvmStatic + fun init(application: Application) { + mApplication = application + + loghubExecutor.execute { + val eventList = loghubDao.getAll() + loghubSet.addAll(eventList) + } + + fixedRateTimer(name = "LoghubStore-Store-Checker", initialDelay = 500, period = STORE_FORCE_UPLOAD_INTERVAL) { + commitSavedLoghubEvents() + } + } + + @JvmStatic + fun log(logJson: JSONObject, logStore: String, forcedUpload: Boolean) { + loghubExecutor.execute { + try { + val event = LoghubEvent(time = (System.currentTimeMillis() / 1000L).toString(), content = logJson.toString(), logStore = logStore) + loghubSet.add(event) + loghubDao.insert(event) + } catch (e: Exception) { + e.printStackTrace() + } + + if (forcedUpload || loghubSet.size >= STORE_SIZE) { + commitSavedLoghubEvents() + } + } + } + + private fun uploadLogGroup(logGroup: LogGroup, logStore: String) { + LoghubHelper.getInstance().uploadLogGroup(logGroup, logStore) + } + + private fun commitSavedLoghubEvents() { + loghubExecutor.execute { + val exposureList = loghubSet.toList() + + createLogGroupAndUpload() + loghubDao.deleteMany(exposureList) + } + } + + private fun createLogGroupAndUpload() { + val logGroupHashMap = hashMapOf() + + for (event in loghubSet) { + if (!logGroupHashMap.containsKey(event.logStore)) { + logGroupHashMap[event.logStore] = LogGroup("sls android", "no ip") + } + + val log = Log() + log.PutContent("current time ", event.time) + log.PutContent("content", event.content) + logGroupHashMap[event.logStore]?.PutLog(log) + } + + for ((logStore, logGroup) in logGroupHashMap) { + uploadLogGroup(logGroup, logStore) + } + } + +} \ No newline at end of file