Android应用及应用管理简介

[color=red]本文来源预互联网:[/color]

[size=small]一、概述
07年,Google公司推出了基于Java语言的Android平台,引起了IT业界的一致关注,同年,播思通讯公司开始研发基于其的OPhone平台。
08年,第一款Android手机G1面世,这款Google为HTC量身打造的滑盖手机由T Mobile发行,获得了用户的极大好评,也为整个Android平台的正式商用作出了榜样。
09年,将是OPhone/Android手机的第一个井喷年,播思通讯联合中国移动和各个手机厂商即将推出多款触屏手机。同时,Android社区也日趋壮大,已拥有各种应用五百多个,并在快速增长之中。
本文将对Android应用结构及Android系统的应用管理加以介绍。
本文面对的读者是对Android应用的研发人员、或有过Android开发经验的入门者。
二、Android应用结构
什么是Android应用?
理解什么是Android应用是Android入门所必须的,也是了解应用管理的前提。
那什么是Android应用呢?即指基于Android开发,编译,运行在Android平台的应用。这种应用在编译阶段被打成一个jar包,以.apk 结尾,包内包含了所有运行阶段需要的代码与资源,其中主要分为三块:描述文件AndroidManifest.xml、代码段和运行时资源。
 
AndroidManifest.xml
AndroidManifest.xml是Android应用的描述文件,它描述了该应用的相关信息,主要包括以下各个元素。
 
包名(package)
指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生程序包将以此命名。本包名应当在Android系统运行时唯一。
 
认证(certificate)
指定本应用程序所授予的信任级别,目前有的认证级别有platform(system)、shared、media以及应用自定义的认证。不同的认证可以享受不同的权限。
 
权限组(permission-group)
权限组的定义是为了描述一组具有共同特性的权限。Android系统中预订了一些组,它们是:
android.permission-group.COST_MONEY
android.permission-group.MESSAGES
android.permission-group.MESSAGES
android.permission-group.PERSONAL_INFO
android.permission-group.LOCATION
android.permission-group.NETWORK
android.permission-group.ACCOUNTS
android.permission-group.HARDWARE_CONTROLS
android.permission-group.PHONE_CALLS
android.permission-group.SYSTEM_TOOLS
android.permission-group.DEVELOPMENT_TOOLS
从字面意思我们就可以理解每个组的特性。具体含义可以参考SDK文档。
权限(permission)
权限用来描述是否拥有做某件事的权力。Android系统中权限是分级的,前分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。
系统中所有预定义的权限根据作用的不同,分别属于不同的级别。
对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用拥有platform级别的认证才能申请。
当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。
系统应用可以使用任何权限。权限的声明者可无条件使用该权限。
目前Android系统定义了许多权限,通过SDK文档用户可以查询到哪些操作需要哪些权限,然后按需申请。
权限树(permission-tree)
权限树的设置是为了统一管理一组权限,声明于该树下的权限所有者归属该应用。系统提供了API,应用可以在运行时动态添加。
 PackageManager.addPermission()
 
使用权限(uses-permission)
应用需要的权限应当在此处申请,所申请的权限应当被系统或某个应用所定义,否则视为无效申请。
同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用无法申请高级权限。
 
SDK(uses-sdk)
标识本应用运行的SDK版本。高兼容性的应用可以忽略此项。
 
application
application是Android应用内最高级别(top level)的模块,每个应用内最多只能有一个application,如果应用没有指定该模块,一个默认的application将被启用。
application将在应用启动时最先被加载,并存活在应用的整个运行时生命周期。因此一些初始化的工作适合在本模块完成。
Application元素有许多属性,其中:“persistent”表示本应用是否为常驻内存,“enable”表示本应用当前是否应当被加载。
其它相关属性请参考SDK文档,开发者可以根据需要添加。
在AndroidManifest.xml文件中,运行时模块的定义都作为本模块的子元素。
当运行时模块被调度时,如果应用没有启动,将首先启动应用进行初始化,然后调度对应模块。
 
activity
activity是application模块的运行时子元素,标识了一个UI。除了application,一个应用可以声明并实现零至多个其它运行时模块,activity也同样。
activity也包含了许多定义它工作状态的属性,其中:“name”是必须的,它指定了该activity所在的文件名,如果该文件所属包不同于该应用的包名(即本描述文件的最开始处),那么名字前面需要加入所在包名。
activity通过增加intent-fliter来标识哪些intent可以被处理,同时intent也是调度activity的主要参数。
作为一个运行时的对象,activity的调度方式大致分为两种:一种是指定activit所在类名直接调度,另一种是利用activity可以处理的intent进行调度。
同一种intent可以被不同应用的不同activity处理。当出现此种情况时,用户需要选择具体的activity。
 
receiver
receiver也是application的运行时子元素。
receiver通过增加intent-fliter来标识它需要接受哪些intent。当收到intent后,receiver将根据不同的intent进行不同的处理。
当一个Intent发出后,所有注册了该intent的receiver都将会收到,系统会根据receiver在系统中的注册次序顺序发送。当一个receiver处理完该Intent后,系统才会向下一个receiver发送。
当一个receiver有多个未接收的intent时,将按照intent发送的次序顺序接收。
 
