360 apm框架Argus源码解析(1)——开始

APM 飞行模式切换--源码详解 APM飞控中有很多种方式可以改变飞行模式。其中最常见的为遥控器切换和地面站切换两种方式。 下面以遥控器切换为例详解飞行模式切换逻辑。 APM遥控器切换飞行模式的源代码在RC_Channel.cpp文件中的RC_Channel_Copter::do_aux_function_change_mode()函数中。 const bool success = copter.set_mode()调用Copter::set_mode()函数,在set_mode()函数中调用mode_fro... 阅读详情

开始

先看一个简单的代码示例,演示如何集成360 Argus APM:

public class ArgusAPMApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        boolean isUi = TextUtils.equals(getPackageName(), ProcessUtils.getCurrentProcessName());
        Config.ConfigBuilder builder = new Config.ConfigBuilder()
                .setAppContext(this)
                .setRuleRequest(new RuleSyncRequest())
                .setUpload(new CollectDataSyncUpload())
                .setAppName("apm_demo")
                .setAppVersion("1.0.0")
                .setApmid("apm_demo");//该ID是在APM的后台进行申请的

        //单进程应用可忽略builder.setDisabled相关配置。
        if (!isUi) { //除了“主进程”,其他进程不需要进行数据上报、清理等逻辑。“主进程”通常为常驻进行,如果无常驻进程,即为UI进程。
            builder.setDisabled(ApmTask.FLAG_DATA_CLEAN)
                    .setDisabled(ApmTask.FLAG_CLOUD_UPDATE)
                    .setDisabled(ApmTask.FLAG_DATA_UPLOAD)
                    .setDisabled(ApmTask.FLAG_COLLECT_ANR)
                    .setDisabled(ApmTask.FLAG_COLLECT_FILE_INFO);
        }
        //builder.setEnabled(ApmTask.FLAG_COLLECT_ACTIVITY_AOP); //activity采用aop方案时打开,默认关闭即可。
        builder.setEnabled(ApmTask.FLAG_LOCAL_DEBUG); //是否读取本地配置,默认关闭即可。
        Client.attach(builder.build());
        Client.isDebugOpen(false);//设置成true的时候将会打开悬浮窗
        Client.startWork();
    }

}

Config类对Argus进行一些基本的配置,其中IRuleRequest向云端请求规则,IUpload则对采集的数据进行上传。Client.startWork()会调用Manager.getInstance().startWork(),Manager.getInstance().startWork()又通过调用TaskManager.getInstance().startWorkTasks()。Manager.getInstance().startWork()的代码如下:

public void startWorkTasks() {
    if (taskMap == null) {
        LogX.d(Env.TAG, SUB_TAG, "taskMap is null ");
        return;
    }
    if (taskMap.get(ApmTask.TASK_ACTIVITY).isCanWork()) {
        // 云控为TaskConfig.ACTIVITY_TYPE_NONE,则本地开关优先
        int type = ArgusApmConfigManager.getInstance().getArgusApmConfigData().controlActivity;
        if (type == TaskConfig.ACTIVITY_TYPE_NONE) {
            if (Manager.getInstance().getConfig().isEnabled(ApmTask.FLAG_COLLECT_ACTIVITY_INSTRUMENTATION)) {
                LogX.o("activity local INSTRUMENTATION");
                InstrumentationHooker.doHook();
            } else {
                LogX.o("activity local aop");
            }
        } else if (type == TaskConfig.ACTIVITY_TYPE_INSTRUMENTATION) {
            LogX.o("activity cloud INSTRUMENTATION");
            InstrumentationHooker.doHook();
        } else {
            LogX.o("activity cloud type(" + type + ")");
        }

    }
    List<ITask> taskList = getAllTask();
    for (ITask task : taskList) {
        if (!task.isCanWork()) {
            continue;
        }
        if (DEBUG) {
            LogX.d(Env.TAG, SUB_TAG, "start task " + task.getTaskName());
        }
        task.start();
    }
}

