1. /data/system/packages.xml
++/data/system/packages.xml++由PackageManagerService.java生成,里面记录了系统当中安装的APK的所有属性,权限等信息。
当系统中的APK安装、删除、升级时,文件就会被更新,不要手动修改。
package代表一个APK的属性,它的属性含义如下:
name:APK的包名
codePath:安装路径。有/system/app系统APK和/data/app两种,
system:如果APK被安装在/system/app下,system的值为true;安装在/data/app下面的话,值为false
ts:时间戳
version:APK的版本号
sharedUserId/userId:Android系统启动一个普通的APK时,会为这个APK分配一个独立的UID,这就是userId。如果APK要和系统中其它APK使用相同的UID的话,那就是sharedUserId。
2 .安装目录
一个最一般的apk包(不是系统app,没有共享lib,不是装在sd上或是forward-lock的app)装完后内容会体现在这么几个目录:
/data/app // apk包
/data/app-lib// native lib
/data/data //数据目录,其中的lib目录指向上面的/data/app-lib目录/data/dalvik-cache/data@app@.apk@classes.dex //优化或编译后的Java bytecode
3.启动时安装
Android启动时会把已有的app安装一遍,过程主要分三部分:读取安装信息,扫描安装,写回安装信息。读取和写回主要是针对于一坨安装信息文件。
这些信息保证了启动后app与上一次的一致。关键步是扫描指定目录下的apk并安装。
Android中apk主要分布在以下几个目录,意味着启动时要扫描的主要也是这几个目录:
系统核心应用:/system/priv-app
系统app:/system/app
非系统app:/data/app(安装于手机存储的一般app)或/mnt/asec//pkg.apk(sdcard或forward-locked)
受DRM保护app:/data/app-private
vendor-specific的app: /vendor/app
资源型app:/system/framework
4.PMS 服务
System Server开始,实现在/frameworks/base/services/java/com/android/server/SystemServer.java
调用PMS的main()函数,其实现位于/frameworks/base/services/java/com/android/server/pm/PackageManagerService.java:
这里构造了PMS并加到ServiceManager中,这样其它的组件就可以用该服务了
5.android:persistent, 常驻的应用
在AndroidManifest.xml定义中,application有这么一个属性android:persistent
application PhoneApp既没有被Broadcast唤醒,也没有被其他service调用,
那么是android是通过什么方式来启动PhoneApp,是因为属性android:persistent。
在AndroidManifest.xml定义中,application有这么一个属性android:persistent,
根据字面意思来理解就是说该应用是可持久的,也即是。其实就是这么个理解,
被android:persistent修饰的应用会在系统启动之后被AM启动。
startProcessLocked in ActivityManagerService.java
ActivityManagerService
APP 定义为persistent就不kill
for (int ia=0; ia<NA; ia++) {
ProcessRecord app = apps.valueAt(ia);
if (app.persistent && !evenPersistent) {
Slog.e(TAG," killPackageProcessesLocked" +app.processName +"persistent do not kill");
// we don't kill persistent processes
continue;
}
网友评论