service
service也是application的运行时子元素。Service属于后台模块,启动后将长时间运行,除非停止该service或所在应用进程被杀死。
service从功能上分为两种,一种是服务于本应用,此时的service是一个普通的运行时模块,另一种是服务于所有应用或对应应用,此时需要定义API并将之公布来与其它应用进行交互。
service需要通过API:startService()添加到service管理器中,添加后即在后台运行。它接受外界信息的方式分两种:一种是增加IntentFilter来接收intent,一种是外界应用调用该service所定义的API。
 
provider
provider也是application的运行时子元素。它继承于ContentProvider,是对该应用管理的用户数据的结构化接入,是基于数据库操作方式的封装。
如果应用允许外部应用访问/管理它的用户数据,provider是Android平台提供的最佳方式。
 
activity-alias
顾名思义,是已有activity的别名。
 
uses-library
标识应用启动所必须的共享库。
 
代码段
应用所有的java文件被放入一个包结构,该包命名为classes.dex。
 
运行时资源
Android应用运行时所需的各种资源有layout,drawable,string,style等类型。编译后所有资源统一存放在项目路径/res里,按照用途的不同存放在各个子文件夹中。
编译阶段,所有resource将被排序,每个resource在程序包中都拥有唯一的标识,同时一个名为resources.arsc的文件生成并被置入安装包中,该文件包含了所有索引以供运行时快速查询。而resource以同样目录结构组织放入安装包中。
 
Android应用管理
应用管理是对系统中所有应用整个生命周期的管理。Android系统中,应用都是以.apk文件的形式存在,因此应用管理也可以简单理解为对.apk文件的管理。
从一个应用在系统中的生命周期来看,应用管理可以分为安装,卸载和使用等部分。
 
应用安装
Android系统中,安装应用时不能指定安装目录,所有的应用都只能装在预置文件夹下。
Android系统支持数种安装方式,而播思通讯的Ophone平台在此基础上支持更多方式。
 
使用预置安装工具
Android系统中,应用安装包.apk文件属于默认支持的文件类型,它的的mime type被定义为"application/vnd.android.package-archive"。
系统内置了安装工具来解析并安装.apk文件。你可以从OPhone平台的文件管理器中找到对应安装包,点击即可启动安装步骤。这里给出了相应的代码,有兴趣的开发者可以尝试使用。
view plaincopy to clipboardprint?
1. Intent apkintent = new Intent(Intent.ACTION_VIEW);                 
2. final Uri puri = Uri.fromFile(new File(path));    //path is the path of source apk   
3. apkintent.setDataAndType(puri, "application/vnd.android.package-archive");   
4. startActivity(apkintent);  
Intent apkintent = new Intent(Intent.ACTION_VIEW);
final Uri puri = Uri.fromFile(new File(path)); //path is the path of source apk
apkintent.setDataAndType(puri, "application/vnd.android.package-archive");
startActivity(apkintent);
 
使用API安装
Android系统提供了安装应用的API:PackageManager.installPackage(final Uri packageURI,
final IPackageInstallObserver observer, final int flags);
uri给出了原文件的地址
observer实现了回调函数packageInstalled(final String packageArchiveName, final int returnCode) 以检查安装是否成功
flags提供安装标识。Android平台提供的标识有: 
1.PackageManager.FORWARD_LOCK_PACKAGE = 0x00000001
标识本应用属于受限应用,应用将会被安装到保护目录,只有该应用可以访问代码段和不属于resource的asset资源。
2.PackageManager.REPLACE_EXISTING_PACKAGE = 0x00000002;
应用如已存在,则先删除再安装。
3.PackageManager.SDCARD_PACKAGE = 0x00000004;
 
由OPhone平台扩展,标识该应用安装目录为存储卡,默认为data分区。
因为手机中data分区大小有限,因此OPhone平台默认将应用装到存储卡上。
本API需要"android.permission.INSTALL_PACKAGES"权限,该权限属于签名级别,因此只有系统级别的应用程序才能使用。

拷贝即安装
Android支持拷贝即安装的方式,即将安装包拷贝到预置安装目录即可自动安装,但所有的预置目录对于用户不可见。
OPhone平台扩展后,用户可将安装包拷入存储卡的app目录下,系统将监控该文件夹,检测到新的安装文件后自动安装。
这种方式适合一次安装大量应用,但是也有坏处。一是无法知道哪些应用安装成功,哪些安装失败, 二是安装失败的应用将会作为垃圾存放在预置目录中,在系统启动时延长启动时间,三是过多的应用可能将data分区的空间占用过多,影响系统的正常使用。
 