taskMap是一个<String, ITask>类型的HashMap,通过TAskManager类中的registerTask方法将各种task(fps,activity等)添加到taskMap中。public void registerTask()被Manager.getInstance().init()调用,可上溯到Client.attach(builder.build())。startWorkTasks方法先判断是Activity任务是否可以work,如果可以,就从配置中获取Activity的收集方式,如果云控策略是TaskConfig.ACTIVITY_TYPE_NONE,那么就以本地的开关优先:如果本地配置了ApmTask.FLAG_COLLECT_ACTIVITY_INSTRUMENTATION,就以instrumentation方式收集,否则,以aop方式收集Activity数据。startWorkTasks()方法最后的for循环,逐个检查taskMap中的task是否可以work,如果可以,就调用task的方法start,开启任务。每种task都有自己的task()实现,后文会详细讨论。
我们先看一下InstrumentationHooker类的doHook()方法:

public static void doHook() {
    try {
        hookInstrumentation();
        isHookSucceed = true;
    } catch (Exception e) {
        if (DEBUG) {
            LogX.e(TAG, "InstrumentationHooker", e.toString());
        }
    }
}

doHook()方法会调用本类的hookInstrumentation()方法,如果调用成功,就把属性isHookSucceed设置成true。hookInstrumentation()的代码如下:

private static void hookInstrumentation() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {
    Class<?> c = Class.forName("android.app.ActivityThread");
    Method currentActivityThread = c.getDeclaredMethod("currentActivityThread");
    boolean acc = currentActivityThread.isAccessible();
    if (!acc) {
        currentActivityThread.setAccessible(true);
    }
    Object o = currentActivityThread.invoke(null);
    if (!acc) {
        currentActivityThread.setAccessible(acc);
    }
    Field f = c.getDeclaredField("mInstrumentation");
    acc = f.isAccessible();
    if (!acc) {
        f.setAccessible(true);
    }
    Instrumentation currentInstrumentation = (Instrumentation) f.get(o);
    Instrumentation ins = new ApmInstrumentation(currentInstrumentation);
    f.set(o, ins);
    if (!acc) {
        f.setAccessible(acc);
    }
}

hookInstrumentation()方法通过反射的方式获取当前ActivityThread的mInstrumentation属性的实例,返回给currentInstrumentation,并且用currentInstrumentation初始化一个ApmInstrumentation的实例ins,最后用ins的替换到当前ActivityThread中mInstrumentation的值,实现hook。ApmInstrumentation类的实现在后文详细分析。
Instrumentation方式是一种在运行期进行hook的方式。
Activity的另一种采集方式是AOP,在编译过程织入代码进行hook。后文详细分析。

Ardusub源码解析学习(一)——Ardusub主程序 Ardusub源码解析学习(一)前言一、准备工作二、Ardusub.cpp解析2.1 scheduler table2.2 get_scheduler_tasks()2.3 fast_loop()2.3.1 flight_mode.cpp2.3.2 control_stabilize.cpp2.3.3 AC_AttitudeControl.cpp三、总结 前言 最近因为课题项目需要,正在学习水下机器人的控制。水下机器人实际上就是一个用于水下的无人机系统(当然有些不严谨哈,这里特指ROV),内 阅读详情

相关推荐

Android代码-ArgusAPM

360开源又一力作——ArgusAPM移动性能监控平台 项目背景 ArgusAPM是360手机卫士客户端团队继RePlugin之后开源的又一个重量级开源项目。ArgusAPM是360移动端产品使用的可视化性能监控平台,为移动端APP提供性能监控与管理,可以迅速发现和定位各类APP性能和使用问题,帮助APP不断的提升用户体验。 产品价值 实时掌控应用性能 降低性能定位成本 有效提升用户体验 监控模块 ArgusAPM目前支持如下性能指标: 交互分析:分析Activity生命周期耗时,帮助提升页面打开速度,优化用户UI体验 网络请求分析:监控流量使用情况,发现并定位各种网络问题 内存分析:全面监控内存使用情况,降低内存占用 进程监控:针对多进程应用,统计进程启动情况,发现启动异常(耗电、存活率等) 文件监控:监控APP私有文件大小/变化,避免私有文件过大导致的卡顿、存储空间占用等问题 卡顿分析:监控并发现卡顿原因,代码堆栈精准定位问题,解决明显的卡顿体验 ANR分析:捕获ANR异常,解决APP的“未响应”问题 ArgusAPM特性 非侵入式 ​ 无需修改原有工程结构,无侵入

