life02
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
197 随笔 :: 3 文章 :: 37 评论 :: 0 Trackbacks
<
2011年6月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
(179)
android ndk开发(6)
(rss)
Android开发(71)
(rss)
android面试题(4)
(rss)
android模拟器学习(7)
(rss)
android组件学习(15)
(rss)
c++学习(9)
(rss)
laucher开发(转载)(7)
(rss)
OGRE(1)
(rss)
笔试(24)
(rss)
简历(6)
(rss)
算法(7)
(rss)
游戏开发(3)
(rss)
源码学习(19)
(rss)
随笔档案
(197)
2012年7月 (1)
2012年4月 (13)
2012年3月 (40)
2012年2月 (20)
2012年1月 (10)
2011年12月 (47)
2011年11月 (4)
2011年10月 (1)
2011年8月 (3)
2011年7月 (1)
2011年6月 (4)
2011年3月 (1)
2011年2月 (1)
2010年12月 (4)
2010年4月 (2)
2010年2月 (1)
2009年11月 (3)
2009年10月 (16)
2009年9月 (22)
2009年8月 (3)
文章分类
(1)
转载--OGRE(1)
(rss)
文章档案
(3)
2010年12月 (1)
2009年9月 (1)
2009年8月 (1)
收藏夹
(16)
c++游戏开发(2)
(rss)
笔\面试经验(5)
(rss)
笔试题(9)
(rss)
Android开发
Android 源码
(rss)
feng88724(android)
get android source
Himi-android game
java-admin
Sunboy_2050的专栏
widebright的个人空间
八度空间 一点点技术,一点点文艺
点点
愷风(Wei)的专栏
思想实践地
移动平台碎碎念
c++blog——游戏
3d Game Walkman
AI_blog
AI-CODE.ORG
AI博客集合
A东亮——blog
赖勇浩的编程私伙局
牛蛙社团队
牵着老婆满街逛
清源游民的网络笔记本
王者风范 浩荡天下
业内网面试笔试综合版
游戏程序员养成计划
重剑无锋,大巧不工
c++学习
A老牛
c++虚函数
编程之美
QQblog
我想我是鸟
阿里巴巴
杨争的专栏
笔试
技术网站
AIGameDev
android 学习视频
(rss)
http://www.mars-droid.com/
Android开发指南中文版
C/C++ Reference
CSDN
Game Programming Wiki
GameDev.NET
linux学习
sourceforge.net
STL学习
STL中文站
软件测试
数据结构
游戏学习
游戏学习网站
搜索
最新评论
1. re: Android开发多线程断点续传下载器 (转载)
这个handler是不是只能放在外面?
还有哪些地方 。
--25Age
2. re: An internal error occurred during: "Launching New_configuration"
这个问题,这样解决不了啊!!!还有其他办法木啊
--李大明
3. re: Ubuntu 中学习 C/C++ 编程基础入门教程
fugkgfyuk
--46546416
4. re: IconUtilities类的createIconBitmap方法分析
分析在哪里?
--bs
5. re: android SD卡文件的读写(z转载)
不错,有帮助
--brief
阅读排行榜
1. 类string的构造函数、拷贝构造函数和析构函数(6482)
2. Android中Context详解 ---- 你所不知道的Context (转载)(6293)
3. RJ48线序及RJ48的自环线缆做法(6047)
4. android控件详解----TextView(转载)(5440)
5. canvas 里drawbitmap方法(5224)
评论排行榜
1. 如何判断一点在三角形内(转)(8)
2. 类string的构造函数、拷贝构造函数和析构函数(4)
3. 深信服笔试(转)(4)
4. Android开发多线程断点续传下载器 (转载)(2)
5. 笔试题(2)
PackageInstaller 原理简述(转)
http://topic.csdn.net/u/20110410/23/43571CFA-87B2-4E36-880C-1FA499BA32B0.html
应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。
Android应用安装有如下四种方式
1
. 系统应用安装――开机时完成,没有安装界面
2
. 网络下载应用安装――通过market应用完成,没有安装界面
3
. ADB工具安装――没有安装界面。
4
. 第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。
应用安装的流程及路径
应用安装涉及到如下几个目录:
system
/
app 系统自带的应用程序,无法删除
data
/
app 用户程序安装的目录,有删除权限。
安装时把apk文件复制到此目录
data
/
data 存放应用程序的数据
Data
/
dalvik
-
cache 将apk中的dex文件安装到dalvik
-
cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)
安装过程:复制APK安装包到data
/
app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik
-
cache目录,并data
/
data目录下创建对应的应用数据目录。
卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。
一、系统应用安装:
PackageManager Service处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务
(源文件路径:android\frameworks\base\services\java\com\android\server\ PackageManagerService.java)
PackageManager Service服务启动的流程:
1
. 首先扫描安装“system\framework”目录下的jar包
1
. scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM,
scanMode
|
SCAN_NO_DEX);
2
.第二步扫描安装“system\app”目录下的各个系统应用
scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);
3
.第三步扫描“data\app”目录,即用户安装的第三方应用
scanDirLI(mAppInstallDir,
0
, scanMode);
4
.第四步扫描
"
data\app-private
"
目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)。
scanDirLI(mDrmAppPrivateInstallDir,
0
, scanMode
|
SCAN_FORWARD_LOCKED);
安装应用的过程
1
.scanDirLI(File dir,
int
flags,
int
scanMode) 遍历安装指定目录下的文件
2
.scanPackageLI(File scanFile,
File destCodeFile, File destResourceFile,
int
parseFlags,
int
scanMode) 安装package文件
3
.scanPackageLI(
File scanFile, File destCodeFile, File destResourceFile,
PackageParser.Package pkg,
int
parseFlags,
int
scanMode)
通过解析安装包parsePackage获取到安装包的信息结构
4
.mInstaller.install(pkgName, pkg.applicationInfo.uid,
pkg.applicationInfo.uid); 实现文件复制的安装过程
(源文件路径:frameworks\base\cmds\installd\installd.install)
二、从market上下载应用:
Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager的接口安装,调用接口如下:
public
void
installPackage(
final
Uri packageURI,
final
IPackageInstallObserver observer,
final
int
flags)
final
Uri packageURI:文件下载完成后保存的路径
final
IPackageInstallObserver observer:处理返回的安装结果
final
int
flags:安装的参数,从market上下载的应用,安装参数为
-
r (replace)
installPackage接口函数的安装过程:
1
.
public
void
installPackage(
final
Uri packageURI,
final
IPackageInstallObserver observer,
final
int
flags,
final
String installerPackageName)
final
String installerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数
2
.File tmpPackageFile
=
copyTempInstallFile(packageURI, res);
把apk文件复制到临时目录下的临时文件
3
.
private
void
installPackageLI(Uri pPackageURI,
int
pFlags,
boolean
newInstall, String installerPackageName,
File tmpPackageFile, PackageInstalledInfo res)
解析临时文件,获取应用包名pkgName
=
PackageParser.parsePackageName(
tmpPackageFile.getAbsolutePath(),
0
);
4
.判断如果带有参数INSTALL_REPLACE_EXISTING,则调用replacePackageLI(pkgName,
tmpPackageFile,
destFilePath, destPackageFile, destResourceFile,
pkg, forwardLocked, newInstall, installerPackageName,
res)
5
.如果没有,则调用installNewPackageLI(pkgName,
tmpPackageFile,
destFilePath, destPackageFile, destResourceFile,
pkg, forwardLocked, newInstall, installerPackageName,
res);
6
.
private
PackageParser.Package scanPackageLI(
File scanFile, File destCodeFile, File destResourceFile,
PackageParser.Package pkg,
int
parseFlags,
int
scanMode)
scanPackageLI以后的流程,与开机时的应用安装流程相同。
三、从ADB工具安装
Android Debug Bridge (adb) 是SDK自带的管理设备的工具,通过ADB命令行的方式也可以为手机或模拟器安装应用,其入口函数源文件为pm.java
(源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)
ADB命令行的形式为adb install
<
path_to_apk
>
,还可以带安装参数如:
"
-l
"
"
-r
"
"
-i
"
"
-t
"
函数runInstall()中判断参数
"
-l
"
――INSTALL_FORWARD_LOCK
"
-r
"
—— INSTALL_REPLACE_EXISTING
"
-i
"
——installerPackageName
"
-t
"
——INSTALL_ALLOW_TEST
我们常用的参数为
-
r,表示覆盖安装手机上已安装的同名应用。从market上下载的应用,也是直接传入这个参数安装的。
runInstall与market调用同样的接口完成应用安装。
public
void
installPackage(android.net.Uri packageURI, android.content.pm.IPackageInstallObserver observer,
int
flags, java.lang.String installerPackageName)
四、第三方应用安装――通过SD卡里的APK文件安装
把APK安装包保存在SD卡中,从手机里访问SD卡中的APK安装包,点击就可以启动安装界面,系统应用Packageinstaller.apk处理这种方式下的安装及卸载界面流程,如下图:
PackageInstallerActivity负责解析包,判断是否是可用的Apk文件
创建临时安装文件
/
data
/
data
/
com.android.packageinstaller
/
files
/
ApiDemos.apk
并启动安装确认界面startInstallConfirm,列出解析得到的该应用基本信息。如果手机上已安装有同名应用,则需要用户确认是否要替换安装。
确认安装后,启动InstallAppProgress,调用安装接口完成安装。
pm.installPackage(mPackageURI, observer, installFlags);
其它:
1
. PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。
2
.手机数据区目录“data
/
system
/
packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。
posted on 2012-04-08 22:29
life02
阅读(563)
评论(0)
编辑
收藏
引用
所属分类:
android组件学习
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
PackageInstaller 原理简述(转)
Android开发之道(10)Handler本质简析与使用实例 (转载)
Android Service 服务(三)—— bindService与remoteService (转载)
android 中 涉及到context的时候this和this.getApplictionContext的区别 (转载)
Android Service学习之AIDL, Parcelable和远程服务 (转载)
Activity的跳转与传值 (转载)
android学习视频网站
Android学习笔记(A-10)_记录与出错(LogCat的使用)(转载)
Thread、Looper、Handler和Message 解开迷惑 (转)
Android 核心分析 之七------Service深入分析(转)
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © life02