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 configdingAppKey=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() }) }}
援用三方库
- Google JetPacks > https://developer.android.com/jetpack
- Kotlin Coroutines > https://github.com/Kotlin/kotlinx.coroutines
- Retrofit & Okhttp > https://github.com/square/retrofit & https://github.com/square/okhttp
- Gson > https://github.com/google/gson
- auto-service > https://github.com/google/auto/tree/main/service