PackageManagerService启动

这个是本人总结的,mkw的framework面试的资料,需要具体的视频和其他的资料,TB店铺 纳新工作室  中找framework 资料就好哈。

ContextImpl 持有ApplicationPackageManager ,然后ApplicationPackageManager 持有 IPakcageManager.binder,可以和IPackageManager 之间进行通信。

1.同样从systemServer.java开始启动 

private void startBootstrapServices(){
    ...
    mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
    ...
    mPackageManagerService = PackageManagerService.main(mSystemContext,installer,mFactoryTestMode!=FactoryTest.FACTORY_TEST_OFF,mOnlyCore);
    mFirstBoot = mPackageManagerService.isFirstBoot();
    mPackageManager = mSystemContext.getPackageManager();
    ...
}

SystemServer::startOtherServices

private void startOtherServices(){
    ...
    mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
    mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
    ...
    mPackageManagerService.systemReady();
    ...
    mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);
}}

PackageMs::main

public static PackageManagerService main(Context context,Installer installer,boolean factoryTest,boolean onlyCore){
    ...
    PackageManagerService m = new PackageManagerService(context,installer,...)
    ...
    ServiceManager.addService("package",m);
    return m;
}

packageMs 初始化

public PackageManagerService(Context context,Installer installser,boolean factoryTest,boolean nlyCore){
    ...
    //PMS_START
    //1.创建settings
    mSettings = new Settings(mPackages);
    //2.system phone log nfc bluetooth shell  添加到setting
    mSettings.addSharedUserLPw("android.uid.system",Process.SYSTEM_UID,ApplicationInfo.FLAG_SYSTEM,ApplicationInfo.PRIVATE_FLAG_PRIVILEDGE);
    mSettings.addSharedUserLPw("android.uid.phone",RADIO_UID,
    log nfc bluetooth shell...
    
    //初始化SystemConfig
    SystemConfig systemConfig = SystemConfig.getInstance();
    mGlobalGids = systemConfig.getGlobalGids();
    mSystemPermissions = systemConfig.getSystemPermissions();
    mAvailableFratures = systemConfig.getAvailableFeatures();
    
    synchronized(mInstallLock){
        synchronized(mPackages){
            mHandlerThread = new ServiceThread(TAG,Process.THREAD_PRIORITY_BACKGROUND,true);
            mHandlerThread.start();
            //创建packageHandler
            mHandler = new PackageHandler(mHandlerThread.getLooper());
            Watchdog.getInstance().addThread(mHandler,WATCHDOG_TIMEOUT);
            ...
            ArrayMap<String,String> libConfig = systemConfig.getSharedLibraries();
            for(int i=0;i<libConfig.size();i++){
                mSharedLibraries.put(libConfig.keyAt(i),new SharedLibraryEntry(libConfig.valueAt(i)));
            }
        }   
        
        //PM_SYSTEM_SCAN_STSRT
        ...
        final String bootClassPath = System.getenv("BOOTCLASSPATH");
        final String systemServerClassPath = system.getenv("SYSTEMSERVERCLASSPATH");
        ...
        //对满足调价的jar和apk进行dex优化
        mInstaller.dexopt(lib,Process.SYSTEM_UID,dexCodeInstructionSet,
        dexoptNeeded,DEXOPT_PUBLIC/**/)
        ...
        //2扫描system/app system/priv-app
        //Collect ordinary system packages
        final File systemAppDir =  new File(Environment.getRootDirectiry(),"app");
        scanDirTracedLI(systemAppDir,mDefParseFlags|PackageParser.PARSE_IS_SYSTEM|
        |PackageParse.PARSE_IS_SYSTEM_DIR,scanFlags,0);
        ...
        //Collect all oem packages
        final File oemAppDir = new File(Environment.getOemDirectory(),"app");
        scanDirTraceLI(oemAppDir,mDefParseFlags|PackageParse.PAESE_IS_SYSTEM|PackageParse.PAESE_IS_SYSTEM_DIR,scanFlags,0);
        ...
        //look for any incomplete package installations
        ArrayList<PackageSetting> deletePkgsList =
        mSettings.getListOfIncompleteInstallPackagesLPr();

        for (int i = 0; i < deletePkgsList.size(); i++) {
        // Actual deletion of code and data will be handled by later
        // reconciliation step
        final String packageName = deletePkgsList.get(i).name;
        logCriticalInfo(Log.WARN, "Cleaning up incompletely
        installed app: " + packageName);
        synchronized (mPackages) {
        mSettings.removePackageLPw(packageName);}}
        //处理三方app,太复杂了
}}} }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值