android APM 实现手记

本文介绍了一个APM(应用性能管理)系统的实现方案,包括四个核心组成部分:apmlib、agent、gradleplugin和数据呈现。重点讲解了如何通过gradle插件实现代码字节码的修改,并给出了具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

APM(应用性能管理)实现关键点:

1,主要由4个子项目组成:

1), apm lib:作为agent,app的公共库,实现apm客户端的主要业务逻辑,如汇总,封装,发送;该库必须要在android编译环境下生成,然后对内部引用的第三方库做移包处理,解决被跟踪api的版本兼容问题。

2),agent:利用java规范提供的动态或静态插入代码的机制,实现对关键代码的hook,进而触发汇总,上报行为,常用修改字节码的库有javaassist,AMS,其中AMS可以做到编译时修改字节码,不增加额外函数,对应用性能影响很小,故推荐。

3),gradle plugin:android IDE主流是AS,内部主要采用gradle编译系统,在复杂的编译环境下时能自动实现修改字节码能力的最有效的做法是实现gradle插件

4),数据呈现:个人建议用ElasticStack + Kibana,  传输用JSON格式,后台开发成本则会低很多

2,gradle版本对hook函数方式有影响,另外混淆,multiDex, retrolambda也需要特殊处理

关键gradle plugin实现代码如下:

        project.configure(project, {
                    String agentArgs = System.getProperty("TypanyAPM.AgentArgs")
                    pluginExtension = project.extensions.create("typanyapm", TypanyAPMExtension.class)
                    typanyAPMTransform = new TypanyAPMTransform(project, pluginExtension, agentArgs)
                    if(project.hasProperty("android")) {
                        typanyAPMInstrumentTask = project.task(type:TypanyAPMInstrumentTask)
                        typanyAPMDeinstrumentTask = project.task(type:TypanyAPMDeinstrumentTask)
                        project.tasks.whenTaskAdded(  { task ->
                            def taskName = task.getName().toLowerCase()
                            if(taskName.startsWith("transformclasseswithdexbuilderfor") || taskName.startsWith("transformdexarchivewithdexmergerfor"))
                            {
                                if(!pluginExtension.shouldUseTransformApi()) {
                                    logger.warn("[typanyapm.info] Android Gradle plugin version 3.+ detected. Using transform API");
                                    return pluginExtension.setUseTransformApi(true)
                                }
                                return
                            }
                            if(taskName.startsWith("transformclasseswithdexfor") || taskName.startsWith("dex")) {
                                return configureInstrumentationTask(task)
                            }
                        } )
                        project.afterEvaluate( {
                            try
                            {
                                if (checkDexguard(project)) {
                                    logger.debug("[typanyapm.debug] Dexguard detected.");
                                }
                                if (checkRetrolambda(project)) {
                                    logger.debug("[typanyapm.debug] Retrolambda detected.");
                                }

                                configureMultidexTask(project)

                                return (pluginExtension.shouldUseTransformApi()) ? this.configureMapUploadTask(project) : null
                            }
                            catch (MissingPropertyException e) {
                                return logger.warn("[typanyapm.warn] Not supported for library builds. ", e);
                            }
                        } )
                        logger.debug("[typanyapm.debug] TransformAPI: registering TypanyAPMTransform(" + agentArgs + ")");
                        project.android.registerTransform(typanyAPMTransform)
                    }
                }
        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值