写给测试人员看的安卓底层知识 2018-7-6 17:13:07

什么是Android?熟悉Android Architecture

是一个基于Linux内核的开放源代码移动操作系统。Android系统是基于Linux内核开发,使用Java作编程语言,使界面到功能,都有层出不穷的变化

Android Architecture(安卓架构):

总的来说,Android的系统体系结构分为四层,自顶向下分别是:

  • 应用程序(Applications)
  • 应用程序框架(Application Frameworks)
  • 系统运行库与Android运行环境(Libraris & Android Runtime)
  • Linux内核(Linux Kernel): Android平台的基础,直接和硬件打交道。硬件驱动、进程管理、内存管理、网络管理的功能在这里实现。

关于安卓架构,能了解的也就这么多了,再想了解的比较深入的话就挺吃力的了。这篇文章相对来说比较详细也比较好懂,感兴趣的可以阅读一下:学习链接点击学习哦

Android手机应用都包含哪些组件(Application Framework),各个应用的具体细节部分

这个需要重点了解一下,咱们测试过程中以及描述bug的时候经常会抓不住重点,提交的bug描述可能会导致开发误判问题。了解这个之后会对发现bug以及对bug的描述有很大的帮助,开发对你提交的bug也能easier地定位问题,或者开发在跟你解释bug的时候,你能听得懂不被开发所鄙视 ,哈哈

Android系统的基本组件包括Activity,Service, BroadcastReceiver和ContentProvider等,此外还包括专门负责在基本组件之间传递消息的Intent组件。所有组件都必须在AndroidManifest.xml文件中声明

一:Activity —— 应用表示层(基类 Activity)

一个活动表示一个可视化的用户界面,关注一个用户从事的事件。例如,一个活动可能表示一个用户可选择的菜单项列表,或者可能显示照片连同它的标题。一个文本短信应用程序可能有一个活动,显示联系人的名单发送信息;第二个活动,写信息给选定的联系人;其他活动,重新查看旧信息或更改设置。虽然他们一起工作成一个整体的用户界面,但是每个活动是独立于其他活动的。每一个都是作为Activity基类的一个子类的实现。 应用程序中的每个屏幕都是通过继承和扩展基类 Activity 来实现的。

同一应用中的每个 Activity 是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个 Activity (默认窗口),而后可以根据需要从这个 Activity 启动另一个新的 Activity。

其中Activity等同于J2ME的MIDlet,一个Activity类别负责创建视窗,一个活动中的Activity就是在foreground(前景)模式,背景执行的程序叫做Service。两者之间透过由ServiceConnection和AIDL连结,达到复数程序同时执行的效果。如果执行中的Activity全部画面被其他Activity取代时,该Activity便被停止,甚至被系统清除。

Activity 状态回调以及生命周期:

  • onCreate:创建

在Activity被创建时回调,第一个生命周期。我们一般在创建Activity时需要重写该方法做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等

  • onStart:启动

该方法回调表示activity正在启动,此时activity处于可见状态,只是还没有在前台展示,因此用户也无法交互。可以简单理解为activity已显示却无法被用户看见。

  • onRestart:重启

  • onResume:继续

  • onPause:暂停

  • onStop:停止

  • onDestroy:摧毁

二:service—— 没有可见的用户界面,但能够长时间运行于后台( 基类 service )

一个服务没有一个可视化的用户界面,而是在后台无期限地运行。例如一个服务可能是锁屏服务,用户在做一些其他事情,而他需要在亮屏的时候被唤起。又或者是一个音乐播放服务,用户在做一些其他事情,或者它可能从网络拿到数据,或计算一些东西并提供结果给需要的活动(activities)

service运行于应用程序进程的主线程中,因此service不会阻塞其他组件和用户界面。

service是不能自己启动的,必须通过一个context对象(如一个activity)调用startservice或bindservice方法来启动,这两种方法启动的service的生命周期不同

