2011-9-26 4:17:47

 

2011-9-26 4:17:47

ActivityManagerService


    final ProcessRecord startProcessLocked(String processName,
            ApplicationInfo info, boolean knownToBeDead, int intentFlags,
            String hostingType, ComponentName hostingName, boolean allowWhileBooting) {
           
           
           
        ProcessRecord app = getProcessRecordLocked(processName, info.uid);
       
        查找么
       
            final ProcessRecord getProcessRecordLocked(
            String processName, int uid) {
        if (uid == Process.SYSTEM_UID) {
            // The system gets to run in any process.  If there are multiple
            // processes with the same uid, just pick the first (this
            // should never happen).
            SparseArray<ProcessRecord> procs = mProcessNames.getMap().get(
                    processName);
            return procs != null ? procs.valueAt(0) : null;
        }
        ProcessRecord proc = mProcessNames.get(processName, uid);
        return proc;
    }
   
    也就说系统UID可能有多个
   
   
       
        // We don't have to do anything more if:
        // (1) There is an existing application record; and
        // (2) The caller doesn't think it is dead, OR there is no thread
        //     object attached to it so we know it couldn't have crashed; and
        // (3) There is a pid assigned to it, so it is either starting or
        //     already running.
        if (DEBUG_PROCESSES) Slog.v(TAG, "startProcess: name=" + processName
                + " app=" + app + " knownToBeDead=" + knownToBeDead
                + " thread=" + (app != null ? app.thread : null)
                + " pid=" + (app != null ? app.pid : -1));
        if (app != null && app.pid > 0) {
            if (!knownToBeDead || app.thread == null) {
                // We already have the app running, or are waiting for it to
                // come up (we have a pid but not yet its thread), so keep it.
                if (DEBUG_PROCESSES) Slog.v(TAG, "App already running: " + app);
                return app;
            } else {
                // An application record is attached to a previous process,
                // clean it up now.
                if (DEBUG_PROCESSES) Slog.v(TAG, "App died: " + app);
                handleAppDiedLocked(app, true);
            }
        }

        String hostingNameStr = hostingName != null
                ? hostingName.flattenToShortString() : null;
       
        if ((intentFlags&Intent.FLAG_FROM_BACKGROUND) != 0) {
            // If we are in the background, then check to see if this process
            // is bad.  If so, we will just silently fail.
            if (mBadProcesses.get(info.processName, info.uid) != null) {
                if (DEBUG_PROCESSES) Slog.v(TAG, "Bad process: " + info.uid
                        + "/" + info.processName);
                return null;
            }
        } else {
            // When the user is explicitly starting a process, then clear its
            // crash count so that we won't make it bad until they see at
            // least one crash dialog again, and make the process good again
            // if it had been bad.
            if (DEBUG_PROCESSES) Slog.v(TAG, "Clearing bad process: " + info.uid
                    + "/" + info.processName);
            mProcessCrashTimes.remove(info.processName, info.uid);
            if (mBadProcesses.get(info.processName, info.uid) != null) {
                EventLog.writeEvent(EventLogTags.AM_PROC_GOOD, info.uid,
                        info.processName);
                mBadProcesses.remove(info.processName, info.uid);
                if (app != null) {
                    app.bad = false;
                }
            }
        }
       
        if (app == null) {
            app = newProcessRecordLocked(null, info, processName);
            mProcessNames.put(processName, info.uid, app);
        } else {
            // If this is a new package in the process, add the package to the list
            app.addPackage(info.packageName);
        }

        // If the system is not ready yet, then hold off on starting this
        // process until it is.
        if (!mProcessesReady
                && !isAllowedWhileBooting(info)
                && !allowWhileBooting) {
            if (!mProcessesOnHold.contains(app)) {
                mProcessesOnHold.add(app);
            }
            if (DEBUG_PROCESSES) Slog.v(TAG, "System not ready, putting on hold: " + app);
            return app;
        }

        startProcessLocked(app, hostingType, hostingNameStr);
        return (app.pid != 0) ? app : null;
    }
   
   
     ActivityManagerService.startProcessLocked

 

    这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:


view plaincopy to clipboardprint?public final class ActivityManagerService extends ActivityManagerNative   
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {   
   
    ......   
   
    private final void startProcessLocked(ProcessRecord app,   
                String hostingType, String hostingNameStr) {   
   
        ......   
   
        try {   
            int uid = app.info.uid;   
            int[] gids = null;   
            try {   
                gids = mContext.getPackageManager().getPackageGids(   
                    app.info.packageName);   
            } catch (PackageManager.NameNotFoundException e) {   
                ......   
            }   
               
            ......   
   
            int debugFlags = 0;   
               
            ......   
               
            int pid = Process.start("android.app.ActivityThread",   
                mSimpleProcessManagement ? app.processName : null, uid, uid,   
                gids, debugFlags, null);   
               
            ......   
   
        } catch (RuntimeException e) {   
               
            ......   
   
        }   
    }   
   
    ......   
   
}   
public final class ActivityManagerService extends ActivityManagerNative 
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback { 
 
    ...... 
 
    private final void startProcessLocked(ProcessRecord app, 
                String hostingType, String hostingNameStr) { 
 
        ...... 
 
        try { 
            int uid = app.info.uid; 
            int[] gids = null; 
            try { 
                gids = mContext.getPackageManager().getPackageGids( 
                    app.info.packageName); 
            } catch (PackageManager.NameNotFoundException e) { 
                ...... 
            } 
             
            ...... 
 
            int debugFlags = 0; 
             
            ...... 
             
            int pid = Process.start("android.app.ActivityThread", 
                mSimpleProcessManagement ? app.processName : null, uid, uid, 
                gids, debugFlags, null); 
             
            ...... 
 
        } catch (RuntimeException e) { 
             
            ...... 
 
        } 
    } 
 
    ...... 
 
}       它调用了Process.start函数开始为应用程序创建新的进程,注意,它传入一个第一个参数为"android.app.ActivityThread",这就是进程初始化时要加载的Java类了,把这个类加载到进程之后,就会把它里面的静态成员函数main作为进程的入口点,后面我们会看到。


       Process.start  哦!!
      

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值