360 Argus APM 源码分析(2)—— argus-apm-gradle源码分析

argus-apm-gradle源码分析 argus-apm-gradle工程定义了一个gradle plugin,主要有以下两个作用: 支持AOP编程,方便ArgusAPM能够在编译期织入一些性能采集的代码; 通过Gradle插件来管理依赖库,使用户接入ArgusAPM更简单。 argus-apm-gradle使用kotlin语言开发。这里我们假定大家已经熟悉gradle plugin的开发...

hunter800421的专栏 1630

360ArgusAPM:奇虎360 Argus APM android sdk源代码解读

360ArgusAPM 奇虎360 Argus APM android sdk源代码解读

ANR及卡顿体验优化

性能优化:Android及卡顿体验优化

wzj_what_why_how的博客 1618

在abaqus中利用point-based 来快捷定义螺栓连接

abaqus中可以通过point-based方式定义连接点的位置,并对连接方式进行定义,可以进行螺栓连接的模拟。 可以通过逐点输入坐标或导入外部的坐标位置 也可以通过阵列的方式定义点 定义完点后就利用create fasteners,选择point-based,选取刚才创建好的点阵列,然后定义连接的属性,如下图 定义connector section时,类型选择translator,相当于只有1方向可以动,定义弹性模量以及破坏准则。 案例操作 假如有两个板,通过...

fiber_tape的博客 7340

高动态范围结构光三维测量技术:从多曝光融合到深度学习的演进与应用

本文深入探讨了高动态范围结构光三维测量技术的演进与应用,从传统的多曝光融合技术到深度学习驱动的创新方案。通过工业案例展示了该技术在提升测量精度和效率方面的显著优势,特别是在处理高反光、复杂表面时的突破性表现。文章还提供了针对不同工业场景的技术选型指南,帮助工程师优化三维测量解决方案。

weixin_29063979的博客 293

ArgusAPM 开源项目指南

**ArgusAPM** 是由360手机卫士团队开发的移动端性能监控平台,旨在帮助开发者实时监测和诊断应用程序的性能问题。这个开源项目是非侵入式的,允许开发者在不改变原有工程结构的情况下轻松接入,其特性包括UI性能、网络性能、内存、进程、文件、卡顿和ANR等多维度的监控,以提升用户体验。 ### 主要特点 - **非侵入式**:无须修改代码,低接入成本。 - **无性能损耗**:优化采集机制,...

gitblog_00233的博客 991

芯片设计中的“隐形杀手”:手把手教你理解并优化互连寄生参数(以SPEF/DSPF为例)

本文深入探讨了芯片设计中互连寄生参数的影响及优化策略,特别关注SPEF/DSPF文件解析与静态时序分析。通过实际案例展示了耦合电容对时序收敛的关键影响,并提供从定位到优化的完整解决方案,助力工程师应对先进工艺下的设计挑战。

weixin_30687051的博客 598

如何开发ATC_MiThermometer扩展功能:完整开发者指南

ATC_MiThermometer是一款针对小米温湿度计的开源固件项目,允许开发者自定义设备功能、优化性能并添加新特性。本指南将带你从环境搭建到功能调试,一步步掌握扩展开发的核心技能,即使是新手也能快速上手。 ## 准备开发环境:从克隆到编译 ### 1. 获取项目源码 首先需要克隆官方仓库到本地开发环境: ```bash git clone https://gitcode.com/gh_mi

gitblog_01147的博客 535

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 616

西门子S7-200 SMART与施耐德ATV变频器Modbus通讯实战:从接线到稳定运行的完整指南

本文详细介绍了西门子S7-200 SMART PLC与施耐德ATV变频器之间实现稳定Modbus通讯的完整实战指南。内容涵盖从硬件接线、参数配置、PLC程序编写到触摸屏设计的全流程,并分享了提升通讯稳定性的关键技巧和常见故障排查方法,助力工业自动化系统可靠运行。

