Android测试实践

为什么要做测试?

很多公司为了节省成本,基本上是不会要求开发写单元测试的。自己做完的功能,动手点点看看基本流程是否通畅就丢给测试了。
项目小的时候这样也不会有啥问题。随着项目的复杂度越来越高,人员越来越多,不同的人员改动到同一块代码,但彼此对原来的逻辑不是很清楚(因为代码量实在太多,想要一个人弄清楚所有细节已经不太可能)。
这也是为什么大家宁肯写新的代码也不愿意改旧的代码的原因。而如果每个功能在开发的同时配置了单元测试,那么理论上新的功能 开发完之后,所有的单元测试应该都是可以跑通的。这样就能自动帮我们检查出来一些难以发现的bug。

Android如何进行单元测试

  • androidTest目录:应包含在实际或虚拟设备上运行的测试。此类测试包括集成测试,端到端测试以及仅JVM无法验证应用程序功能的其他测试。
  • test目录:应包含在本地计算机上运行的测试,例如单元测试
Read More

包体积优化

删除无用资源

底层库优化

有时候,可能只使用了开源库中对某部分功能,可以对其源码进行删减重新打包。

图片压缩

放入项目之前,对图片进行压缩,比如使用tinypng

图片资源格式的选择

优先选择使用webp格式

Gradle配置

Read More

内存管理

概述

有时候,线上会出现一些”莫名其妙”的bug,比如用户用的好好的,突然就爆出一个空指针异常,这个异常的提示信息如下:

1
2
java.lang.RuntimeException: Unable to start activity
ComponentInfo{xxx.xxx.xxx/xxx.xxx.xxxActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'xxx' on a null object reference

看上去好像就是一般的空指针,但这个异常发生在启动Activity的时候。ActivityThread的performLaunchActivity方法确实有catch

1
2
3
4
5
6
7
{} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"Unable to start activity " + component
+ ": " + e.toString(), e);
}
}
Read More