From c7271c08b7f20de884c3255c1f15ed24e33496ea Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Wed, 18 Sep 2024 20:49:25 +0000 Subject: [PATCH 1/3] Provide a host etc directory This allows host etc modules to be installed in out/host/*. One use case for this is art cc tests which have some data dependencies. Test: presubmits Change-Id: I2f0168f68c17c2fa4999d3cfcde7845eaef0bd48 --- core/envsetup.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/envsetup.mk b/core/envsetup.mk index c063f60a15..f82e861abf 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -417,6 +417,7 @@ HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon HOST_OUT_NATIVE_TESTS := $(HOST_OUT)/nativetest64 HOST_OUT_COVERAGE := $(HOST_OUT)/coverage HOST_OUT_TESTCASES := $(HOST_OUT)/testcases +HOST_OUT_ETC := $(HOST_OUT)/etc .KATI_READONLY := \ HOST_OUT_EXECUTABLES \ HOST_OUT_SHARED_LIBRARIES \ @@ -425,7 +426,8 @@ HOST_OUT_TESTCASES := $(HOST_OUT)/testcases HOST_OUT_SDK_ADDON \ HOST_OUT_NATIVE_TESTS \ HOST_OUT_COVERAGE \ - HOST_OUT_TESTCASES + HOST_OUT_TESTCASES \ + HOST_OUT_ETC HOST_CROSS_OUT_EXECUTABLES := $(HOST_CROSS_OUT)/bin HOST_CROSS_OUT_SHARED_LIBRARIES := $(HOST_CROSS_OUT)/lib From c3c7e46821fa0e77b5af3c2d9414a9584dcef0a5 Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Fri, 20 Sep 2024 20:54:41 +0000 Subject: [PATCH 2/3] Preload the sidecar jar when the flag is on Ignore-AOSP-First: The jar was developed in internal git, so this change must be also in internal git. Test: Build Bug: 360864791 Flag: RELEASE_APPFUNCTION_SIDECAR Change-Id: Iaafc3cbf0842fe61c8364d04f7f47cd4698d03cf --- target/product/app_function_extensions.mk | 22 ++++++++++++++++++++++ target/product/media_system_ext.mk | 5 +++++ 2 files changed, 27 insertions(+) create mode 100644 target/product/app_function_extensions.mk diff --git a/target/product/app_function_extensions.mk b/target/product/app_function_extensions.mk new file mode 100644 index 0000000000..a61afdc5ab --- /dev/null +++ b/target/product/app_function_extensions.mk @@ -0,0 +1,22 @@ +# +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# The app function sidecar extensions + +# /system_ext packages +PRODUCT_PACKAGES += \ + com.google.android.appfunctions.sidecar \ + appfunctions.sidecar.xml diff --git a/target/product/media_system_ext.mk b/target/product/media_system_ext.mk index 30dd2e2711..34d8de3f32 100644 --- a/target/product/media_system_ext.mk +++ b/target/product/media_system_ext.mk @@ -26,3 +26,8 @@ PRODUCT_PACKAGES += \ # Window Extensions $(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions_base.mk) + +# AppFunction Extensions +ifneq (,$(RELEASE_APPFUNCTION_SIDECAR)) + $(call inherit-product, $(SRC_TARGET_DIR)/product/app_function_extensions.mk) +endif From 2924961d8a70140dcc4514a7531fdbeebd7d1f85 Mon Sep 17 00:00:00 2001 From: Wenshan Fu Date: Fri, 20 Sep 2024 00:40:23 +0800 Subject: [PATCH 3/3] Add a hostside Java lib to read proto paths Bug: 365157972 Test: m aconfig_host_device_paths_java Change-Id: I858cda31e1e20b7df95bd0e6883694f0dd1cdef0 --- tools/aconfig/aconfig_device_paths/Android.bp | 13 +++ .../src/HostDeviceProtosTemplate.java | 82 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java diff --git a/tools/aconfig/aconfig_device_paths/Android.bp b/tools/aconfig/aconfig_device_paths/Android.bp index 932dfbfc28..dda7a55903 100644 --- a/tools/aconfig/aconfig_device_paths/Android.bp +++ b/tools/aconfig/aconfig_device_paths/Android.bp @@ -56,3 +56,16 @@ java_library { "//apex_available:platform", ], } + +genrule { + name: "libaconfig_java_host_device_paths_src", + srcs: ["src/HostDeviceProtosTemplate.java"], + out: ["HostDeviceProtos.java"], + tool_files: ["partition_aconfig_flags_paths.txt"], + cmd: "sed -e '/TEMPLATE/{r$(location partition_aconfig_flags_paths.txt)' -e 'd}' $(in) > $(out)", +} + +java_library_host { + name: "aconfig_host_device_paths_java", + srcs: [":libaconfig_java_host_device_paths_src"], +} diff --git a/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java b/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java new file mode 100644 index 0000000000..844232b9e1 --- /dev/null +++ b/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.aconfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * A host lib that can read all aconfig proto file paths on a given device. + */ +public class HostDeviceProtos { + /** + * An interface that executes ADB command and return the result. + */ + public static interface AdbCommandExecutor { + /** Executes the ADB command. */ + String executeAdbCommand(String command); + } + + static final String[] PATHS = { + TEMPLATE + }; + + private static final String APEX_DIR = "/apex"; + private static final String RECURSIVELY_LIST_APEX_DIR_COMMAND = "shell find /apex | grep aconfig_flags"; + private static final String APEX_ACONFIG_PATH_SUFFIX = "/etc/aconfig_flags.pb"; + + + /** + * Returns the list of all on-device aconfig proto paths from host side. + */ + public static List parsedFlagsProtoPaths(AdbCommandExecutor adbCommandExecutor) { + ArrayList paths = new ArrayList(Arrays.asList(PATHS)); + + String adbCommandOutput = adbCommandExecutor.executeAdbCommand( + RECURSIVELY_LIST_APEX_DIR_COMMAND); + + if (adbCommandOutput == null) { + return paths; + } + + Set allFiles = new HashSet<>(Arrays.asList(adbCommandOutput.split("\n"))); + + Set subdirs = allFiles.stream().map(file -> { + String[] filePaths = file.split("/"); + // The first element is "", the second element is "apex". + return filePaths.length > 2 ? filePaths[2] : ""; + }).collect(Collectors.toSet()); + + for (String prefix : subdirs) { + // For each mainline modules, there are two directories, one /, + // and one @/. Just read the former. + if (prefix.contains("@")) { + continue; + } + + String protoPath = APEX_DIR + "/" + prefix + APEX_ACONFIG_PATH_SUFFIX; + if (allFiles.contains(protoPath)) { + paths.add(protoPath); + } + } + return paths; + } +}