总流程梳理
基础流程如图
其实对于普通的Framework人员一般都是从init相关开始
init
- main.cpp
//system/core/init/main.cpp
int main(int argc, char** argv) {
if (argc > 1) {
//省略。。
//完成selinux基础配置 进入 second_stage
if (!strcmp(argv[1], "selinux_setup")) {
return SetupSelinux(argv);
}
//主要完成init.rc的解析 往脚本添加action,并执行
//system/core/init/init.cpp
if (!strcmp(argv[1], "second_stage")) {
return SecondStageMain(argc, argv);
}
}
/**
system/core/init/first_stage_init.cpp 中完成
创建挂载所需文件目录 /dev/socke 等
完成重定向 ,启动init 并调用 启动 进入SetupSelinux 。
*/
return FirstStageMain(argc, argv);
}
- rc文件解析
init.rc
//system/core/rootdir/init.rc
//#当sys.boot_from_charger_mode为1时执行
on property:sys.boot_from_charger_mode=1
class_stop charger
//触发 late-init
trigger late-init
//省略。。。
on late-init
//触发zygote启动
trigger zygote-start
//省略。。。
on boot
# Start standard binderized HAL daemons
class_start hal
class_start core //启动划分到core组 这里会将sf和开机动画启动启动
//启动 servicemanager
on init
# Start essential services.
start servicemanager
start hwservicemanager
start vndservicemanager
zygote.rc
//system/core/rootdir/init.zygote64.rc
// 服务 名称 源码路径 传入参数 注意 这里可以看到 是使用app_process 启动
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 exec_background - system system -- /system/bin/vdc volume abort_fuse
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
critical window=${zygote.critical_window.minute:-off} target=zygote-fatal
app_process
//frameworks/base/cmds/app_process
static const char ZYGOTE_NICE_NAME[] = "zygote";
int main(int argc, char* const argv[])
{
//androidRunTime 构建
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
//省略
while (i < argc) {
const char* arg = argv[i++];
//判断是否zygote systemServer 和app
if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = ZYGOTE_NICE_NAME;
} else if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
} else if (strcmp(arg, "--application") == 0) {
application = true;
}
}
//省略..
if (zygote) {
// 进入ZygoteInit 并将参数传入 最后参数为 iceName为zygote 参数 start-system-server
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
//runTime 为AndroidRuntime
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
}
}
ZygoteInit
// com/android/internal/os/ZygoteInit.java
public static void main(String[] argv){
//省略
//zygote native构建
Zygote.initNativeState(isPrimaryZygote);
//创建 ZygoteServer 方便后来链接 构建
zygoteServer = new ZygoteServer(isPrimaryZygote);
// 根据传入参数进行fork 构建systemServer
if (startSystemServer) {
//构建systemServer 具体详情可以看下代码 nicename->
Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
if (r != null) {
//执行SystemServer.main
r.run();
return;
}
}
//接收ams 传递的参数
caller = zygoteServer.runSelectLoop(abiList);
}
private static Runnable forkSystemServer(){
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,3011",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",//启动systemServer
};
Zygote.forkSystemServer(); //反射构建
//省略
}
SystemServer
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
// 构建系统上下文
createSystemContext();
//基础服务
startBootstrapServices(t);
//核心服务
startCoreServices(t);
//其他服务 AMS PMS 等在这里构建
startOtherServices(t);
}
private void startOtherServices(@NonNull TimingsTraceAndSlog t)(){
//AMS 回调里面启动SystemUI
mActivityManagerService.systemReady(() -> {
try {
//启动systemUI
startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
}
}
SystemUI 启动
//在这里启动了 SystemUIService 具体流程参考 https://juejin.cn/post/7341323705022201897
private static void startSystemUi(Context context, WindowManagerService windowManager) {
PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
Intent intent = new Intent();
// core/res/res/values/config.xml
intent.setComponent(pm.getSystemUiServiceComponent());
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
context.startServiceAsUser(intent, UserHandle.SYSTEM);
windowManager.onSystemUiStarted();
}
<string name="config_systemUIServiceComponent" translatable="false"
>com.android.systemui/com.android.systemui.SystemUIService</string>
Lanucher的启动(再准确说匹配Home的启动)
//services/core/java/com/android/server/wm/ActivityManagerService.java
public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
//省略。。。
if (bootingSystemUser) {
t.traceBegin("startHomeOnAllDisplays");
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
t.traceEnd();
}
//省略。。。
}
-->//com.android.server.wm.RootWindowContainer
RootWindowContainer.startHomeOnAllDisplays();
-->startHomeOnDisplay()
-->startHomeOnTaskDisplayArea(){
//该方法里intent 设置了 addCategory CATEGORY_HOME action 为 ACTION_MAIN
homeIntent = mService.getHomeIntent();
//启动lanuch3 这里和启动其他应用一致 启动过程会涉及splash homeBack 等 主要依赖匹配去启动
mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
taskDisplayArea);
}
//启动
ActivityTaskManagerService.getHomeIntent(){
// String mTopAction = Intent.ACTION_MAIN;
Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}
return intent;
}
Launcher的xml
<activity
android:name="com.android.launcher3.Launcher"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:windowSoftInputMode="adjustPan"
android:screenOrientation="unspecified"
android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize|density"
android:resizeableActivity="true"
android:resumeWhilePausing="true"
android:taskAffinity=""
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
<category android:name="android.intent.category.LAUNCHER_APP" />
</intent-filter>
<meta-data
android:name="com.android.launcher3.grid.control"
android:value="${packageName}.grid_control" />
</activity>
最后放一张我自己理解记忆的图