安装步骤
解析安装包是否合法,如果合法即加载应用,如果非法即放弃安装
取出代码段,放入/data/dalvik-cache目录
建立/data/data/包名的文件夹,以存放用户数据
将安装包携带的lib放入/data/data/包名/lib中
以上步骤完成后将安装包拷到安装目录
加载该应用信息 
应用卸载
Android系统同样支持多种卸载方式。
使用预置卸载工具
系统内置了卸载工具。这里给出了启动代码,执行后即可看到卸载步骤:
view plaincopy to clipboardprint?
1. Uri packageURI = Uri.parse("package:"+packageName);   
2. Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
3. startActivity(uninstallIntent);  
Uri packageURI = Uri.parse("package:"+packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);

使用API卸载
Android提供了卸载应用的标准API:PackageManager().deletePackage(String packageName, IPackageDeleteObserver observer, int flags);
1. observer实现了回调函数packageDeleted(boolean succeeded)以检查卸载是否成功
2. flags提供卸载标识。Android平台提供的标识有
PackageManager.DONT_DELETE_DATA = 0x00000001;
标识卸载时是否同时删除用户数据。 
本API需要"android.permission.DELETE_PACKAGES"权限,该权限属于签名级别,因此只有系统级别的应用程序才能使用。
删除即卸载
对应于拷贝即安装,系统同样支持删除即卸载功能。当用户删除/sdcard/app目录下安装包时,系统将自动检测到删除事件并卸载对应应用。
本方法适合一次删除大量应用。
卸载步骤
删除代码段
如果需要删除用户数据,则删除
建立/data/data/包名的文件夹,以存放用户数据
删除应用信息
删除安装包
应用使用
应用安装后即处于可用状态。对于系统中所有应用,从管理层面分为信息管理和应用调度两部分;从应用自身角度分为去激活与激活两种状态。
信息管理
Android应用的相关信息在AndroidManifest.xml文件中定义,前面已经介绍,信息管理的第一步就是加载信息。
系统启动时,将根据安装目录的不同,先后对已安装应用进行信息加载;系统启动后,运行时安装的应用,在安装成功后进行信息加载。
系统中所有信息加载后,在system service进程(Android应用的核心进程,存放了几乎所有的系统service和核心数据结构)中形成了对应数据结构:
permission数据:应用申请的使用权限在此存放,标识了哪些应用有哪些权限。
application数据:每一个应用生成一个application数据,标识了application模块的各种属性和源文件/用户数据的路径。
providers数据:存放了所有的provider及其属性
receiver数据:存放所有receiver及其属性
service数据:存放所有service及其属性
activity数据:存放所有的activity及其属性。
应用调度
应用调度既所有应用的运行时管理,是建立在信息管理之上的。根据运行时模块的静态信息,系统可以进行模块加载和管理。
根据application信息,可以得知哪些应用是常驻内存应用,哪些应用是动态加载的应用
根据provider信息,可以得知哪些provider是系统级的,哪些是应用级别的,哪些是公开的,哪些是内不得
根据activity信息,可以获得目标UI来处理用户请求
根据receiver信息,可以得知哪些消息可以被处理 
去激活与激活状态
系统启动时,应用信息会被加载,而应用未被启动,此时所有应用处于去激活状态。系统启动完成时,常驻内存应用将被启动,这些应用在系统运行 中始终处于激活状态。对于其他应用,当运行时模块(activity,service,receiver,provider等)被调度时,应用将会激活。
对于所有已激活的应用,系统将之纳入进程管理和内存管理。进程管理将缓存应用运行时数据和状态,当应用因非正常原因被杀掉后,将有机会在重启后恢复原来状 态。系统内存不足时,加通过杀掉非常驻内存应用来释放内存,其优先级为空闲应用>后台应用(即有后台UI)>前台应用(即有UI在前台)。
当应用所在进程被杀掉后,应用重新回到去激活状态。
 
应用使用的API
Android系统为应用管理功能提供了大量的API。根据功能的不同,这些API分为两大类:PackageManager相关和ActivitManager相关。
 
PackageManager相关
本类API是对所有基于加载信息的数据结构的封装,包括以下功能:
安装,卸载应用
查询permission相关信息
查询Application相关信息(application,activity,receiver,service,provider及相应属性等)
查询已安装应用
增加,删除permission
清除用户数据、缓存,代码段等
非查询相关的API需要特定的权限,具体的API请参考SDK文档。
ActivityManager相关
本类API是对运行时管理功能和运行时数据结构的封装,包括以下功能
激活/去激活activity
注册/取消注册动态接受intent
发送/取消发送intent
activity生命周期管理(暂停,恢复,停止,销毁等)
activity task管理(前台->后台,后台->前台,最近task查询,运行时task查询)
激活/去激活service
激活/去激活provider等
task管理相关API需要特定的权限,具体API可参考SDK文档。
 
三、总结
本文实质上是对Android相关API的理论总结与串联,从总体上介绍应用管理的相关知识,并不是一份开发文档或教材,读者仍然需要参考SDK文档中。
如果读者看完本文后,对于应用管理有了一定理论基础,对开发有一定的帮助。本文的目的也就达到了。
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值