下面这些是service的调用方法,这些了解即可吧,我也没看太懂。不过通过这些我get到的是,如果你的软件突然不启动或异常启动、运行,那就可是开发没把service这块儿写好哦。

  • 1.调用 startService 方法

    • a) 若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法,然后再调用 onStart 方法。
    • b) 若 Service 已经启动,则会直接调用 onStart 方法
    • c) 该方法启动的 Service ,可以通过 Context 对象调用 stopService 来关闭,也可以通过 Service 自身调用 stopSelf() 或 stopSelfResult() 来关闭,关闭之前调用 onDestory 方法。
  • 2.调用 bindService 方法

    使当前 Context 对象通过一个 ServiceConnection 的对象绑定到所指定的 Service

    • a)若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法初始化启动,然后调用 Service 的 onBind 方法初始化绑定。
    • b)如果绑定 Service 的 Context 对象被销毁时,被绑定的 Service 也会调用 onUnbind 和 onDestroy 方法停止运行
    • c)注意: BroadcastReceiver 是不能绑定服务的。
    • d)一个绑定 Service 的 Context 对象还可以通过 unbindService() 来取消对服务的绑定。
    • e)取消时, Service 会调用 unbind 方法,若 Service 是通过 bindService 来启动的,还会调用 onDestroy 方法来停止服务。

三:Broadcast Receiver——用户接收广播通知的组件

一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据。一个应用程序可以有任意数量的广播接收者去反应任何它认为重要的公告

例如:你卸载一个app成功之后,某个app会立马弹出卸载清理成功的弹窗并让你清理系统垃圾,这个功能就是通过监听到卸载清理成功的广播;又比如某个应用程序告诉另一个:我下载好啦,你可以来使用我啦。也是通过广播来实现的。

BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity 作为响应,或者通过 NotificationMananger(通知管理) 提醒用户

四、Content Provider 为解决应用程序间数据通信、共享的问题(基类 ContentProvider )

内容提供者(content provider)使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。内容提供者继承自ContentProvider 基类并实现了一个标准的方法集,使得其他应用程序可以检索和存储数据。然而,应用程序并不直接调用这些方法。相反,替代的是它们使用一个ContentResolver对象并调用它的方法。ContentResolver能与任何内容提供者通信,它与提供者合作来管理参与进来的进程间的通信。

在 Android 中,每个应用程序都是用自己的用户 ID 并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。 Content Provider 可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是 Android 文件系统、 SQLite 数据库或者其他合理的方式。 当数据需要在应用程序间共享时,我们就可以利用 ContentProvider 为数据定义一个 URI 。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个 ContentResolver, 然后传入响应的 URI 就可以了。

五、Intent —— 连接组件的纽带

以上 4 种基本组件中,除了 Content Provider 是通过 Content Resolver 激活外,其他 3 种组件 Activity 、 Service 和 Broadcast Receiver 都是由 Intent 异步消息激活的。 Intent 在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此,Intent 是包含具体请求信息的对象。 针对不同的组件,Intent 所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递 Intent 的不同方式。

该平台最有特点的地方

参照之前总结的链接 http://flipped.leanapp.cn/blog/articals/5add4502ac502e0042d987bc

Android手机应用程序的运行机制:

各个组件的特点

a:通过第三个问题可以知道安卓有五个组件,后续待补充

各个组件的特点也在其中有详细的说明

各个组件的生命周期

针对各个组件的测试方法

后续待补充

可以练习开发一些应用以了解熟悉各个API的特点,这样有利于我们了解一个应用程序的在什么地方最脆弱,什么地方才是开发最容易忽视的地方。

后续待补充

要熟练掌握各个抓log的工具的使用,各个log参数还有它们在什么时候使用

后续待补充

要能够根据打出的log通过定位应用程序的问题(当然这个要开发把必要的log打出来)

后续待补充

Monkey压力测试工具

后续待补充

各种shell命令(对android支持的linux命令需要熟悉他们的参数和用法。

后续待补充