IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android源码阅读记录 -> 正文阅读

[移动开发]Android源码阅读记录

从Android SystemServer开始

安卓的Framework层也就是zygote是从SystemServer开始的,所有重要的上层服务都集中在SystemServer这个进程中,这个进程的名字为app_process(64位为app_process64).这个进程的启动脚本示例如下:

init.zygote64.rc

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
? ? class main
? ? priority -20
? ? user root
? ? group root readproc reserved_disk
? ? socket zygote stream 660 root system
? ? socket usap_pool_primary stream 660 root system
? ? onrestart write /sys/android_power/request_state wake
? ? onrestart write /sys/power/state on
? ? onrestart restart audioserver
? ? onrestart restart cameraserver
? ? onrestart restart media
? ? onrestart restart netd
? ? onrestart restart wificond
? ? onrestart restart vendor.servicetracker-1-1
? ? writepid /dev/cpuset/foreground/tasks

可以看到,当我们这个进程被重启以后很多需要被依赖的本地进程需要被拉起来,这些restart的server都是以binder的服务端存在的本地服务,提供了例如音频camera等的基础服务功能,我们Framework只是作为客户端会去调用这些服务里的一些功能,然后framework再为上层应用提供接口,作为中间人统筹管理这些所有的硬件资源。

上面提到的app_process这个进程源码目录在frameworks/base/cmds/app_pro
cess它只是作为一个启动器的存在,只有一个源文件就是app_main.cpp它可以被编译成32以及64位的版本。

这里的main函数通过AppRuntime继承自AndroidRuntime来启动java的类。

if (zygote) {
? ? ? ? runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
? ? } else if (className) {
? ? ? ? runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
? ? } else {
? ? ? ? fprintf(stderr, "Error: no class name or --zygote supplied.\n");
? ? ? ? app_usage();
? ? ? ? LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
? ? }
这里的zygote是通过参数来判断的,我们上面的rc文件中可以看到我们通过这个进程带的参数是

--zygote --start-system-server

启动systemserver是从这里开始的,当然这个进程也可以启动普通app,当后面启动应用的时候还需要这个进程来创建镜像。

具体的如何启动vm然后怎么加载的java类我们先不做探讨。

我们知道在启动zygote的时候是调用了ZygoteInit这个类来完成的,它同样有个main函数如下:

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

?@UnsupportedAppUsage
? ? public static void main(String argv[]) {
? ? ? ? ZygoteServer zygoteServer = null;

。。。。。省略一部分


? ? ? ? ? ? zygoteServer = new ZygoteServer(isPrimaryZygote);

? ? ? ? ? ? if (startSystemServer) {
? ? ? ? ? ? ? ? Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);

? ? ? ? ? ? ? ? // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
? ? ? ? ? ? ? ? // child (system_server) process.
? ? ? ? ? ? ? ? if (r != null) {
? ? ? ? ? ? ? ? ? ? r.run();
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }

这里可以看到通过forkSystemServer继续去创建

?private static Runnable forkSystemServer(String abiList, String socketName,
? ? ? ? ? ? ZygoteServer zygoteServer) {

这个函数里有个参数列表比较重要

/* Hardcoded command line to start the system server */
? ? ? ? String args[] = {
? ? ? ? ? ? ? ? "--setuid=1000",
? ? ? ? ? ? ? ? "--setgid=1000",
? ? ? ? ? ? ? ? "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
? ? ? ? ? ? ? ? ? ? ? ? + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
? ? ? ? ? ? ? ? "--capabilities=" + capabilities + "," + capabilities,
? ? ? ? ? ? ? ? "--nice-name=system_server",
? ? ? ? ? ? ? ? "--runtime-args",
? ? ? ? ? ? ? ? "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
? ? ? ? ? ? ? ? "com.android.server.SystemServer",
? ? ? ? };

这里的setgroups限制了那些uid的访问权限。以及指定了我们的类com.android.server.SystemServer

然后通过Zygote这个类继续创建如下:

?/* Request to fork the system server process */
? ? ? ? ? ? pid = Zygote.forkSystemServer(
? ? ? ? ? ? ? ? ? ? parsedArgs.mUid, parsedArgs.mGid,
? ? ? ? ? ? ? ? ? ? parsedArgs.mGids,
? ? ? ? ? ? ? ? ? ? parsedArgs.mRuntimeFlags,
? ? ? ? ? ? ? ? ? ? null,
? ? ? ? ? ? ? ? ? ? parsedArgs.mPermittedCapabilities,
? ? ? ? ? ? ? ? ? ? parsedArgs.mEffectiveCapabilities);

当我们第一次创建子进程成功的时候这个pid肯定返回的是0,到这我们的SystemServer就要被启动了,并被作为主进程存在。

frameworks\base\core\java\com\android\internal\os\Zygote.java

?public static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
? ? ? ? ? ? int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
? ? ? ? ZygoteHooks.preFork();
? ? ? ? // Resets nice priority for zygote process.
? ? ? ? resetNicePriority();
? ? ? ? int pid = nativeForkSystemServer(
? ? ? ? ? ? ? ? uid, gid, gids, runtimeFlags, rlimits,
? ? ? ? ? ? ? ? permittedCapabilities, effectiveCapabilities);
? ? ? ? // Enable tracing as soon as we enter the system_server.
? ? ? ? if (pid == 0) {
? ? ? ? ? ? Trace.setTracingEnabled(true, runtimeFlags);
? ? ? ? }
? ? ? ? ZygoteHooks.postForkCommon();
? ? ? ? return pid;
? ? }

这里的nativeForkSystemServer就到了c++的底层程序了属于linux的编程,很容易就可以创建子进程。

这样我们就可以继续分析SystemServer。

SystemServer可以开始了,去到它的main函数。

frameworks\base\services\java\com\android\server\SystemServer.java

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:29:58  更:2022-05-05 11:32:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:07:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码