search
Homephp教程php手册一种基于动态插件系统的移动测试黑科技

一种基于动态插件系统的移动测试黑科技

百度MTC是业界领先的移动应用测试服务平台,为广大开发者在移动应用测试中面临的成本、技术和效率问题提供解决方案。同时分享行业领先的百度技术,作者来自百度员工和业界领袖等。

本文作者:hyxbiao & tony xin
作者Email:hyxbiao@gmail.com&&jiankangxin@gmail.com

背景

移动APP插件化是平台化产品解决系统限制(65535)、模块解耦、和多团队协作的利器。它的最大特点是模块动态下发,给产品带来的收益显而易见,但是,在百度,这套系统给移动端测试技术带来了新思路

移动端线上问题定位的几个场景:

  • 场景一: 云端用户反馈某功能不可用,RD猜测几种可能触发原因,线上收集的客户端打点日志信息不全,无法完全确认问题。陷入死循环,线上用户持续暴露问题,线下无法稳定复现,不能及时定位问题。如何破?

  • 场景二:通过客户端预埋方式打点用户行为,往往会出现打点不全的问题,而往往线上问题的定位需要这些行为日志为问题定位提供良好的复现步骤。 如何无需编码,通过技术手段获取全量用户与客户端交互日志?

  • 场景三:线下很多好工具可以SDK化,给线上问题发现和定位带来大量正向收益,但因为测试能力本身会影响集成app的性能,或开发团队排期等原因,无法集成,大量线上问题无法充分暴露。如何优美的解决这种问题?

  • 场景四:百度的线上客户端小流量实验表明,线上问题实际是一种正态分布的随机事件,TOP问题,往往只需抽样很少量用户即可召回,而不需要影响全量用户

移动端线下测试的几个场景:

  • 场景一: 客户端测试简单却又复杂,一个客户端测试人员的简单技能树可能包括这些问题的分析能力: ANR、crash、卡顿、内存泄露、内存、CPU占用、电量分析、启动速度分析等等一系列的技能。而往往,部分QA人员并不是全栈。并且这些工具的使用本身,就是一个工具大集合。如何让客户端测试人员,或非专业测试人员,无需任何背景,只需要点一点就可以具备全部客户端问题分析能力

  • 场景二:同刚才说的线上问题定位,线下大量的优秀功能,并不能适用于全量用户,因为他们本身就是伤敌八百,自伤一千的能力。如何在尽量小用户体验损耗的前提下,让问题尽量的全部召回?

一种移动端线上问题定位的新思路:

基于插件系统,做一个测试插件,把我们所有觉得有用的线下测试能力打进去,同时集成业内知名的好框架,譬如dexposed、 leakcanary等,还有一些系统开放了但是主版使用会影响性能的好东西traceviewer、Choreographer、ActivityLifecycleCallback等。统统打到云插件中,并通过云端已经构建好的动态模块小流量系统下发到特定目标用户手机中,持续暴露问题

NICE JOB!!

云插件工作原理:
云插件本身就是宿主的一个插件而已,真正能够发挥它的测试能力的是,线下构建的大量测试场景,以及插件本身的动态加载机制,这样我们的测试场景就可以在线上发挥它的效力了。提到这个就不得不新锅炒旧饭:

  • 双亲委托机制:java的类加载机制下,子classloader可以向上查找父classloader的加载内容,从而给云插件动态查找宿主各种类信息提供了先决条件(多进程化的插件系统。。请忽略我把)

  • dexclassloader:可以加载文件系统的任意JAR(包含dex文件)、zip、apk文件

  • patchclassloader: 只可以加载data/app/的apk文件,常用于多dex拆分项目

  • dexfile: 可以加载动态文件,同时提取文件内部的类信息,这个是dexclassloader不具备的

  • 破壳: 云插件自己的场景需要集成信息上传类,但在编译时,不能将对应类编译进插件包。这样场景插件在被加载起来以后,就可以回调宿主的日志系统进行信息采集了

经过如上,下图中的JAR或APK中包裹的场景插件就可以被云插件动态加载进来,同时对宿主的各种类、本地空间、以及系统中与宿主相关的信息进行读取、采集。至于是hook、反射、代码注入、异常捕获、插桩等这些只是一种手段了

实例:

注意: 下面的case,虽然说的是云插件的问题定位场景,但是不止云插件,我们后面会以SDK形式开源这部分技术,所以,集成了这个SDK的app也可以这么干,但是脱离了插件系统,本身的安全性,需要集成的开发者关注自己的安全性。 当然也可以不关注,root的手机上,你的app本身就已经全部暴露给了黑客(BLESS…)

