本篇结合上一篇https://blog.youkuaiyun.com/we1less/article/details/117485532?spm=1001.2014.3001.5501
上一篇方法最后调用了
startViaZygote(processClass, niceName, uid, gid, gids, debugFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
1
startViaZygote() frameworks/base/core/java/android/os/ZygoteProcess.java
最后调用了 zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);
注意这块在函数参数部分调用了openZygoteSocketIfNeeded(abi)
private Process.ProcessStartResult startViaZygote(final String processClass,
final String niceName,
final int uid, final int gid,
final int[] gids,
int debugFlags, int mountExternal,
int targetSdkVersion,
String seInfo,
String abi,
String instructionSet,
String appDataDir,
String invokeWith,
String[] extraArgs)
throws ZygoteStartFailedEx {
ArrayList<String> argsForZygote = new ArrayList<String>();
// --runtime-args, --setuid=, --setgid=,
// and --setgroups= must go first
argsForZygote.add("--runtime-args");
argsForZygote.add("--setuid=" + uid);
argsForZygote.add("--setgid=" + gid);
...//以下省略配置参数
synchronized(mLock) {
return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);
}
}
2
zygoteSendArgsAndGetResult() frameworks/base/core/java/android/os/ZygoteProcess.java
见名知其意 发送参数(就是上面方法配置的)、返回结果 在这里就指代与Socket通信
@GuardedBy("mLock")
private static Process.ProcessStartResult zygoteSendArgsAndGetResult(
ZygoteState zygoteState, ArrayList<String> args)
throws ZygoteStartFailedEx {
try {
...
final BufferedWriter writer = zygoteState.writer;
final DataInputStream inputStream = zygoteState.inputStream;
writer.write(Integer.toString(args.size()));
writer.newLine();
for (int i = 0; i < sz; i++) {
String arg = args.get(i);
writer.write(arg);
writer.newLine();
}
writer.flush();
...
result.pid = inputStream.readInt();
result.usingWrapper = inputStream.readBoolean();
if (result.pid < 0) {
throw new ZygoteStartFailedEx("fork() failed");
}
return result;
} catch (IOException ex) {
zygoteState.close();
throw new ZygoteStartFailedEx(ex);
}
}
上面代码中的zygoteState.writer是被封装在frameworks/base/core/java/android/os/ZygoteProcess.java类
里面的一个静态内部类public static class ZygoteState
其构造器是这样的
private ZygoteState(LocalSocket socket, DataInputStream inputStream,
BufferedWriter writer, List<String> abiList) {
this.socket = socket;
this.i
Android跨进程通信及相关方法调用分析

本文结合相关文章,详细分析了Android利用Socket进行跨进程通信的过程。涉及startViaZygote、zygoteSendArgsAndGetResult等方法调用,还阐述了反射调用android.app.ActivityThread的main函数,以及后续双向通信、消息发送等操作,最终实现Activity的启动调度。
最低0.47元/天 解锁文章
2168





