Android PackageManagerService流程详细分析(五)之packages

接着上一节(四)的分析,看看上一节的PackageManagerService构造函数的代码如:

public PackageManagerService(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) 
{
    // 前面省略...

    // 第二节讨论过
    mInstaller = installer;

    synchronized (mInstallLock) {
    // writer
    synchronized (mPackages) {
    mHandlerThread.start();
    // 第三节讨论过
    mHandler = new PackageHandler(mHandlerThread.getLooper());
    // 第四节讨论过
    readPermissions();

    // 本节分析内容
    mRestoredSettings = mSettings.readLPw(sUserManager.getUsers(false),
                    mSdkVersion, mOnlyCore);

    } 

    // 后面省略...
}

mSettings.readLPw(sUserManager.getUsers(false),mSdkVersion, mOnlyCore)
主要目的就是读取packages.xml生成mPackages,检查/data/system/packages.xml是否存在,第一次开机的时候该文件不存在,而以后每次系统如果有apk变动如新apk安装、删除、更新等,都会将相关信息记录到该文件;下次开机直接从里面读取相关信息添加到内存相关列表中。当有 apk升级,安装或删除时会更新这个文件。
主要的流程如下:
这里写图片描述
这里把有关setting相关的流程都画出来的,apk信息的读取是通过readLPw来完成的。

具体的代码就不分析了,很容易看懂,这里给出主要的代码流程(生成mPackages):

readLPw->
getPackageLPw->
addPackageSettingLPw->
mPackages.put(name, p);

在机器里的文件如下:
这里写图片描述

packages.list 的 数 据 格 式 是 :pkgName,userId,debugFlag,dataPath
下面是文件的一小段:

com.xtc.QSILoveKindergarten 10121 0 /data/data/com.xtc.QSILoveKindergarten
com.eebbk.cocos2dx.maorongrong 10026 1 /data/data/com.eebbk.cocos2dx.maorongrong
com.android.defcontainer 10076 0 /data/data/com.android.defcontainer
com.xtc.rynihao 10130 1 /data/data/com.xtc.rynihao
com.xtc.QSBrushTeeth 10118 0 /data/data/com.xtc.QSBrushTeeth
com.xtc.health.time.xyy 10067 1 /data/data/com.xtc.health.time.xyy
com.eebbk.DataInformation 10038 1 /data/data/com.eebbk.DataInformation
com.xtc.appmarket 10077 1 /data/data/com.xtc.appmarket
com.xtc.petsystem.resource 10062 1 /data/data/com.xtc.petsystem.resource
com.xtc.LGMathSupermarket 10113 0 /data/data/com.xtc.LGMathSupermarket
......

packages.xml复杂一点,不过主要特征如下(文件一小段):

......
<package name="com.xtc.LGHenBusy" codePath="/data/app/com.xtc.LGHenBusy-1.apk" nativeLibraryPath="/data/app-lib/com.xtc.LGHenBusy-1" flags="572996" ft="150891e0f20" it="150891e1786" ut="150891e1786" version="131" userId="10112">
<sigs count="1">
<cert index="0" />
</sigs>
<perms>
<item name="android.permission.DISABLE_KEYGUARD" />
<item name="android.permission.READ_EXTERNAL_STORAGE" />
<item name="android.permission.SYSTEM_ALERT_WINDOW" />
<item name="android.permission.INTERNET" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="android.permission.WRITE_SETTINGS" />
<item name="android.permission.CHANGE_WIFI_STATE" />
<item name="android.permission.ACCESS_WIFI_STATE" />
<item name="android.permission.RECORD_AUDIO" />
<item name="android.permission.ACCESS_NETWORK_STATE" />
<item name="android.permission.WAKE_LOCK" />
<item name="android.permission.MODIFY_AUDIO_SETTINGS" />
<item name="com.xtc.appmarket.permission.READ_LOCAL_APP" />
</perms>
......

数据结构参考源代码,可以很清楚知道每个元素是什么意义,包ft,it,ut等等,源码如下:
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章