Android下如何获取App启动时间

合集下载

Android一个app启动另一个app

Android一个app启动另一个app

Android⼀个app启动另⼀个app最近,⼀个app启动另⼀个app,这个玩法挺⽕的嘛,有没有试过更新QQ到5.1版本,QQ的健康⾥⾯就可以添加其他app,实现从QQ跳转到其他app应⽤。

这个挺好玩的,⼀下⼦带来了多少流量啊。

⼀、先来⼏⾏代码,⼀个app启动另⼀个app// 通过包名获取要跳转的app,创建intent对象Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.liuxiang");// 这⾥如果intent为空,就说名没有安装要跳转的应⽤嘛if (intent != null) {// 这⾥跟Activity传递参数⼀样的嘛,不要担⼼怎么传递参数,还有接收参数也是跟Activity和Activity传参数⼀样intent.putExtra("name", "Liu xiang");intent.putExtra("birthday", "1983-7-13");startActivity(intent);} else {// 没有安装要跳转的app应⽤,提醒⼀下Toast.makeText(getApplicationContext(), "哟,赶紧下载安装这个APP吧", Toast.LENGTH_LONG).show();}这⾥或许⽹上有很多类似代码,还是提⼀下,让⼤家知道流程。

⼆、被启动的app如何获取参数呢?public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);Intent intent = getIntent();Bundle bundle = intent.getExtras();if (bundle != null) {String name = bundle.getString("name");String birthday = bundle.getString("birthday");if (name != null && birthday != null) {Toast.makeText(getApplicationContext(), "name:" + name + " birthday:" + birthday, Toast.LENGTH_SHORT).show();}}}}在被打开的app应⽤,也是简单地⼏⾏代码可以接收到传过来的参数信息。

Android性能优化

Android性能优化

•一、App启动速度优化•二、App内存优化•三、App绘制优化•四、App瘦身•五、APP电量优化App启动速度优化一、认识启动加速含义从点击图标到用户可操作的全部过程意义避免用户一安装应用就卸载分类•冷启动•热启动•温启动过程冷启动前•1、点击相应应用图标•2、App启动之后立即展示一个空白的Window(预览窗口显示)•3、创建App进程冷启动后•1、创建App对象•2、启动Main Thread•3、创建启动的Activity对象,闪屏显示•4、创建启动的MainActivity对象,主页显示•5、其它工作二、优化工具力求获取准确的数据评估1、TraceView性能损耗太大,得出的结果并不真实作用:主要做热点分析,得到两种数据•单次执行最耗时的方法•执行次数最多的方法使用:•1、代码中添加:Debug.startMethodTracing()、检测方法、Debug.stopMethodTracing()•2、打开Profile->CPU->点击Record->点击Stop->查看Profile下方Top Down/Bottom Up找出耗时的热点方法。