kkk56的博客 1106

360Apm源码解析

360Apm 是什么? 如何收集卡顿(block)信息? 如何收集Okhttp信息? 如何收集帧(fps)信息? 如果收集Activity信息? 如果收集内存信息? 开源框架学习总结: 1.学到一些新的思路。 2.学到一些新的设计模式。 3.扩展知识面 4.学以致用,自己以后有其他的想法,会这个技术,就可以写开源框架。 ...

男儿不展风云志,空有天生八尺躯 1296

CATIA 3DEXPERIENCE R2019x VBA开发介绍

CATIA 3DEXPERIENCE R2019x VBA开发介绍 一、 什么是VBA? 【VBA的官方解释】 VBA(Visual Basic for Applications)是VisualBasic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是MicrosoftOffice软件。它也可说是一种应用程式视觉化的 Basic 脚本。 CATIA提供了多种二次开发的接口,其中包括自动化对象编程(Automation)和

WorkMan的博客 5063

360 Argus APM 源码分析(3)—— argus-apm-aop源码分析

argus-apm-aop源码分析 argus-apm-aop主要实现了面向Activity的切面和面向HttpClient和URLConnection的切片。阅读代码需要有AOP和aspectj的基础知识。 TraceActivity TraceActivity类实现对Activity(还有Application)的切面。 @Aspect public class TraceActivity...

hunter800421的专栏 911

UCIE Specification详解(十一)

Electrical Layer (2D and 2.5D)以及UCIe-3D

Crazzy_M的博客 1194

CAPL概述与环境搭建

CANoe和CANalyzer是Vector公司开发的两款用于汽车电子系统开发和测试的工具。CANoe主要用于网络开发、仿真和测试,而CANalyzer则主要用于网络分析和诊断。两者都支持CAPL脚本语言,可以用于编写复杂的测试脚本和仿真模型。CAPL Browser是CANoe/CANalyzer中用于编写、编辑和调试CAPL脚本的工具。它提供了一个集成的开发环境,支持语法高亮、代码自动补全、调试等功能。菜单栏:包含文件操作、编辑、编译、调试等功能。工具栏。

闲人编程的博客 1664

360 Argus APM 源码分析(4)—— argus-apm-okhttp源码分析

