理论基础
<使用预置安装工具
Android系统中,应用安装包.apk文件属于默认支持的文件类型,它的的mime type被定义为"application/vnd.android.package-archive"。
系统内置了安装工具来解析并安装.apk文件。你可以从OPhone平台的文件管理器中找到对应安装包,点击即可启动安装步骤。这里给出了相应的代码,有兴趣的开发者可以尝试使用。
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系统同样支持多种卸载方式。
使用预置卸载工具
系统内置了卸载工具。这里给出了启动代码,执行后即可看到卸载步骤:
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);
observer实现了回调函数packageDeleted(boolean succeeded)以检查卸载是否成功
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 系统应用管理 安卓的应用管理在哪里
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章