Read .rc files from bootstrap apexes
To start an early_hal service from a bootstrap vendor apex, init now
reads .rc files from bootstrap apexes as well.
In this change, perform_apex_config command is re-purposed to support
bootstrap mode. Now we have some similarity between two apexd calls:
- for bootstrap apexes (in the bootstrap mount namespace):
exec_start apexd-bootstrap
perform_apex_config --bootstrap
- for normal apexes (in the default mount namespace):
restart apexd
...
wait_for_prop apexd.status activated
perform_apex_config
Note that some tasks in perform_apex_config are not needed in the
bootstrap. For example, we don't need to create apexdata directories
for bootstrap apexes.
Bug: 290148081
Test: VendorApexHostTestCases
Change-Id: I8f683a4dcd7cd9a2466a4b1b417d84c025c37761
diff --git a/init/builtins.cpp b/init/builtins.cpp
index fa5e36d..e40b831 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -1292,10 +1292,21 @@
}
static Result<void> do_perform_apex_config(const BuiltinArguments& args) {
- auto create_dirs = create_apex_data_dirs();
- if (!create_dirs.ok()) {
- return create_dirs.error();
+ bool bootstrap = false;
+ if (args.size() == 2) {
+ if (args[1] != "--bootstrap") {
+ return Error() << "Unexpected argument: " << args[1];
+ }
+ bootstrap = true;
}
+
+ if (!bootstrap) {
+ auto create_dirs = create_apex_data_dirs();
+ if (!create_dirs.ok()) {
+ return create_dirs.error();
+ }
+ }
+
auto parse_configs = ParseApexConfigs(/*apex_name=*/"");
if (!parse_configs.ok()) {
return parse_configs.error();
@@ -1306,8 +1317,10 @@
return update_linker_config.error();
}
- // Now start delayed services
- ServiceList::GetInstance().MarkServicesUpdate();
+ if (!bootstrap) {
+ // Now start delayed services
+ ServiceList::GetInstance().MarkServicesUpdate();
+ }
return {};
}
@@ -1362,7 +1375,7 @@
// mount and umount are run in the same context as mount_all for symmetry.
{"mount_all", {0, kMax, {false, do_mount_all}}},
{"mount", {3, kMax, {false, do_mount}}},
- {"perform_apex_config", {0, 0, {false, do_perform_apex_config}}},
+ {"perform_apex_config", {0, 1, {false, do_perform_apex_config}}},
{"umount", {1, 1, {false, do_umount}}},
{"umount_all", {0, 1, {false, do_umount_all}}},
{"update_linker_config", {0, 0, {false, do_update_linker_config}}},