String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
Process.ProcessStartResult startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
app.info.dataDir, entryPointArgs);
}
所以他是会调用Process的start方法来启动新应用。
/frameworks/base/core/java/android/os/Process.java
依次经过几个方法后,最终到达zygoteSendArgsAndGetResult方法执行。zygoteSendArgsAndGetResult会把启动应用的参数告诉Zygote。Zygote干完事就把结果告诉SystemServer。
private static ProcessStartResult zygoteSendArgsAndGetResult(
ZygoteState zygoteState, ArrayList args)
throws ZygoteStartFailedEx {
final BufferedWriter writer = zygoteState.writer; //写参数给Zygote
final DataInputStream inputStream = zygoteState.inputStream; //用来读Zygote的回应
writer.write(Integer.toString(args.size()));
writer.newLine();
int sz = args.size();
for (int i = 0; i < sz; i++) {
String arg = args.get(i);
if (arg.indexOf(‘\n’) >= 0) {
throw new ZygoteStartFailedEx(
“embedded newlines not allowed”);
}
writer.write(arg); //把参数一行行写出去
writer.newLine();
}
writer.flush(); //把启动参数告诉Zygote
// Should there be a timeout on this?
ProcessStartResult result = new ProcessStartResult();
result.pid = inputStream.readInt(); //读取Zygote的反应
if (result.pid < 0) {
throw new ZygoteStartFailedEx(“fork() failed”);
}
result.usingWrapper = inputStream.readBoolean();
return result;
} catch (IOException ex) {
zygoteState.close();
throw new ZygoteStartFailedEx(ex);
}
}
启动参数大概有下面几个,主要是入口类ActivityThread,这个类老厉害了,是所有应用的入口类。另外还有uid,gid,应用数据目录等等参数。
然后数据传出去了,就会在Zygote收到,在runSelectLoop收到一个远方的连接。
/frameworks/base/core/java/com/[android](https://link.jianshu.com/?t=http://androidxref.com/6.0.0_r1/xref/frameworks/base/core/java
/com/android/)/internal/os/ZygoteInit.java
private static void runSelectLoop(String abiList) throws MethodAndArgsCaller {
…
boolean done = peers.get(i).runOnce();
…
}
进而进入runOnce方法,调用forkAndSpecialize完成进程的fork操作,哈哈。
/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
boolean runOnce() throws ZygoteInit.MethodAndArgsCaller {
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
parsedArgs.niceName, fdsToClose, parsedArgs.instructionSet,
parsedArgs.appDataDir);
}
一.应用是如何跟Zgyote通信的
上面是系统进程与Zygote进行socket通信,应用要怎么跟Zygote通信呢?我用了反射调用Process类的openZygoteSocketIfNeeded 方法,简单通信了一番。下面是简单例子来获取cpu的架构。
package com.wenfeng.zygotesocketdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static final String TAG = “zygotesocketdemotag”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
String abi = “arm64-v8a”;
//process 反射调用android.os.Process类,获取openZygoteSocketIfNeeded方法
Class<?> ProcessClazz = Class.forName(“android.os.Process”);
Method method = ProcessClazz.getDeclaredMethod(“openZygoteSocketIfNeeded”, String.class);
method.setAccessible(true);
//ZygoteState
Class<?> ZygoteStateClazz = Class.forName(“android.os.Process$ZygoteState”);
Field abilistfeild=ZygoteStateClazz.getDeclaredField(“abiList”);
abilistfeild.setAccessible(true);
//连接zygote,返回一个ZygoteState的对象
Object ZygoteStateobj=method.invoke(null,abi);
//获取ZygoteState的abiList值,他的值就是cpu的架构
List abilist= (List) abilistfeild.get(ZygoteStateobj);
for(int i = 0 ;i < abilist.size();i++){
Log.i(TAG,"hehe "+ " "+ abilist.get(i));
}
}catch (Exception e){
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助**。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-G2u1yY4C-1719051618124)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取