2、Systrace+函数插桩Systrace原理在系统的一些关键链路(如SystemServcie、虚拟机、Binder驱动)插入一些信息(Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,最后得到整个系统的运行性能信息。

Android Framework里面一些重要的模块都插入了label信息(Java 层通过android.os.Trace类完成, native层通过ATrace宏完成),用户App中可以添加自定义的Lable。

特性•系统版本越高,Android Framework中添加的系统可用Label就越多,能够支持和分析的系统模块也就越多。

Android 避免APP启动闪黑屏的解决办法(Theme和Style)

Android 避免APP启动闪黑屏的解决办法(Theme和Style)
android:theme="Theme.Translucent" //透明背景
android:theme="Theme.Translucent.NoTitleBar" //透明背景并无标题
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" //透明背景并无标题,全屏
上面我定义了两种Theme,第一种Theme就是设置一张背景图。当程序启动时,首先显示这张背景图,避免出现黑屏。第二种Theme是把样式设置为透明,程序启动后不会黑屏而是整个透明了,等到界面初始化完才一次性显示出来。下面说说两种方式的优缺点:
?Theme1 程序启动快,界面先显示背景图,然后再刷新其他界面控件。给人刷新不同步感觉。
android:theme="Theme.Wallpaper" //用系统桌面为应用程序背景
android:theme="Theme.Wallpaper.NoTitleBar" //用系统桌面为应用程序背景,且无标题栏
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" //用系统桌面为应用程序背景,无标题栏,全屏
Style可以理解为一组属性集合,方便不同的View设置使用,我们在View里面使用Style的时候,跟使用Theme是一样的应用方法。那么Style和Theme有什么区别?
下面列出两者区别:
?样式用在单独的View,如:Button、TextView等

Android移动应用开发基础教程教学大纲

Android移动应用开发基础教程教学大纲

《Android移动应用开发基础教程》教学大纲学时:六二代码:适用专业:制定:审核:批准:一,课程地地位,质与任务Android移动应用开发基础是普通高等学校计算机科学与技术专业地一门重要地专业基础课。

通过本课程地学,使学生能够在已有地计算机基础知识基础上,对Android移动应用开发有一个系统地,全面地了解,为掌握移动应用开发打下良好地基础;在系统理解与掌握Android移动应用开发基本原理地基础上,了解与掌握移动应用开发地基本原理与方法,具有设计与开发Android移动应用APP地基本能力。

Android移动应用开发是一门实践非常强地学科,它要求学生在理解与掌握Android移动应用开发语言语法地基础上,充分利用实验课程,在计算机上动手完成程序地编写与调试。

二,课程教学基本要求一.课程教学以Android移动应用开发方法为主,在教学过程让学生掌握Android移动应用开发地基本原理与方法。

二.要求在教学过程合理安排理论课时与实验课时,让学生有充分地使用在计算机上练理论课程学到地Android移动应用开发技巧与方法。

三,课程地内容第一章 Android开发起步让学生了解Android台特点,体系架构与版本,掌握如何搭建Android开发环境,熟悉如何创建Android项目与Android编程地日志工具第二章 Android核心组件:活动让学生了解Android核心组件之一地活动是什么,活动生命周期,掌握活动基本操作,在活动使用Intent,在活动之间传递数据,活动地启动模式。

第三章 UI设计让学生熟练掌握线布局,相对布局,通用UI组件,消息通知与菜单。

第四章广播机制让学生了解广播机制,并熟练掌握如何使用广播接收器。

第五章数据存储让学生熟练掌握Android文件存储,享存储与SQLite数据库存储。

第六章多媒体让学生熟练掌握播放多媒体文件,记录声音,使用摄像头与相册。

第七章网络与数据解析让学生熟练掌握使用WebView,解析XML格式数据与解析JSON数据。

Android手机上,利用bat脚本模拟用户操作

Android手机上,利用bat脚本模拟用户操作

Android⼿机上,利⽤bat脚本模拟⽤户操作利⽤bat脚本模拟⽤户操作,需要⽤到两点:①就是adb命令了,adb命令可以⽤来模拟⽤户在⼿机上的操作②bat语⾔,就是批处理语⾔,主要⽤来进⾏逻辑处理,跟众多语⾔语法⼀样,批处理语⾔也包括for循环、if语句之类的语法;⼀、adb命令⾸先我们来介绍模拟⽤户在⼿机上操作的adb命令input keyevent //发送键盘事件⽤法说明:adb shell input keyevent “value”usage: input ...input text <string> //在EditText中输⼊字符串input keyevent <key code number or name> //模拟back键、home键、⾳量键等操作input tap <x> <y> //模拟点击事件input swipe <x1> <y1> <x2> <y2> //模拟滑动事件看看上⾯的这四个命令是不是已经满⾜你⽇常使⽤了呢?先列举input keyevent⼏个⽐较常⽤的code值:input keyevent 3 // Homeinput keyevent 4 // Backinput keyevent 19 //Upinput keyevent 20 //Downinput keyevent 21 //Leftinput keyevent 22 //Rightinput keyevent 23 //Select/Okinput keyevent 24 //Volume+input keyevent 25 // Volume-input keyevent 82 // Menu 菜单~~~下⾯来举个栗⼦:①你可以先进⼊到adb shell中,再执⾏input keyevent "value",如下,看看是不是执⾏了home键的操作呢:shell@android:/ $ input keyevent 3②你也可以不进⼊adb shell中,直接执⾏(在bat脚本中写的时候当然要⽤这种啦~),如下:adb shell input tap 1431850 //这是点击了横坐标为143、纵坐标为1850的像素点adb shell input swipe 200100444666 //这是从坐标点(200,100)滑动到了坐标(444,666)========================================【快速获取想要点击图标像素点的技巧:】想要点击某个button,但是怎么快速获取该button的像素位置呢?⼀般Android在[设置--⾼级设置--开发者选项]中,或者[设置--开发⼈员选项]中,有“指针位置”这⼀项,打开该开关不要怀疑⽔印,我是从⾃⼰博客拿过来的:)如上图,⽅框的位置就是你所点击的区域坐标点,注意,原坐标[0, 0]就是⼿机屏幕的左上⾓。

浅谈android性能优化之启动过程(冷启动和热启动)

浅谈android性能优化之启动过程(冷启动和热启动)

浅谈android性能优化之启动过程(冷启动和热启动)本⽂介绍了浅谈android性能优化之启动过程(冷启动和热启动) ,分享给⼤家,具体如下:⼀、应⽤的启动⽅式通常来说,启动⽅式分为两种:冷启动和热启动。

1、冷启动:当启动应⽤时,后台没有该应⽤的进程,这时系统会重新创建⼀个新的进程分配给该应⽤,这个启动⽅式就是冷启动。

2、热启动:当启动应⽤时,后台已有该应⽤的进程(例:按back键、home键,应⽤虽然会退出,但是该应⽤的进程是依然会保留在后台,可进⼊任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应⽤,这个⽅式叫热启动。

特点1、冷启动:冷启动因为系统会重新创建⼀个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括⼀系列的测量、布局、绘制),最后显⽰在界⾯上。

2、热启动:热启动因为会从已有的进程中来启动,所以热启动就不会⾛Application这步了,⽽是直接⾛MainActivity(包括⼀系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化⼀个MainActivity就⾏了,⽽不必创建和初始化Application,因为⼀个应⽤从新进程的创建到进程的销毁,Application只会初始化⼀次。

⼆、应⽤的启动过程冷启动启动流程:当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出⼀个新的进程分配给该应⽤,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的 windowBackground等属性设置给MainActivity以及配置Activity层级上的⼀些属性、再inflate布局、当onCreate/onStart/onResume⽅法都⾛完了后最后才进⾏contentView的measure/layout/draw显⽰在界⾯上,所以直到这⾥,应⽤的第⼀次启动才算完成,这时候我们看到的界⾯也就是所说的第⼀帧。

Androidapp性能测试小结(7个性能指标)

Androidapp性能测试小结(7个性能指标)

Androidapp性能测试⼩结(7个性能指标)1.性能测试的⼏个指标:2.性能测试环境准备:3.启动时间3.1,监控值的获取⽅法启动分为冷启动和热启动,冷启动:应⽤程序⾸次启动,进程⾸次创建并加载资源的过程;热启动:应⽤程序启动后点“back”键、“Home”键,应⽤程序退到后台,并未被完全“杀死”的状态,再次启动;3.1.1,冷启动启动App命令:adb shell am start -W -n package/activity 停⽌App命令:adb shell am force-stop package获取package/activity的⽅法:1.先执⾏监控指令 adb logcat | grep START,再启动程序,⽣成的log信息中可以查看该程序的包名和activity 名ThisTime:647 这条信息中的时间就作为这次应⽤启动的耗时3.1.2,热启动启动App命令:adb shell am start -W -n package/activity 停⽌App命令:adb shell input keyevent 3 (发送⼀个keyevent事件,3代表点击⼿机上的“back”键)ThisTime:427 这条信息中的时间就作为这次应⽤启动的耗时3.2,“启动时间”监控的脚本实现“启动时间”监控的脚本实现有两种⽅式:1.获取命令执⾏时间,作为启动时间参考值;2.在命令前后加上时间戳,以差值作为参考值(此种⽅式相对更精准)脚本中需要创建两个类以及⽅法:脚本实现如图1、2得到的数据在csv⽂件中,数据分析时去掉第⼀次的数据,取均值,并绘制出⼀个数据曲线,得到的均值的参考价值的体现⽅式有两种形式:1.取竞品的数据作为对⽐(⽐如测试的是google浏览器,⽤其他浏览器做对⽐);2.取历史版本的数据做对⽐(版本间对⽐,看最新版本的开发过程中是否造成了启动时间的延长)3.2.2,时间戳差值监控⽤到的类以及⽅法:4,CPU监控值的获取⽅法、脚本实现和数据分析4.1获取⽅法:取图中第⼀个百分数作为cpu状态值脚本实现如图3、4注意:关于cpu的状态测试的时间要稍长⼀些,需要配合⼀个⾃动化脚本来实现对设备的操作,例如重复搜索100次,同时执⾏监控命令,来获取搜索100次之后的cpu状态值5,流量监控值的获取⽅法、脚本实现和数据分析5.1获取⽅法:1.⾸先要获取进程的ID,命令:adb shell ps | grep packagename;,如图中的“5715”就是我们想要的进程的ID。

APPcrawler基础原理解析及使用

APPcrawler基础原理解析及使用

APPcrawler基础原理解析及使⽤⼀、背景⼀年前,我们⼀直在⽤monkey进⾏Android 的稳定性测试,主要⽬的就是为了测试app 是否会产⽣Crash,是否会有ANR,页⾯错误等问题,在monkey测试过程中,实现了脱离Case的依赖,但是monkey测试完全随机、不可控,并且只⽀持Android系统,不⽀持iOS系统;然⽽在我们不断的实践中发现,monkey测试已经不能满⾜于我们的部分业务需求,⽐如说我们想让稳定性测试更灵活、跨端⽀持iOS、⽇志可读、定向场景设计、测指定页⾯的稳定性、报告清晰展⽰遍历结果等等,monkey在这些⽅⾯的实现局限性很⼤,经过我们调研发现开源⼯具appcrawler已然⽀持这些⽅⾯,在我们最近⼏个版本的appcrawler使⽤过程中,能够满⾜我们复杂的业务测试需求,弥补了monkey测试的不⾜,下⾯我详细的介绍这个⾃动化UI遍历⼯具-appcrawler。

⼆、appcrawler UI⾃动化遍历⼯具介绍appcrawler,使⽤Scala编程语⾔运⾏在JVM上,它是基于app爬⾍的思想,逐渐形成了⼀种⾃动化测试⽅法称为“UI遍历”,其主导思想是尽可能多的去操作被测app的界⾯元素,每个元素⾄少操作⼀遍。

⽀持android和iOS,⽀持真机和模拟器,最⼤的特点是灵活性,可通过配置来设定遍历的规则,⽤于⾃动化回归测试,实现对整个APP的所有可点击元素进⾏遍历点击。

⾃动遍历的价值回归测试,遍历基本的界⾯,了解主要界⾯的可⽤性,⽐如兼容性,基本功能;利⽤遍历获取app的加载时间和性能数据,需要借助其他的性能数据抓取⼯具,⽐如OneApm,NewRelic;利⽤遍历验证app的内存泄漏以及稳定性等功能,需要借助LeakCanary和MLeaksFinder;UI diff 验证新⽼版本的功能差异,并识别细节的问题;抓取接⼝请求辅助验证⼀些模块基本接⼝,并辅助分析接⼝调⽤流程,为接⼝测试做准备;三、为什么⽤这个⼯具1. ⽀持android和iOS,⽀持真机和模拟器;2. 可通过配置来设定遍历的规则(⽐如设置⿊名单和⽩名单,提⾼遍历的覆盖率);3. 其本⾝的遍历深度覆盖较全,⽐如它拥有APP的dom树,根据每个activity下的可点击元素逐个点击,⽐monkey更具有规律性,覆盖更全⾯;4. ⽣成的报告附带截图,可以精确看到点击了哪个元素及结果,对crash类的问题定位清晰;5. 各⼤云市场上⾃动遍历功能都多有限制企业⽆法⾃由定制.;6. 解决monkey等⼯具可控性差的缺点;7. 发现深层次的UI兼容性问题;8. 通过新⽼版本的diff可以发现每个版本的UI变动范围;四、设计理念appcrawler UI遍历基于app爬⾍思想,为了更好的认识app爬⾍,这⾥先介绍⼀下⽹络爬⾍,在了解⽹络爬⾍框架之后,您将会对app爬⾍有⼀个清晰的认知。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Am.java部分代码如下:
public class Am extends BaseCommand {
/360qtest/2014/03/19/android%E8%8E%B7%E5%8F%96app%E5%90%AF%E5%8A%A8%E6%97%B6%E9%97%B4/
public abstract interface IActivityManager {
public static class WaitResult implements Parcelable { public int result; public boolean timeout; public ComponentName who; public long thisTime; public long totalTime;
public static IActivityManager getDefault() { return null;
} }
package android.app;
import ponentName; import android.os.Parcel; import android.os.Parcelable;
到这一步之后,我们需要做的工作就是如何在自己的App中调用这个startActivityAndWait方法。
不过很明显这个API是不对开发者开放的,Android系统中有很多隐藏API,Google之所以要将一些API隐藏(指加上 @hide标记的public类、方法或常量)是因为Android系统本身还在不断的进化发展中。从1.0、1.1到现在4.4,这些隐 藏的API本身可能是不稳定的(方法的参数数量,类型都会变化),所以使用隐藏API,意味着程序更差的兼容性。
}; }
分别查阅4.0、4.4的源码之后发现startActivityAndWait的参数个数和顺序居然不一样,那通过API欺骗的方式适配所 有的系统版本看来是不现实了。但是我们可以结合Java的反射和API欺骗来完成这个工作。所以改写后的代码如下:
package android.app;
public abstract class ActivityManagerNative {
但这并不意味着我们就不能使用它,这些隐藏的API在系统中都是真实存在的,只是不对外开放而已。我们可以通过 三种方法调用它,分别是:JAVA反射机制、API欺骗、重新编译Android源码。
反射是Java的语言特性之一,在此不进行赘述,需要介绍一下API欺骗:烧制到手机中的android.jar包含了Android所 需的各种类与方法;而供开发者使用的android.jar只是其中的一部分。API欺骗是指在应用中去模拟未公开的类和方法 让应用编译通过并生成APK,然而在应用实际运行中调用的却仍是烧制到手机中真实的android.jar。
到了这里我们基本完成了一半的工作,但是每次都需要在adb中才能查看启动时间无疑是很麻烦的,那么如何在手机 上通过一个App控制其他App的启动,并获取启动时间呢,咱们继续看。
首先通过shell看一下am命令中包含什么,在System/bin目录下面找到“am”命令,并打印出之后是如下的结果
可以看出他跟普通的shell命令不一样,他是通过调用一个/framework/目录下的一个am.jar完成的工作,并最终执行 mands.am包下面的Am.java。那我们接下来要做的工作就是下载Android源码,并找到这个 Am.java。
public static IActivityManager getDefault() {
/360qtest/2014/03/19/android%E8%8E%B7%E5%8F%96app%E5%90%AF%E5%8A%A8%E6%97%B6%E9%97%B4/
for (int i = 0; i < methods.length; i++) { String methodName = methods[i].getName(); if (methodName.contains("startActivityAndWait")) { startActivityMethod = methods[i]; startActivityMethod.setAccessible(true); break; }
} }
看到代码之后突然就有了一种豁然开朗的感觉,没错,就是main函数!他就是整个am命令的入口,并调用onRun方 法。如果我们输入的参数是“start”的话,会调用runStart()方法。在runStart()方法之前的预处理中,根据我们输入的-W 参数,将mWaitOption赋值为true。然后最终就找到了整个命令的精髓所在–startActivityAndWait()!
}; }
然后在使用时,首先通过API欺骗获取到一个IActivityManager的实例,然后通过Java反射找到startActivityAndWait方 法,根据不同的系统版本,传递不同的参数,最终完成工作,代码如下:
/360qtest/2014/03/19/android%E8%8E%B7%E5%8F%96app%E5%90%AF%E5%8A%A8%E6%97%B6%E9%97%B4/
private long startActivityForResult(Object[] objects) { try { Object object = startActivityMethod.invoke(activityManager, objects); WaitResult waitResult = (WaitResult) object; return waitResult.thisTime; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return -1;
1/4
2014/11/25
Android下如何获取App启动时间 | Qtest技术空间–服务端测试,android,ios无线测试,智能硬件测试
private IActivityManager mAm; ...
public static void main(String[] args) { (new Am()).run(args);
3/4
2014/11/25
Android下如何获取App启动时间 | Qtest技术空间–服务端测试,android,ios无线测试,智能硬件测试
private void getStartActivityMethod() { activityManager = ActivityManagerNative.getDefault(); Method[] methods = activityManager.getClass().getDeclaredMethods();
} }
// 4.4 private long startActivityWithFieldsForApi19(Intent intent) {
Object[] objects = new Object[] { null, null, intent, null, null, null, 0, 0, nul return startActivityForResult(objects); }
通过查看源码我们可以看到需要模拟的是ActivityManagerNative、IActivityManager和他的startActivityAndWait方法。 参照源码,实现以下代码:
package android.app; public abstract class ActivityManagerNative {
}
...
@Override public void onRun() throws Exception {
if (op.equals("start")) { runStart();
} ... }
private void runStart() throws Exception { ... IActivityManager.WaitResult result = null; int res; if (mWaitOption) { result = mAm.startActivityAndWait(null, null, intent, mimeType, null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId); res = result.result; } else { res = mAm.startActivityAsUser(null, null, intent, mimeType, null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId); } ...
2/4
2014/11/25
Android下如何获取App启动时间 | Qtest技术空间–服务端测试,android,ios无线测试,智能硬件测试 return null;
} }
package android.app;
import ponentName; import android.os.Parcel; import android.os.Parcelable;
相关文档
最新文档