乐趣区

关于okhttp:Android网络请求监控与数据上报

Monitor-Network

基于 ServiceLoader,监控 Okhttp 网络申请,实现拦挡、解析、转发、存储、上报等性能。采纳组件化开发方式,各业务组件均可独自拆分应用,同时提供 export 对外调用组件,内部调用无需关怀外部实现,组件之间集成齐全解耦

Github 地址 > https://github.com/MannaYang/Monitor-Network

集成组件介绍

Components-stone

  • 提供根底依赖治理 build.gradle.kts(可批改依赖版本)
  • 提供 DataStore/Gson/RetrofitProvider 对外调用治理类(可替换)
  • 提供 NetworkInterceptor 全局拦截器(Okhttp Interceptor)(如需替换,需全局解决接口注解)
  • 提供 Application 生命周期散发治理,基于 @AutoService 注解生成并解耦 (
    如需替换,需全局解决接口注解)

Components-http-export

该组件为对外集成组件,可间接依赖

  • HttpDataResult.kt
    提供对外获取 Interceptor 拦截器解析实体 model
  • HttpInterceptorListener.kt
    提供对外转发实体 model 数据接口,可供下层业务获取网络申请数据并自定义解决,参考 app 组件模块[HttpInterceptor.kt]

Components-http

该组件是 http-export 外部业务实现组件,解决网络申请白名单、解析、转发等业务操作, 不可间接依赖,倡议下层 business 业务集成

  • HttpInterceptor.kt
    拦挡原始 okhttp 网络申请,并组装实体模型 HttpResult.kt
  • HttpResultParser.kt
    解析原始申请 header、body、formBody 并组合 [HttpDataResult] 模型
  • DispatchProvider.kt
    通过异步协程与 ServiceLoader 转发 http 解决实现的数据模型

Components-room-export

该组件为对外集成组件,可间接依赖

  • HttpDataEntity.kt
    数据库表映射关联实体模型,供内部组合数据并存储数据源,参考 app 组件 HttpInterceptor.kt
  • HttpDataManage.kt
    数据库对外操作接口,提供增删改查及自定义查问 sql 性能
  • QueryFilter.kt
    自定义查问过滤条件,参考 app 组件 MainActivity.kt

Components-room

该组件是 room-export 外部业务实现组件,提供 room database、table、dao 实现

  • HttpDataBaseLifecycle.kt
    生命周期内初始化 room 相干组件,获取 dao 操作实例
  • HttpDataDaoProvider.kt
    实体模型与 Table 表映射关系关联
  • HttpDataManage.kt
    数据库增删改查具体实现,关联 room-export 组件中[HttpDataManage.kt]

Components-report-export

该组件为对外集成组件,可间接依赖

  • WorkReport.kt
    对外开放业务查问过滤实体、业务上报平台辨别,关联 WorkManager-InputData 参数

Components-report

该组件是 report-export 外部业务实现组件,提供 WorkManager 后盾上报性能

  • dingtalk
    钉钉工作空间及鉴权服务与数据上报(仅作参考),具体实现可换为实际上报业务平台
  • markdown
    格式化上报报文(仅作参考),具体按理论业务要求解决
  • work
    解决数据上报及冗余数据处理(仅作参考),具体按理论业务要求解决

Components-app

下层业务集成组件壳,蕴含所有 export 及外部实现组件, 组装额定公共参数(用户信息、设施信息、利用信息)

kapt("com.google.auto.service:auto-service:1.1.1")
api("com.google.auto.service:auto-service-annotations:1.1.1")
implementation(project(":stone"))
implementation(project(":http"))
implementation(project(":http-export"))
implementation(project(":room"))
implementation(project(":room-export"))
implementation(project(":report"))
implementation(project(":report-export"))

具体调用办法在 [MainActivity.kt] 与[HttpInterceptor.kt],利用内 BaseApplication 应替换为我的项目理论应用类

应用阐明

我的项目中为了演示成果采纳钉钉上报,因而须要申请企业应用 AppKey/SecretKey/AgentId/ 进行鉴权以,通过以上 key 信息获取 UserIds 实现音讯推送告诉,
理论利用中举荐上报到日志中台或相干日志平台,作为全链路监控的一环

钉钉开放平台 > https://open.dingtalk.com/

gradle.properties
需配置以下内容, 关联影响鉴权办法地位 : DingRepository.kt

# Ding key config
dingAppKey=
dingSecretKey=
dingAgentId=
dingUsersId=

理论调用代码示例

DingProvider.kt

suspend fun reportWorkSpace(title: String, content: String, success: (Boolean) -> Unit) {
  ...
  ...
  ...
}

可自定义 DataServerProvider.kt,解决理论数据上报平台

suspend fun reportDataServer(title: String, content: String, success: (Boolean) -> Unit) {//do something}

suspend fun reportDataOther(title: String, content: String, success: (Boolean) -> Unit) {//do something}

演示成果截图 screenshot

ServiceLoader

基于 @AutoService 注解生成的 metadata 可在各自组件 build 目录查看,例如:

  • report/build/intermediates/java_res/debug/out/META_INF/services/*
  • report/build/intermediates/runtime_library_classes_dir/debug/META_INF/services/*
  • report/build/tmp/kapt3/classes/debug/META_INF.services

应用形式可参考各业务组件中含有 @AutoService class, 例如:

auto-service 官网文档地址 > https://github.com/google/auto/tree/main/service

Declaration Interface

/**
 * Define lifecycle methods what you want to use
 */
interface ApplicationLifecycle {

    /** Lifecycle onAttachBaseContext */
    fun onAttachBaseContext(context: Context)

    /** Lifecycle onCreate */
    fun onCreate(application: Application)

    /** marking priority,0 is highest priority,next is 1,2,3...100 ,you can custom it */
    fun priority(): Int}

Annotation Class

/**
 * Add google [@AutoService] annotation,to implementation it
 */
@AutoService(ApplicationLifecycle::class)
class ApplicationLifecycleProxy : ApplicationLifecycle {override fun onAttachBaseContext(context: Context) {//do somethings}

    override fun onCreate(application: Application) {
        //do somethings
        DataStoreProvider.initDataStore(application)
    }

    override fun priority(): Int {
        //in base application context,do somethings highest priority,so you should return 0
        return 0
    }
}

ServiceLoader.load

/**
 * With google auto-service,it will collect all @AutoService annotation class
 */
class ServiceLoaderProxy {

    private val loader: ServiceLoader<ApplicationLifecycle> by lazy {ServiceLoader.load(ApplicationLifecycle::class.java)
    }

    val lifecycleQueue by lazy {loader.sortedWith(compareBy { it.priority() }) }
}

援用三方库

  1. Google JetPacks > https://developer.android.com/jetpack
  2. Kotlin Coroutines > https://github.com/Kotlin/kotlinx.coroutines
  3. Retrofit & Okhttp > https://github.com/square/retrofit & https://github.com/square/okhttp
  4. Gson > https://github.com/google/gson
  5. auto-service > https://github.com/google/auto/tree/main/service
退出移动版