launcher.java代码_Launcher 启动应用程序

请求 AMS 创建应用服务进程

Launcher 通过调用 AMS 请求创建应用程序的进程

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,

boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,

boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,

String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {

.....

// 获取要创建应用程序进程的用户 ID

final int userId = UserHandle.getUserId(app.uid);

int uid = app.uid;

// 给用户组的 id 进行赋值

int[] gids = null;

gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid));

gids[1] = UserHandle.getCacheAppGid(UserHandle.getAppId(uid));

gids[2] = UserHandle.getUserGid(UserHandle.getUserId(uid));

// 启动进程

startResult = Process.start(entryPoint,

app.processName, uid, uid, gids, debugFlags, mountExternal,

app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,

app.info.dataDir, invokeWith, entryPointArgs);

}

Process 的实例对象是 ZygoteProcess,这里是请求 ZygoteProcess 创建一个进程,并且创建成功后悔调用它的 main 函数

frameworks/base/core/java/android/os/ZygoteProcess.java

public final Process.ProcessStartResult start(final String processClass,

final String niceName,

int uid, int gid, int[] gids,

int debugFlags, int mountExternal,

int targetSdkVersion,

String seInfo,

String abi,

String instructionSet,

String appDataDir,

String invokeWith,

String[] zygoteArgs) {

try {

return startViaZygote(processClass, niceName, uid, gid, gids,

debugFlags, mountExternal, targetSdkVersion, seInfo,

abi, instructionSet, appDataDir, invokeWith, zygoteArgs);

} catch (ZygoteStartFailedEx ex) {

Log.e(LOG_TAG,

"Starting VM process through Zygote failed");

throw new RuntimeException(

"Starting VM process through Zygote failed", ex);

}

}

start和startViaZygote实际上是通过 openZygoteSocketIfNeed 函数请求和 Zygote 服务建立 Socket 通信

private ZygoteState openZygoteSocketIfNeeded(String abi) throws ZygoteStartFailedEx {

if (primaryZygoteState == null || primaryZygoteState.isClosed()) {

try {

primaryZygoteState = ZygoteState.connect(mSocket);

} catch (IOException ioe) {

throw new ZygoteStartFailedEx("Error connecting to primary zygote", ioe);

}

}

if (primaryZygoteState.matches(abi)) {

return primaryZygoteState;

}

// The primary zygote didn't match. Try the secondary.

if (secondaryZygoteState == null || secondaryZygoteState.isClosed()) {

try {

secondaryZygoteState = ZygoteState.connect(mSecondarySocket);

} catch (IOException ioe) {

throw new ZygoteStartFailedEx("Error connecting to secondary zygote", ioe);

}

}

}

ZygoteInit 服务接收到 AMS 的 Socket 链接

Zygote 服务在被 init 服务创建的时候就启动了一个 Socket 服务,等待着 AMS 的接入

zygoteServer.runSelectLoop(abiList);

ZygoteServer 的 runSelectLoop

frameworks/base/core/java/com/android/internal/os/ZygoteServer.java

在请求第一次进入的时候,会将请求放入到集合中管理,再发起下一次轮训的时候会调用 ZygoteConnection 的 runOnce 方法解析请求

Runnable runSelectLoop(String abiList) {

ArrayList socketFDs = new ArrayList<>();

ArrayList peers = new ArrayList<>();

while (true) {

....

for (int i = pollFds.length - 1; i >= 0; --i) {

if ((pollFds[i].revents & POLLIN) == 0) {

continue;

}

if (i == 0) {

ZygoteConnection newPeer = acceptCommandPeer(abiList);

peers.add(newPeer);

fds.add(newPeer.getFileDesciptor());

} else {

boolean done = peers.get(i).runOnce(this);

if (done) {

peers.remove(i);

fds.remove(i);

}

}

}

....

}

}

ZygoteConnection 的 runOnce 方法

解析启动进程的参数

创建应用的进程

处理子进程

boolean runOnce(ZygoteServer zygoteServer) throws Zygote.MethodAndArgsCaller {

Arguments parsedArgs = null;

FileDescriptor[] descriptors;

try {

args = readArgumentList();

// 根据传入的参数创建进程

pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,

parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,

parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.instructionSet,

parsedArgs.appDataDir);

}catch(IOException ex){

return true;

}

// 创建好进程,让后续的代码运行在自进程中

// 如果在子进程中,关闭之前为 Zygote 创建的服务,因为子进程是 fork 自 zygote 的,会持有 zygote 的全部内容。

if (pid == 0) {

// in child

zygoteServer.closeServerSocket();

IoUtils.closeQuietly(serverPipeFd);

serverPipeFd = null;

// 处理子进程

handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr);

// should never get here, the child is expected to either

// throw Zygote.MethodAndArgsCaller or exec().

return true;

}

}

handleChildProc 会在fork出来的进程中运行,调用了 ZygoteInit

ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion,

parsedArgs.remainingArgs, null /* classLoader */);

调用 ZygoteInit 为当前的应用进程创建 Binder 线程池

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,

String[] argv, ClassLoader classLoader) {

.....

RuntimeInit.commonInit();

// 创建 Binder 线程池

ZygoteInit.nativeZygoteInit();

// 调用应用程序的 ActivityThread 的 main 函数

return RuntimeInit.applicationInit(targetSdkVersion,disabledCompatChanges, argv,

classLoader);

}

RuntimeInit.application 会调用 ActivityThread 的 main 函数

protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,

String[] argv, ClassLoader classLoader) {

// 在新的进程环境下调用 ActivityThread 的 main 函数

invokeStaticMain(args.startClass, args.startArgs, classLoader);

}

ActivityThread 的 main 函数

ActivityThread thread = new ActivityThread();

thread.attach(false, startSeq);

if (sMainThreadHandler == null) {

sMainThreadHandler = thread.getHandler();

}

if (false) {

Looper.myLooper().setMessageLogging(new

LogPrinter(Log.DEBUG, "ActivityThread"));

}

// End of event ActivityThreadMain.

Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

Looper.loop();

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值