Dalvik VM进程系统(一):Zygote基础

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。

img

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,应用数据目录等等参数。

img

然后数据传出去了,就会在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行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值