正文: 以流畅度为例,我们看如何非常快速的构建云调试插件的case吧

流畅度:可以理解为android系统绘制UI的速度,理论上,人眼在1s内接收60帧图像才会感觉程序流畅。 android系统之初,流畅度一直是人们诟病的目标,直到android 4.1系统的时候,有了注明的project Buffer,并引入了三大元素,VSYNC(垂直同步)、Triple Buffer和Choreographer。其中Choreographer这个东西是我们今天讨论的目标。它是整套机制中的协调者,并且所有looper都共用一个Choreographer对象

Choreographer对外开放了一个FrameCallback的东西,在每次系统绘制时,都会通过这个回调doFrame函数,通过这个函数可以计算出在1s内,当前页面的绘制次数。但是问题来了:
看上图,含义就是,此货虽然好,但是建议是你们开发者还是不要用了。。。这如何玩,本来还想拿它上个流畅度监控的。。此时一定会想到,我们有云调试插件。

构建很简单,如下,只需要把这段代码copy到任意android工程,然后打包,注意NutXError只作为编译依赖即可, 如果已有插件系统, 这段代码就可以直接被加载并运行了

public class     NutFrameMonitor extends BaseCase {  private static final String TAG = "NutFrameMonitor";  @Override  public void invoke(Context context) {    int sdkVersion = 0;    try {      sdkVersion = Build.VERSION.SDK_INT;    } catch (Exception e) {      // TODO     }     if (sdkVersion >= 16) {       try {         Choreographer.getInstance().postFrameCallback(NutFrameCallback.callback);       } catch (Exception e) {         // TODO       }     }   }   private static class NutFrameCallback implements Choreographer.FrameCallback {     static final NutFrameCallback callback = new NutFrameCallback();     private long mLastFrameTimeNanos = 0;     private long mFrameIntervalNanos = (long)(500000000) - 1;     @Override     public void doFrame(long frameTimeNanos) {       if (mLastFrameTimeNanos != 0) {         final long jitterNanos = frameTimeNanos - mLastFrameTimeNanos;         if (jitterNanos > mFrameIntervalNanos) {           NutXError error = new NutXError(TAG);           error.setDetailMessage("frame Choreographer waste more than 500ms");           error.dump();         }       }       mLastFrameTimeNanos = frameTimeNanos;       Choreographer.getInstance().postFrameCallback(NutFrameCallback.callback);     }   } } 

结果

下面这个截图是在操作客户端运行的时候(注意监控case是通过云插件动态加载的哟),发现的一个流畅度问题。同时也可以看到,在监控到绘制问题后,用户停留的每个界面也被画了出来。 然后线下就可以沿着这条trace去复现结果了~
是不是很酷~~~

后记

如上,便结束了对百度在移动端测试的技术探讨。然而,其实有很多没提到,譬如现在已经构建好的自动化case有哪些、这套机制兼容性如何等,再譬如有眼尖的同学也会发现这套系统本身可能就会有兼容性问题,如何做好问题卡控,保证云调试插件(其实我们叫坚果云)有效及时回收。 其实,我们有充足的自信在线上尝试这个东西。在厂子的线上,我们一整套动态模块小流量系统,云插件本身其实就被作为了一个动态模块,当线上出现问题时,我们的云插件就会发挥它的价值了

更多干货分享请关注”百度MTC学院“http://mtc.baidu.com/academy/article

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
如何在 iPhone 和 Android 上关闭蓝色警报如何在 iPhone 和 Android 上关闭蓝色警报Feb 29, 2024 pm 10:10 PM

根据美国司法部的解释,蓝色警报旨在提供关于可能对执法人员构成直接和紧急威胁的个人的重要信息。这种警报的目的是及时通知公众,并让他们了解与这些罪犯相关的潜在危险。通过这种主动的方式,蓝色警报有助于增强社区的安全意识,促使人们采取必要的预防措施以保护自己和周围的人。这种警报系统的建立旨在提高对潜在威胁的警觉性,并加强执法机构与公众之间的沟通,以共尽管这些紧急通知对我们社会至关重要,但有时可能会对日常生活造成干扰,尤其是在午夜或重要活动时收到通知时。为了确保安全,我们建议您保持这些通知功能开启,但如果

在Android中实现轮询的方法是什么?在Android中实现轮询的方法是什么?Sep 21, 2023 pm 08:33 PM

Android中的轮询是一项关键技术,它允许应用程序定期从服务器或数据源检索和更新信息。通过实施轮询,开发人员可以确保实时数据同步并向用户提供最新的内容。它涉及定期向服务器或数据源发送请求并获取最新信息。Android提供了定时器、线程、后台服务等多种机制来高效地完成轮询。这使开发人员能够设计与远程数据源保持同步的响应式动态应用程序。本文探讨了如何在Android中实现轮询。它涵盖了实现此功能所涉及的关键注意事项和步骤。轮询定期检查更新并从服务器或源检索数据的过程在Android中称为轮询。通过

如何在Android中实现按下返回键再次退出的功能?如何在Android中实现按下返回键再次退出的功能?Aug 30, 2023 am 08:05 AM

为了提升用户体验并防止数据或进度丢失,Android应用程序开发者必须避免意外退出。他们可以通过加入“再次按返回退出”功能来实现这一点,该功能要求用户在特定时间内连续按两次返回按钮才能退出应用程序。这种实现显著提升了用户参与度和满意度,确保他们不会意外丢失任何重要信息Thisguideexaminesthepracticalstepstoadd"PressBackAgaintoExit"capabilityinAndroid.Itpresentsasystematicguid

Android逆向中smali复杂类实例分析Android逆向中smali复杂类实例分析May 12, 2023 pm 04:22 PM

1.java复杂类如果有什么地方不懂,请看:JAVA总纲或者构造方法这里贴代码,很简单没有难度。2.smali代码我们要把java代码转为smali代码,可以参考java转smali我们还是分模块来看。2.1第一个模块——信息模块这个模块就是基本信息,说明了类名等,知道就好对分析帮助不大。2.2第二个模块——构造方法我们来一句一句解析,如果有之前解析重复的地方就不再重复了。但是会提供链接。.methodpublicconstructor(Ljava/lang/String;I)V这一句话分为.m

如何在2023年将 WhatsApp 从安卓迁移到 iPhone 15?如何在2023年将 WhatsApp 从安卓迁移到 iPhone 15?Sep 22, 2023 pm 02:37 PM

如何将WhatsApp聊天从Android转移到iPhone?你已经拿到了新的iPhone15,并且你正在从Android跳跃?如果是这种情况,您可能还对将WhatsApp从Android转移到iPhone感到好奇。但是,老实说,这有点棘手,因为Android和iPhone的操作系统不兼容。但不要失去希望。这不是什么不可能完成的任务。让我们在本文中讨论几种将WhatsApp从Android转移到iPhone15的方法。因此,坚持到最后以彻底学习解决方案。如何在不删除数据的情况下将WhatsApp

同样基于linux为什么安卓效率低同样基于linux为什么安卓效率低Mar 15, 2023 pm 07:16 PM

原因:1、安卓系统上设置了一个JAVA虚拟机来支持Java应用程序的运行,而这种虚拟机对硬件的消耗是非常大的;2、手机生产厂商对安卓系统的定制与开发,增加了安卓系统的负担,拖慢其运行速度影响其流畅性;3、应用软件太臃肿,同质化严重,在一定程度上拖慢安卓手机的运行速度。

Android中动态导出dex文件的方法是什么Android中动态导出dex文件的方法是什么May 30, 2023 pm 04:52 PM

1.启动ida端口监听1.1启动Android_server服务1.2端口转发1.3软件进入调试模式2.ida下断2.1attach附加进程2.2断三项2.3选择进程2.4打开Modules搜索artPS:小知识Android4.4版本之前系统函数在libdvm.soAndroid5.0之后系统函数在libart.so2.5打开Openmemory()函数在libart.so中搜索Openmemory函数并且跟进去。PS:小知识一般来说,系统dex都会在这个函数中进行加载,但是会出现一个问题,后

iOS 16.2 引入“自定义辅助功能模式”,为 iPhone 和 iPad 提供简化的体验iOS 16.2 引入“自定义辅助功能模式”,为 iPhone 和 iPad 提供简化的体验Apr 13, 2023 am 11:07 AM

苹果公司周二向开发人员发布了iOS 16.2 beta 2,因为该公司准备在 12 月向公众提供更新。正式地,它添加了新的 Freeform 协作应用程序和对 Home 应用程序的改进。在后台,9to5Mac发现 Apple 一直在开发一种新的“自定义辅助功能模式”,该模式将为 iPhone 和 iPad 提供“流线型”体验。自定义辅助功能模式这种代号为“Clarity”的新模式基本上用更精简的模式取代了 Springboard(这是 iOS 的主要界面)。该功能在当前测试版中仍对用户不可用,将

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),