基础内容:
测试工程的manifest文件中添加<Instrumentation>元素来指定要测试的应用程序
签名机制
只有相同签名才能运行在同一个进程中
签名后能共享apk里面的acvitivy,view信息
测试应用和被测应用运行在同一个进程里,它们之间就可以通过Instrumentation来进行消息交互
am instrument -w
InstrumentationTestRunner通过调用Instrumentation杀除应用程序的进程,再用Instrumentation重启该应用。这时,测试应用和被测应用就运行在同一进程下。
使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Contenxt。控制应用程序的多个生命周期
Home Back
onPause onPause
onStop onStop
onRestart onDestroy
onStart onCreate
onResume onStart
onResume
常见的内存泄露问题
1.资源对象没有关闭,比如数据库操作中得Cursor,IO操作的对象
2.Context的泄露,比如我们在单例类中使用Context对象
3.Bitmap泄露
如浏览器的书签,历史网页图标都是先存入数据库,一般这个图标都会给非常小。
但是有些网页会给很大,如果不压缩就存入,到时候点击进入书签页面,取图标的时候就会出现内存溢出,导致浏览器直接闪退。
下面是压缩的例子:
private final int MAX_SIZE =20*1024;//设置图片数据最大为20KB
long length = entity.getContentLength(); //获取图片长度
if(length<=MAX_SIZE)
length = MAX_SIZE; //当长度小于最大设定长度 图片长度等于最大长度
int factor = (int)(length /MAX_SIZE); //算出缩小的比例 如果小于最大长度就是 1/1 不缩小
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = factor;
options.inJustDecodeBounds =false ; //读取图片when false, 只读取宽高 设为true,这时候decode的bitmap为null
Bitmap icon = BitmapFactory.decodeStream(
content, null, options); //读出图片
4.强引用导致无法回收
用浏览器打开一些自己的广告文章,需要传一个activity进去,如果不做处理直接传activity打开文章,当浏览器back到后台,activity还是为1,没有释放,造成内存泄露。
所有打开一些广告文章,可以先用实例化一个弱引用的activity,再用这个activity打开文章。后面会被自动回收,不会造成泄露
new AdWebJumpHandler(this);//传入activity
private static class AdWebJumpHandler implements WebJumpHandler {
private WeakReference<BrowserActivity> mActivityRef;
public AdWebJumpHandler(BrowserActivity activity){
mActivityRef = new WeakReference<BrowserActivity>(activity);//生成弱引用
}
@Override
public void onJump(String url, AdData adData, Bundle bundle) {
BrowserActivity activity = mActivityRef.get();//获取弱引用的activity去打开url
if(null != activity){
activity.openUrl(url);
}
}
}
MAT
● shallow heap:指的是某一个对象所占内存大小。
● retained heap:指的是一个对象的retained set所包含对象所占内存的总大小。
1.Immediate Dorminator
这是一个非常有用的功能,它的作用就是找出选择对象在Dominator Tree中的父节点。
2.Merge Shortest Paths to GC Roots 可以查看一个对象到RC Roots是否存在引用链相连接, 在JAVA中是通过可达性(Reachability Analysis)来判断对象是否存活,这个算法的基本思想是通过一系列的称谓"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走得路径称为引用链,当一个对象到GC Roots没有任何引用链相连则该对象被判定为可以被回收的对象,反之不能被回收,我们可以选择 exclude all phantom/weak/soft etc.references(排查虚引用/弱引用/软引用等)因为被虚引用/弱引用/软引用的对象可以直接被GC给回收.
List object - With outgoing References 显示选中对象持有那些对象
List object - With incoming References 显示选中对象被那些外部对象所持有
Show object by class - With outgoing References 显示选中对象持有哪些对象, 这些对象按类合并在一起排序
Show object by class - With incoming References 显示选中对象被哪些外部对象持有, 这些对象按类合并在一起排序