|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)我们天天都在安装和卸载APK(安卓使用程序包文件),也许一天会有好几回,可是你有想过上面成绩吗?
- 甚么是PackageManager(保证理器)和PackageInstaller(程序安装包)?
- APK文件保留在Android的哪一个中央?
- APK文件安装历程的细节是如何的?
- PackageManager(保证理器)是如何保留数据的?
- 我应当往那里找PackageManager和PackageInstaller的源码?
1、甚么是PackageManager和PackageInstaller
PackageInstaller是安卓上默许的使用程序,用它来交互式地安装一般包文件。PackageInstaller供应了用户界面来办理使用大概包文件。PackageInstaller挪用一个叫InstallAppProgress的activity来猎取用户收回的指令。InstallAppProgress会哀求PackageManager服务,然后经由过程indalld来安装包文件。源码供应在/packages/apps/PackageInstaller上。
Installd这个体系保卫程序的主要脚色是猎取来自PackageManager服务的哀求,而该哀求是经由过程Linux套接字/dev/socket/installed取得的。
Installd利用办理员权限实行一系列的步骤来安装APK。参考:commands.c
PackageManger是一个实践上办理使用程序安装、卸载和晋级的API。当我们安装APK文件时,PackageManager会剖析APK包文件和显现确认信息。当我们点击OK按钮后,PackageManger会挪用一个叫“InstallPackage”的办法,这个办法有四个参数,也就是uri、installFlags、observer和installPackagename。PackageManger会启动一个叫“package”的service(服务),如今一切含混的工具会产生在这个service中。你能够在PackageInstaller源码中检察“PackageInstallAcitivity.java”和“InstallAppProgress.java”。PackageManger服务运转在体系服务历程中,而安装保卫程序(installd)作为一个当地历程运转着,他们都在体系启动时入手下手运转。
2、APK文件保留在Android的哪一个中央?
- 预装程序(即相机,日历和扫瞄器等)保留在/system/app/中。
- 用户安装程序(APIDemo,Any.do等)保留在/data/app/中。
- PackageManager创立数据目次/data/data//来保留数据库、sharedpreference、当地函数库弛缓存数据。
你大概会看到apk文件和统一个APK的*.odex文件,而ODEX文件是完整分歧的会商和目标了。
3、APK文件安装历程的细节是如何的?
上面的历程实行在PackageManger服务中。
- 守候;
- 增加一个包文件到安装历程的行列中;
- 断定符合的中央来安装包文件;
- 复制apk文件到一个给定的目次下;
- 断定使用的UID;
- 哀求installd保卫程序历程;
- 创立使用目次和设置权限;
- 提取dex代码到缓存目次中;
- 剖析packages.list、system、data和packages.xml的最新形态;
- 向体系发送播送动静,动静带有安装完效果果的名字Intent.ACTION_PACKAGE_ADDED:假如是更新,会带有新的(Intent.ACTION_PACKAGE_REPLACED)。
4、PackageManager(保证理器)是如何保留数据的?
PackageManager保留使用程序的信息在/data/system目次下的三个文件里。上面的例子是从Android4ICS(IceCreamSandwich)摹拟器提掏出来的图片。
1.packages.xml:这个文件包括一切的权限和Packages/Applications。
<p>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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<packages>
<last-platform-versionexternal="15"internal="15">
<permission-trees>
<permissions>
<itemname="android.permission.CHANGE_WIFI_MULTICAST_STATE"package="android"protection="1">
<itemname="android.permission.CLEAR_APP_USER_DATA"package="android"protection="2">
.
.
.
.
</item></item></permissions>
<p><packagecodepath="/system/app/Contacts.apk"flags="1"ft="136567b3990"it="136567b3990"name="com.android.contacts"nativelibrarypath= |
|