argus-apm-okhttp源码分析 OkHttp3Aspect类 OkHttp3Aspect类是OKHTTP3的切面文件。 @Aspect public class OkHttp3Aspect { @Pointcut("call(public okhttp3.OkHttpClient build())") public void build() { } ...

hunter800421的专栏 632

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ArgusAPM 源码解析与学习

ArgusAPM 移动性能监控平台是 360 开源的一款 APM 监测工具。 目前已经停止免费的服务端接入,但是对于我们从客户端的角度来搭建 监测还是有不错的学习参照意义。目前支持如下性能指标:本文也将围绕 总体框架和支持的功能点进行分析。项目分为三个目录,分别是:工程定义了一个名为 的 ,主要有以下两个作用:关于实现一个 的过程这里就不赘述了,下面看一下整体的框架。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vt1jfbtf-1655453421261)(https:/

m0_56255097的博客 919

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RuView 度量锁定的 PCK/MPJPE 精度评估框架(METRIC-LOCK,ADR-173)深度解析

**本文是 RuView 仓库中 [ADR-173: Metric-Locked PCK/MPJPE Accuracy Harness](https://link.gitcode.com/i/ff770c509e74b5dfd34f8dae6aaec247) 的技术解读与实战指南。** 该 ADR 描述了一项纯测量基础设施:一个将三种历史上互不可比的 PCK 定义显式化、可选化,并把“规范化方式”

gitblog_00228的博客 379

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

探索高效性能监控:ArgusAPM移动性能监控平台

在移动应用的开发与维护过程中,性能问题往往是影响用户体验的关键因素。360公司推出的ArgusAPM移动性能监控平台,正是为了解决这一痛点而生。本文将深入介绍ArgusAPM的核心功能、技术架构及其应用场景,帮助开发者更好地理解和利用这一强大的工具。 ## 项目介绍 ArgusAPM是360手机卫士客户端团队继RePlugin之后推出的又一开源力作。作为一个移动端产品的可视化性能监控平台,Ar...

gitblog_00026的博客 1155

Android apm监控框架,移动性能监控 SDK 详细集成文档

移动性能监控 SDK 详细集成文档一. Gradle配置在 Project 的 build.gradle 文件中添加ArgusAPM的相关配置,示例如下:在项目根目录的 build.gradle(注意:不是 app/build.gradle) 中添加以下配置:buildscript {repositories {jcenter()}dependencies {classpath 'com.andr...

weixin_34368102的博客 883

360重磅开源性能监控平台ArgusAPM

12月16日,在360移动性能开放日上,360手机卫士技术架构负责人卜云涛向我们介绍了360最新开源的性能监控平台ArgusAPM。ArgusAPM是360手机卫士客户端团队继RePlugin之后开源的又一个重量级开源项目。ArgusAPM是360移动端产品使用的可视化性能监控平台,为移动端APP提供性能监控与管理,可以迅速发现和定位各类APP性能和使用问题,帮助APP不断的提升用户体验。GitH...

cpongo5 1018

终极性能对比:Qwen3.6-35B-A3B-FP8与其他开源大模型的基准测试

Qwen3.6-35B-A3B-FP8是通义千问团队推出的最新一代开源大型语言模型,采用了先进的FP8量化技术和混合专家架构。这款模型在保持接近原始模型性能的同时,大幅降低了存储和推理成本,为开发者和研究者提供了高效的大语言模型解决方案。🔍 ## 📊 模型架构与技术创新 Qwen3.6-35B-A3B-FP8采用了创新的混合专家架构,拥有256个专家,每个token激活8个专家。模型支持长

gitblog_00051的博客 645

360 重磅开源性能监控平台 ArgusAPM

12 月 16 日,在 360 移动性能开放日上,360 手机卫士技术架构负责人卜云涛向我们介绍了 360 最新开源的性能监控平台 ArgusAPM。ArgusAPM 是 360 手机卫士客户端团队继 RePlugin 之后开源的又一个重量级开源项目。ArgusAPM 是 360 移动端产品使用的可视化性能监控平台,为移动端 APP 提供性能监控与管理,可以迅速发现和定位各类 APP 性能和使用问...

weixin_33816821的博客 693

卡顿监测 · 方案篇 · Android卡顿监测指导原则

什么是卡顿?Android5.0及以上系统中,如果主线程 + 渲染线程每一帧的执行都超过 16.6ms(60fps 的情况下),那么就可能会出现掉帧,这就是我们俗称的卡顿。什么是卡死?如果界面线程被阻塞超过几秒钟时间,那么用户可能会看到ANR对话框,这就是我们俗称的卡死。当测试提出卡顿问题,测试会新建Bug单给责任人处理。导致卡顿的原因有很多,比如函数非常耗时、I/O 非常慢、线程或锁间竞争等。随着移动端用户越来越注重产品体验,APM系统也逐渐成为互联网公司重要基础设施。

BASK2311的博客 2250

推荐:ArgusAPM - 移动性能监控的强大工具

ArgusAPM是由360手机卫士团队倾力打造的一款强大的移动性能监控平台,旨在协助开发者实时监测和管理APP性能,以提高用户的使用体验。这个开源项目已经在多个360产品中得到成功应用,包括手机卫士、清理大师等,现面向全球开发者开放。 ## 项目技术分析 ### 非侵入式设计 ArgusAPM的非侵入式设计允许您无需改动现有代码结构即可轻松接入,极大地降低了接入成本。 ### AOP与Gr...

gitblog_00072的博客 592
上一篇: Android多媒体框架(1)——MediaCodec.java源代码分析
下一篇: 360 Argus APM 源码分析(2)—— argus-apm-gradle源码分析
hunter800421
博客等级 码龄22年 60粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值