Merge "Export AUDIOSERVER_MULTILIB to soong" into main
diff --git a/core/combo/arch/x86/alderlake.mk b/core/combo/arch/x86/alderlake.mk
new file mode 100644
index 0000000..a7ae6ed
--- /dev/null
+++ b/core/combo/arch/x86/alderlake.mk
@@ -0,0 +1,6 @@
+# Configuration for Linux on x86.
+# Generating binaries for processors
+# that have AVX2 feature flag
+#
+
+ARCH_X86_HAVE_SSE4_1 := true
diff --git a/core/combo/arch/x86_64/alderlake.mk b/core/combo/arch/x86_64/alderlake.mk
new file mode 100644
index 0000000..a7ae6ed
--- /dev/null
+++ b/core/combo/arch/x86_64/alderlake.mk
@@ -0,0 +1,6 @@
+# Configuration for Linux on x86.
+# Generating binaries for processors
+# that have AVX2 feature flag
+#
+
+ARCH_X86_HAVE_SSE4_1 := true
diff --git a/core/main.mk b/core/main.mk
index e5f5b9d..5bbe1b1 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -1899,7 +1899,6 @@
$(eval _kernel_module_copy_files := $(sort $(filter %$(_path_on_device),$(KERNEL_MODULE_COPY_FILES)))) \
$(eval _is_build_prop := $(call is-build-prop,$f)) \
$(eval _is_notice_file := $(call is-notice-file,$f)) \
- $(eval _is_dexpreopt_image_profile := $(if $(filter %:/$(_path_on_device),$(DEXPREOPT_IMAGE_PROFILE_BUILT_INSTALLED)),Y)) \
$(eval _is_product_system_other_avbkey := $(if $(findstring $f,$(INSTALLED_PRODUCT_SYSTEM_OTHER_AVBKEY_TARGET)),Y)) \
$(eval _is_event_log_tags_file := $(if $(findstring $f,$(event_log_tags_file)),Y)) \
$(eval _is_system_other_odex_marker := $(if $(findstring $f,$(INSTALLED_SYSTEM_OTHER_ODEX_MARKER)),Y)) \
@@ -1909,7 +1908,7 @@
$(eval _is_partition_compat_symlink := $(if $(findstring $f,$(PARTITION_COMPAT_SYMLINKS)),Y)) \
$(eval _is_flags_file := $(if $(findstring $f, $(ALL_FLAGS_FILES)),Y)) \
$(eval _is_rootdir_symlink := $(if $(findstring $f, $(ALL_ROOTDIR_SYMLINKS)),Y)) \
- $(eval _is_platform_generated := $(_is_build_prop)$(_is_notice_file)$(_is_dexpreopt_image_profile)$(_is_product_system_other_avbkey)$(_is_event_log_tags_file)$(_is_system_other_odex_marker)$(_is_kernel_modules_blocklist)$(_is_fsverity_build_manifest_apk)$(_is_linker_config)$(_is_partition_compat_symlink)$(_is_flags_file)$(_is_rootdir_symlink)) \
+ $(eval _is_platform_generated := $(_is_build_prop)$(_is_notice_file)$(_is_product_system_other_avbkey)$(_is_event_log_tags_file)$(_is_system_other_odex_marker)$(_is_kernel_modules_blocklist)$(_is_fsverity_build_manifest_apk)$(_is_linker_config)$(_is_partition_compat_symlink)$(_is_flags_file)$(_is_rootdir_symlink)) \
$(eval _static_libs := $(if $(_is_soong_module),,$(ALL_INSTALLED_FILES.$f.STATIC_LIBRARIES))) \
$(eval _whole_static_libs := $(if $(_is_soong_module),,$(ALL_INSTALLED_FILES.$f.WHOLE_STATIC_LIBRARIES))) \
$(eval _license_text := $(if $(filter $(_build_output_path),$(ALL_NON_MODULES)),$(ALL_NON_MODULES.$(_build_output_path).NOTICES))) \
diff --git a/core/proguard.flags b/core/proguard.flags
index aa406b9..5148e56 100644
--- a/core/proguard.flags
+++ b/core/proguard.flags
@@ -38,6 +38,17 @@
@com.android.internal.annotations.KeepForWeakReference <fields>;
}
+# Needed to ensure callback field references are kept in their respective
+# owning classes when the downstream callback registrars only store weak refs.
+-if @com.android.internal.annotations.WeaklyReferencedCallback class *
+-keepclassmembers,allowaccessmodification class * {
+ <1> *;
+}
+-if class * extends @com.android.internal.annotations.WeaklyReferencedCallback **
+-keepclassmembers,allowaccessmodification class * {
+ <1> *;
+}
+
# Understand the common @Keep annotation from various Android packages:
# * android.support.annotation
# * androidx.annotation
diff --git a/target/product/generic/Android.bp b/target/product/generic/Android.bp
new file mode 100644
index 0000000..bf82ff1
--- /dev/null
+++ b/target/product/generic/Android.bp
@@ -0,0 +1,822 @@
+android_rootdirs = [
+ "acct",
+ "apex",
+ "bootstrap-apex",
+ "config",
+ "data",
+ "data_mirror",
+ "debug_ramdisk",
+ "dev",
+ "linkerconfig",
+ "metadata",
+ "mnt",
+ "odm",
+ "odm_dlkm",
+ "oem",
+ "postinstall",
+ "proc",
+ "product",
+ "second_stage_resources",
+ "storage",
+ "sys",
+ "system",
+ "system_dlkm",
+ "system_ext",
+ "tmp",
+ "vendor",
+ "vendor_dlkm",
+]
+
+android_symlinks = [
+ {
+ target: "/system/bin/init",
+ name: "init",
+ },
+ {
+ target: "/system/etc",
+ name: "etc",
+ },
+ {
+ target: "/system/bin",
+ name: "bin",
+ },
+ {
+ target: "/product",
+ name: "system/product",
+ },
+ {
+ target: "/vendor",
+ name: "system/vendor",
+ },
+ {
+ target: "/system_ext",
+ name: "system/system_ext",
+ },
+ {
+ target: "/system_dlkm/lib/modules",
+ name: "system/lib/modules",
+ },
+ {
+ target: "/data/user_de/0/com.android.shell/files/bugreports",
+ name: "bugreports",
+ },
+ {
+ target: "/data/cache",
+ name: "cache",
+ },
+ {
+ target: "/sys/kernel/debug",
+ name: "d",
+ },
+ {
+ target: "/storage/self/primary",
+ name: "sdcard",
+ },
+]
+
+filegroup {
+ name: "generic_system_sign_key",
+ srcs: [":avb_testkey_rsa4096"],
+}
+
+phony {
+ name: "generic_system_fonts",
+ required: [
+ "AndroidClock.ttf",
+ "CarroisGothicSC-Regular.ttf",
+ "ComingSoon.ttf",
+ "CutiveMono.ttf",
+ "DancingScript-Regular.ttf",
+ "DroidSansMono.ttf",
+ "NotoColorEmoji.ttf",
+ "NotoColorEmojiFlags.ttf",
+ "NotoNaskhArabic-Bold.ttf",
+ "NotoNaskhArabic-Regular.ttf",
+ "NotoNaskhArabicUI-Bold.ttf",
+ "NotoNaskhArabicUI-Regular.ttf",
+ "NotoSansAdlam-VF.ttf",
+ "NotoSansAhom-Regular.otf",
+ "NotoSansAnatolianHieroglyphs-Regular.otf",
+ "NotoSansArmenian-VF.ttf",
+ "NotoSansAvestan-Regular.ttf",
+ "NotoSansBalinese-Regular.ttf",
+ "NotoSansBamum-Regular.ttf",
+ "NotoSansBassaVah-Regular.otf",
+ "NotoSansBatak-Regular.ttf",
+ "NotoSansBengali-VF.ttf",
+ "NotoSansBengaliUI-VF.ttf",
+ "NotoSansBhaiksuki-Regular.otf",
+ "NotoSansBrahmi-Regular.ttf",
+ "NotoSansBuginese-Regular.ttf",
+ "NotoSansBuhid-Regular.ttf",
+ "NotoSansCJK-Regular.ttc",
+ "NotoSansCanadianAboriginal-Regular.ttf",
+ "NotoSansCarian-Regular.ttf",
+ "NotoSansChakma-Regular.otf",
+ "NotoSansCham-Bold.ttf",
+ "NotoSansCham-Regular.ttf",
+ "NotoSansCherokee-Regular.ttf",
+ "NotoSansCoptic-Regular.ttf",
+ "NotoSansCuneiform-Regular.ttf",
+ "NotoSansCypriot-Regular.ttf",
+ "NotoSansDeseret-Regular.ttf",
+ "NotoSansDevanagari-VF.ttf",
+ "NotoSansDevanagariUI-VF.ttf",
+ "NotoSansEgyptianHieroglyphs-Regular.ttf",
+ "NotoSansElbasan-Regular.otf",
+ "NotoSansEthiopic-VF.ttf",
+ "NotoSansGeorgian-VF.ttf",
+ "NotoSansGlagolitic-Regular.ttf",
+ "NotoSansGothic-Regular.ttf",
+ "NotoSansGrantha-Regular.ttf",
+ "NotoSansGujarati-Bold.ttf",
+ "NotoSansGujarati-Regular.ttf",
+ "NotoSansGujaratiUI-Bold.ttf",
+ "NotoSansGujaratiUI-Regular.ttf",
+ "NotoSansGunjalaGondi-Regular.otf",
+ "NotoSansGurmukhi-VF.ttf",
+ "NotoSansGurmukhiUI-VF.ttf",
+ "NotoSansHanifiRohingya-Regular.otf",
+ "NotoSansHanunoo-Regular.ttf",
+ "NotoSansHatran-Regular.otf",
+ "NotoSansHebrew-Bold.ttf",
+ "NotoSansHebrew-Regular.ttf",
+ "NotoSansImperialAramaic-Regular.ttf",
+ "NotoSansInscriptionalPahlavi-Regular.ttf",
+ "NotoSansInscriptionalParthian-Regular.ttf",
+ "NotoSansJavanese-Regular.otf",
+ "NotoSansKaithi-Regular.ttf",
+ "NotoSansKannada-VF.ttf",
+ "NotoSansKannadaUI-VF.ttf",
+ "NotoSansKayahLi-Regular.ttf",
+ "NotoSansKharoshthi-Regular.ttf",
+ "NotoSansKhmer-VF.ttf",
+ "NotoSansKhmerUI-Bold.ttf",
+ "NotoSansKhmerUI-Regular.ttf",
+ "NotoSansKhojki-Regular.otf",
+ "NotoSansLao-Bold.ttf",
+ "NotoSansLao-Regular.ttf",
+ "NotoSansLaoUI-Bold.ttf",
+ "NotoSansLaoUI-Regular.ttf",
+ "NotoSansLepcha-Regular.ttf",
+ "NotoSansLimbu-Regular.ttf",
+ "NotoSansLinearA-Regular.otf",
+ "NotoSansLinearB-Regular.ttf",
+ "NotoSansLisu-Regular.ttf",
+ "NotoSansLycian-Regular.ttf",
+ "NotoSansLydian-Regular.ttf",
+ "NotoSansMalayalam-VF.ttf",
+ "NotoSansMalayalamUI-VF.ttf",
+ "NotoSansMandaic-Regular.ttf",
+ "NotoSansManichaean-Regular.otf",
+ "NotoSansMarchen-Regular.otf",
+ "NotoSansMasaramGondi-Regular.otf",
+ "NotoSansMedefaidrin-VF.ttf",
+ "NotoSansMeeteiMayek-Regular.ttf",
+ "NotoSansMeroitic-Regular.otf",
+ "NotoSansMiao-Regular.otf",
+ "NotoSansModi-Regular.ttf",
+ "NotoSansMongolian-Regular.ttf",
+ "NotoSansMro-Regular.otf",
+ "NotoSansMultani-Regular.otf",
+ "NotoSansMyanmar-Bold.otf",
+ "NotoSansMyanmar-Medium.otf",
+ "NotoSansMyanmar-Regular.otf",
+ "NotoSansMyanmarUI-Bold.otf",
+ "NotoSansMyanmarUI-Medium.otf",
+ "NotoSansMyanmarUI-Regular.otf",
+ "NotoSansNKo-Regular.ttf",
+ "NotoSansNabataean-Regular.otf",
+ "NotoSansNewTaiLue-Regular.ttf",
+ "NotoSansNewa-Regular.otf",
+ "NotoSansOgham-Regular.ttf",
+ "NotoSansOlChiki-Regular.ttf",
+ "NotoSansOldItalic-Regular.ttf",
+ "NotoSansOldNorthArabian-Regular.otf",
+ "NotoSansOldPermic-Regular.otf",
+ "NotoSansOldPersian-Regular.ttf",
+ "NotoSansOldSouthArabian-Regular.ttf",
+ "NotoSansOldTurkic-Regular.ttf",
+ "NotoSansOriya-Bold.ttf",
+ "NotoSansOriya-Regular.ttf",
+ "NotoSansOriyaUI-Bold.ttf",
+ "NotoSansOriyaUI-Regular.ttf",
+ "NotoSansOsage-Regular.ttf",
+ "NotoSansOsmanya-Regular.ttf",
+ "NotoSansPahawhHmong-Regular.otf",
+ "NotoSansPalmyrene-Regular.otf",
+ "NotoSansPauCinHau-Regular.otf",
+ "NotoSansPhagsPa-Regular.ttf",
+ "NotoSansPhoenician-Regular.ttf",
+ "NotoSansRejang-Regular.ttf",
+ "NotoSansRunic-Regular.ttf",
+ "NotoSansSamaritan-Regular.ttf",
+ "NotoSansSaurashtra-Regular.ttf",
+ "NotoSansSharada-Regular.otf",
+ "NotoSansShavian-Regular.ttf",
+ "NotoSansSinhala-VF.ttf",
+ "NotoSansSinhalaUI-VF.ttf",
+ "NotoSansSoraSompeng-Regular.otf",
+ "NotoSansSoyombo-VF.ttf",
+ "NotoSansSundanese-Regular.ttf",
+ "NotoSansSylotiNagri-Regular.ttf",
+ "NotoSansSymbols-Regular-Subsetted.ttf",
+ "NotoSansSymbols-Regular-Subsetted2.ttf",
+ "NotoSansSyriacEastern-Regular.ttf",
+ "NotoSansSyriacEstrangela-Regular.ttf",
+ "NotoSansSyriacWestern-Regular.ttf",
+ "NotoSansTagalog-Regular.ttf",
+ "NotoSansTagbanwa-Regular.ttf",
+ "NotoSansTaiLe-Regular.ttf",
+ "NotoSansTaiTham-Regular.ttf",
+ "NotoSansTaiViet-Regular.ttf",
+ "NotoSansTakri-VF.ttf",
+ "NotoSansTamil-VF.ttf",
+ "NotoSansTamilUI-VF.ttf",
+ "NotoSansTelugu-VF.ttf",
+ "NotoSansTeluguUI-VF.ttf",
+ "NotoSansThaana-Bold.ttf",
+ "NotoSansThaana-Regular.ttf",
+ "NotoSansThai-Bold.ttf",
+ "NotoSansThai-Regular.ttf",
+ "NotoSansThaiUI-Bold.ttf",
+ "NotoSansThaiUI-Regular.ttf",
+ "NotoSansTifinagh-Regular.otf",
+ "NotoSansUgaritic-Regular.ttf",
+ "NotoSansVai-Regular.ttf",
+ "NotoSansWancho-Regular.otf",
+ "NotoSansWarangCiti-Regular.otf",
+ "NotoSansYi-Regular.ttf",
+ "NotoSerif-Bold.ttf",
+ "NotoSerif-BoldItalic.ttf",
+ "NotoSerif-Italic.ttf",
+ "NotoSerif-Regular.ttf",
+ "NotoSerifArmenian-VF.ttf",
+ "NotoSerifBengali-VF.ttf",
+ "NotoSerifCJK-Regular.ttc",
+ "NotoSerifDevanagari-VF.ttf",
+ "NotoSerifDogra-Regular.ttf",
+ "NotoSerifEthiopic-VF.ttf",
+ "NotoSerifGeorgian-VF.ttf",
+ "NotoSerifGujarati-VF.ttf",
+ "NotoSerifGurmukhi-VF.ttf",
+ "NotoSerifHebrew-Bold.ttf",
+ "NotoSerifHebrew-Regular.ttf",
+ "NotoSerifHentaigana.ttf",
+ "NotoSerifKannada-VF.ttf",
+ "NotoSerifKhmer-Bold.otf",
+ "NotoSerifKhmer-Regular.otf",
+ "NotoSerifLao-Bold.ttf",
+ "NotoSerifLao-Regular.ttf",
+ "NotoSerifMalayalam-VF.ttf",
+ "NotoSerifMyanmar-Bold.otf",
+ "NotoSerifMyanmar-Regular.otf",
+ "NotoSerifNyiakengPuachueHmong-VF.ttf",
+ "NotoSerifSinhala-VF.ttf",
+ "NotoSerifTamil-VF.ttf",
+ "NotoSerifTelugu-VF.ttf",
+ "NotoSerifThai-Bold.ttf",
+ "NotoSerifThai-Regular.ttf",
+ "NotoSerifTibetan-VF.ttf",
+ "NotoSerifYezidi-VF.ttf",
+ "Roboto-Regular.ttf",
+ "RobotoFlex-Regular.ttf",
+ "RobotoStatic-Regular.ttf",
+ "SourceSansPro-Bold.ttf",
+ "SourceSansPro-BoldItalic.ttf",
+ "SourceSansPro-Italic.ttf",
+ "SourceSansPro-Regular.ttf",
+ "SourceSansPro-SemiBold.ttf",
+ "SourceSansPro-SemiBoldItalic.ttf",
+ "font_fallback.xml",
+ "fonts.xml",
+ ],
+}
+
+android_system_image {
+ name: "generic_system_image",
+
+ partition_name: "system",
+ base_dir: "system",
+ dirs: android_rootdirs,
+ symlinks: android_symlinks,
+ file_contexts: ":plat_file_contexts",
+ linker_config_src: ":system_linker_config_json_file",
+ fsverity: {
+ inputs: [
+ "etc/boot-image.prof",
+ "etc/classpaths/*.pb",
+ "etc/dirty-image-objects",
+ "etc/preloaded-classes",
+ "framework/*",
+ "framework/*/*", // framework/{arch}
+ "framework/oat/*/*", // framework/oat/{arch}
+ ],
+ libs: [":framework-res{.export-package.apk}"],
+ },
+ build_logtags: true,
+ gen_aconfig_flags_pb: true,
+
+ compile_multilib: "both",
+
+ use_avb: true,
+ avb_private_key: ":generic_system_sign_key",
+ avb_algorithm: "SHA256_RSA4096",
+ avb_hash_algorithm: "sha256",
+
+ deps: [
+ "abx",
+ "aconfigd",
+ "aflags",
+ "am",
+ "android.software.credentials.prebuilt.xml", // generic_system
+ "android.software.webview.prebuilt.xml", // media_system
+ "android.software.window_magnification.prebuilt.xml", // handheld_system
+ "android.system.suspend-service",
+ "prebuilt_vintf_manifest",
+ "apexd",
+ "appops",
+ "approved-ogki-builds.xml", // base_system
+ "appwidget",
+ "atrace",
+ "audioserver",
+ "bcc",
+ "blank_screen",
+ "blkid",
+ "bmgr",
+ "bootanimation",
+ "bootstat",
+ "bpfloader",
+ "bu",
+ "bugreport",
+ "bugreportz",
+ "cameraserver",
+ "cgroups.json",
+ "cmd",
+ "content",
+ "cppreopts.sh", // generic_system
+ "credstore",
+ "debuggerd",
+ "device_config",
+ "dirty-image-objects",
+ "dmctl",
+ "dmesgd",
+ "dnsmasq",
+ "dpm",
+ "dump.erofs",
+ "dumpstate",
+ "dumpsys",
+ "e2fsck",
+ "enhanced-confirmation.xml", // base_system
+ "etc_hosts",
+ "flags_health_check",
+ "framework-audio_effects.xml", // for handheld // handheld_system
+ "framework-sysconfig.xml",
+ "fs_config_dirs_system",
+ "fs_config_files_system",
+ "fsck.erofs",
+ "fsck.f2fs", // for media_system
+ "fsck_msdos",
+ "fsverity-release-cert-der",
+ "gatekeeperd",
+ "gpu_counter_producer",
+ "gpuservice",
+ "group_system",
+ "gsi_tool",
+ "gsid",
+ "heapprofd",
+ "hid",
+ "hiddenapi-package-whitelist.xml", // from runtime_libart
+ "idc_data",
+ "idmap2",
+ "idmap2d",
+ "ime",
+ "incident",
+ "incident-helper-cmd",
+ "incident_helper",
+ "incidentd",
+ "init.environ.rc-soong",
+ "init.usb.configfs.rc",
+ "init.usb.rc",
+ "init.zygote32.rc",
+ "init.zygote64.rc",
+ "init.zygote64_32.rc",
+ "init_first_stage", // for boot partition
+ "initial-package-stopped-states.xml",
+ "input",
+ "installd",
+ "ip", // base_system
+ "iptables",
+ "kcmdlinectrl",
+ "kernel-lifetimes.xml", // base_system
+ "keychars_data",
+ "keylayout_data",
+ "keystore2",
+ "ld.mc",
+ "llkd", // base_system
+ "lmkd", // base_system
+ "local_time.default", // handheld_vendo
+ "locksettings", // base_system
+ "logcat", // base_system
+ "logd", // base_system
+ "logpersist.start",
+ "lpdump", // base_system
+ "lshal", // base_system
+ "make_f2fs", // media_system
+ "mdnsd", // base_system
+ "media_profiles_V1_0.dtd", // base_system
+ "mediacodec.policy", // base_system
+ "mediaextractor", // base_system
+ "mediametrics", // base_system
+ "misctrl", // from base_system
+ "mke2fs", // base_system
+ "mkfs.erofs", // base_system
+ "monkey", // base_system
+ "mtectrl", // base_system
+ "ndc", // base_system
+ "netd", // base_system
+ "netutils-wrapper-1.0", // full_base
+ "notice_xml_system",
+ "odsign", // base_system
+ "otapreopt_script", // generic_system
+ "package-shareduid-allowlist.xml", // base_system
+ "passwd_system", // base_system
+ "perfetto", // base_system
+ "ping", // base_system
+ "ping6", // base_system
+ "pintool", // base_system
+ "platform.xml", // base_system
+ "pm", // base_system
+ "preinstalled-packages-asl-files.xml", // base_system
+ "preinstalled-packages-platform-generic-system.xml", // generic_system
+ "preinstalled-packages-platform-handheld-system.xml", // handheld_system
+ "preinstalled-packages-platform.xml", // base_system
+ "preinstalled-packages-strict-signature.xml", // base_system
+ "preloaded-classes", // ok
+ "printflags", // base_system
+ "privapp-permissions-platform.xml", // base_system
+ "prng_seeder", // base_system
+ "public.libraries.android.txt",
+ "recovery-persist", // base_system
+ "recovery-refresh", // generic_system
+ "requestsync", // media_system
+ "resize2fs", // base_system
+ "rss_hwm_reset", // base_system
+ "run-as", // base_system
+ "schedtest", // base_system
+ "screencap", // base_system
+ "screenrecord", // handheld_system
+ "sdcard", // base_system
+ "secdiscard", // base_system
+ "sensorservice", // base_system
+ "service", // base_system
+ "servicemanager", // base_system
+ "settings", // base_system
+ "sfdo", // base_system
+ "sgdisk", // base_system
+ "sm", // base_system
+ "snapshotctl", // base_system
+ "snapuserd", // base_system
+ "snapuserd_ramdisk", // ramdisk
+ "storaged", // base_system
+ "surfaceflinger", // base_system
+ "svc", // base_system
+ "task_profiles.json", // base_system
+ "tc", // base_system
+ "telecom", // base_system
+ "tombstoned", // base_system
+ "traced", // base_system
+ "traced_probes", // base_system
+ "tune2fs", // base_system
+ "uiautomator", // base_system
+ "uinput", // base_system
+ "uncrypt", // base_system
+ "update_engine", // generic_system
+ "update_engine_sideload", // recovery
+ "update_verifier", // generic_system
+ "usbd", // base_system
+ "vdc", // base_system
+ "virtual_camera", // handheld_system // release_package_virtual_camera
+ "vold", // base_system
+ "vr", // handheld_system
+ "watchdogd", // base_system
+ "wifi.rc", // base_system
+ "wificond", // base_system
+ "wm", // base_system
+ ] + select(release_flag("RELEASE_PLATFORM_VERSION_CODENAME"), {
+ "REL": [],
+ default: [
+ "android.software.preview_sdk.prebuilt.xml", // media_system
+ ],
+ }) + select(soong_config_variable("ANDROID", "release_package_profiling_module"), {
+ "true": [
+ "trace_redactor", // base_system (RELEASE_PACKAGE_PROFILING_MODULE)
+ ],
+ default: [],
+ }) + select(product_variable("debuggable"), {
+ true: [
+ "adevice_fingerprint",
+ "arping",
+ "avbctl",
+ "bootctl",
+ "dmuserd",
+ "evemu-record",
+ "idlcli",
+ "init-debug.rc",
+ "iotop",
+ "iperf3",
+ "iw",
+ "layertracegenerator",
+ "logtagd.rc",
+ "ot-cli-ftd",
+ "ot-ctl",
+ "procrank",
+ "profcollectctl",
+ "profcollectd",
+ "record_binder",
+ "sanitizer-status",
+ "servicedispatcher",
+ "showmap",
+ "sqlite3",
+ "ss",
+ "start_with_lockagent",
+ "strace",
+ "su",
+ "tinycap",
+ "tinyhostless",
+ "tinymix",
+ "tinypcminfo",
+ "tinyplay", // host
+ "tracepath",
+ "tracepath6",
+ "traceroute6",
+ "unwind_info",
+ "unwind_reg_info",
+ "unwind_symbols",
+ "update_engine_client",
+ ],
+ default: [],
+ }),
+ multilib: {
+ common: {
+ deps: [
+ "BackupRestoreConfirmation", // base_system
+ "BasicDreams", // handheld_system
+ "BlockedNumberProvider", // handheld_system
+ "BluetoothMidiService", // handheld_system
+ "BookmarkProvider", // handheld_system
+ "BuiltInPrintService", // handheld_system
+ "CalendarProvider", // handheld_system
+ "CallLogBackup", // telephony_system
+ "CameraExtensionsProxy", // handheld_system
+ "CaptivePortalLogin", // handheld_system
+ "CarrierDefaultApp", // telephony_system
+ "CellBroadcastLegacyApp", // telephony_system
+ "CertInstaller", // handheld_system
+ "CompanionDeviceManager", // media_system
+ "ContactsProvider", // base_system
+ "CredentialManager", // handheld_system
+ "DeviceAsWebcam", // handheld_system
+ "DocumentsUI", // handheld_system
+ "DownloadProvider", // base_system
+ "DownloadProviderUi", // handheld_system
+ "DynamicSystemInstallationService", // base_system
+ "E2eeContactKeysProvider", // base_system
+ "EasterEgg", // handheld_system
+ "ExtShared", // base_system
+ "ExternalStorageProvider", // handheld_system
+ "FusedLocation", // handheld_system
+ "HTMLViewer", // media_system
+ "InputDevices", // handheld_system
+ "IntentResolver", // base_system
+ "KeyChain", // handheld_system
+ "LiveWallpapersPicker", // generic_system, full_base
+ "LocalTransport", // base_system
+ "ManagedProvisioning", // handheld_system
+ "MediaProviderLegacy", // base_system
+ "MmsService", // handheld_system
+ "MtpService", // handheld_system
+ "MusicFX", // handheld_system
+ "NetworkStack", // base_system
+ "ONS", // telephony_system
+ "PacProcessor", // handheld_system
+ "PackageInstaller", // base_system
+ "PartnerBookmarksProvider", // generic_system
+ "PhotoTable", // full_base
+ "PrintRecommendationService", // handheld_system
+ "PrintSpooler", // handheld_system
+ "ProxyHandler", // handheld_system
+ "SecureElement", // handheld_system
+ "SettingsProvider", // base_system
+ "SharedStorageBackup", // handheld_system
+ "Shell", // base_system
+ "SimAppDialog", // handheld_system
+ "SoundPicker", // not installed by anyone
+ "StatementService", // media_system
+ "Stk", // generic_system
+ "Tag", // generic_system
+ "TeleService", // handheld_system
+ "Telecom", // handheld_system
+ "TelephonyProvider", // handheld_system
+ "Traceur", // handheld_system
+ "UserDictionaryProvider", // handheld_system
+ "VpnDialogs", // handheld_system
+ "WallpaperBackup", // base_system
+ "adbd_system_api", // base_system
+ "android.hidl.base-V1.0-java", // base_system
+ "android.hidl.manager-V1.0-java", // base_system
+ "android.test.base", // from runtime_libart
+ "android.test.mock", // base_system
+ "android.test.runner", // base_system
+ "aosp_mainline_modules", // ok
+ "build_flag_system", // base_system
+ "charger_res_images", // generic_system
+ "com.android.apex.cts.shim.v1_prebuilt", // ok
+ "com.android.cellbroadcast", // telephony_system
+ "com.android.future.usb.accessory", // media_system
+ "com.android.location.provider", // base_system
+ "com.android.media.remotedisplay", // media_system
+ "com.android.media.remotedisplay.xml", // media_system
+ "com.android.mediadrm.signer", // media_system
+ "com.android.nfc_extras", // ok
+ "com.android.nfcservices", // base_system (RELEASE_PACKAGE_NFC_STACK != NfcNci)
+ "com.android.runtime", // ok
+ "dex_bootjars",
+ "ext", // from runtime_libart
+ "framework-graphics", // base_system
+ "framework-location", // base_system
+ "framework-minus-apex-install-dependencies", // base_system
+ "framework_compatibility_matrix.device.xml",
+ "generic_system_fonts", // ok
+ "hwservicemanager_compat_symlink_module", // base_system
+ "hyph-data",
+ "ims-common", // base_system
+ "init_system", // base_system
+ "javax.obex", // base_system
+ "llndk.libraries.txt", //ok
+ "org.apache.http.legacy", // base_system
+ "perfetto-extras", // system
+ "sanitizer.libraries.txt", // base_system
+ "selinux_policy_system_soong", // ok
+ "services", // base_system
+ "shell_and_utilities_system", // ok
+ "system-build.prop",
+ "system_compatibility_matrix.xml", //base_system
+ "telephony-common", // libs from TeleService
+ "voip-common", // base_system
+ ] + select(soong_config_variable("ANDROID", "release_crashrecovery_module"), {
+ "true": [
+ "com.android.crashrecovery", // base_system (RELEASE_CRASHRECOVERY_MODULE)
+ ],
+ default: [],
+ }) + select(soong_config_variable("ANDROID", "release_package_profiling_module"), {
+ "true": [
+ "com.android.profiling", // base_system (RELEASE_PACKAGE_PROFILING_MODULE)
+ ],
+ default: [],
+ }) + select(release_flag("RELEASE_AVATAR_PICKER_APP"), {
+ true: [
+ "AvatarPicker", // generic_system (RELEASE_AVATAR_PICKER_APP)
+ ],
+ default: [],
+ }),
+ },
+ prefer32: {
+ deps: [
+ "drmserver", // media_system
+ "mediaserver", // base_system
+ ],
+ },
+ lib64: {
+ deps: [
+ "android.system.virtualizationcommon-ndk",
+ "android.system.virtualizationservice-ndk",
+ "libgsi",
+ "servicemanager",
+ ],
+ },
+ both: {
+ deps: [
+ "android.hardware.biometrics.fingerprint@2.1", // generic_system
+ "android.hardware.radio.config@1.0", // generic_system
+ "android.hardware.radio.deprecated@1.0", // generic_system
+ "android.hardware.radio@1.0", // generic_system
+ "android.hardware.radio@1.1", // generic_system
+ "android.hardware.radio@1.2", // generic_system
+ "android.hardware.radio@1.3", // generic_system
+ "android.hardware.radio@1.4", // generic_system
+ "android.hardware.secure_element@1.0", // generic_system
+ "app_process", // base_system
+ "boringssl_self_test", // base_system
+ "heapprofd_client", // base_system
+ "libEGL", // base_system
+ "libEGL_angle", // base_system
+ "libETC1", // base_system
+ "libFFTEm", // base_system
+ "libGLESv1_CM", // base_system
+ "libGLESv1_CM_angle", // base_system
+ "libGLESv2", // base_system
+ "libGLESv2_angle", // base_system
+ "libGLESv3", // base_system
+ "libOpenMAXAL", // base_system
+ "libOpenSLES", // base_system
+ "libaaudio", // base_system
+ "libalarm_jni", // base_system
+ "libamidi", // base_system
+ "libandroid",
+ "libandroid_runtime",
+ "libandroid_servers",
+ "libandroidfw",
+ "libartpalette-system",
+ "libaudio-resampler", // generic-system
+ "libaudioeffect_jni",
+ "libaudiohal", // generic-system
+ "libaudiopolicyengineconfigurable", // generic-system
+ "libbinder",
+ "libbinder_ndk",
+ "libbinder_rpc_unstable",
+ "libcamera2ndk",
+ "libclang_rt.asan",
+ "libcompiler_rt",
+ "libcutils", // used by many libs
+ "libdmabufheap", // used by many libs
+ "libdrm", // used by many libs // generic_system
+ "libdrmframework", // base_system
+ "libdrmframework_jni", // base_system
+ "libfdtrack", // base_system
+ "libfilterfw", // base_system
+ "libfilterpack_imageproc", // media_system
+ "libfwdlockengine", // generic_system
+ "libgatekeeper", // base_system
+ "libgui", // base_system
+ "libhardware", // base_system
+ "libhardware_legacy", // base_system
+ "libhidltransport", // generic_system
+ "libhwbinder", // generic_system
+ "libinput", // base_system
+ "libinputflinger", // base_system
+ "libiprouteutil", // base_system
+ "libjnigraphics", // base_system
+ "libjpeg", // base_system
+ "liblog", // base_system
+ "liblogwrap", // generic_system
+ "liblz4", // generic_system
+ "libmedia", // base_system
+ "libmedia_jni", // base_system
+ "libmediandk", // base_system
+ "libminui", // generic_system
+ "libmtp", // base_system
+ "libnetd_client", // base_system
+ "libnetlink", // base_system
+ "libnetutils", // base_system
+ "libneuralnetworks_packageinfo", // base_system
+ "libnl", // generic_system
+ "libpdfium", // base_system
+ "libpolicy-subsystem", // generic_system
+ "libpower", // base_system
+ "libpowermanager", // base_system
+ "libprotobuf-cpp-full", // generic_system
+ "libradio_metadata", // base_system
+ "librs_jni", // handheld_system
+ "librtp_jni", // base_system
+ "libsensorservice", // base_system
+ "libsfplugin_ccodec", // base_system
+ "libskia", // base_system
+ "libsonic", // base_system
+ "libsonivox", // base_system
+ "libsoundpool", // base_system
+ "libspeexresampler", // base_system
+ "libsqlite", // base_system
+ "libstagefright", // base_system
+ "libstagefright_foundation", // base_system
+ "libstagefright_omx", // base_system
+ "libstdc++", // base_system
+ "libsysutils", // base_system
+ "libui", // base_system
+ "libusbhost", // base_system
+ "libutils", // base_system
+ "libvendorsupport", // llndk library
+ "libvintf_jni", // base_system
+ "libvulkan", // base_system
+ "libwebviewchromium_loader", // media_system
+ "libwebviewchromium_plat_support", // media_system
+ "libwilhelm", // base_system
+ "linker", // base_system
+ ] + select(soong_config_variable("ANDROID", "TARGET_DYNAMIC_64_32_DRMSERVER"), {
+ "true": ["drmserver"],
+ default: [],
+ }) + select(soong_config_variable("ANDROID", "TARGET_DYNAMIC_64_32_MEDIASERVER"), {
+ "true": ["mediaserver"],
+ default: [],
+ }),
+ },
+ },
+}
+
+prebuilt_etc {
+ name: "prebuilt_vintf_manifest",
+ src: "manifest.xml",
+ filename: "manifest.xml",
+ relative_install_path: "vintf",
+ no_full_install: true,
+}
diff --git a/target/product/generic/OWNERS b/target/product/generic/OWNERS
new file mode 100644
index 0000000..6d1446f
--- /dev/null
+++ b/target/product/generic/OWNERS
@@ -0,0 +1,6 @@
+# Bug component: 1322713
+inseob@google.com
+jeongik@google.com
+jiyong@google.com
+justinyun@google.com
+kiyoungkim@google.com
diff --git a/target/product/generic/manifest.xml b/target/product/generic/manifest.xml
new file mode 100644
index 0000000..1df2c0d
--- /dev/null
+++ b/target/product/generic/manifest.xml
@@ -0,0 +1,54 @@
+<!--
+ Input:
+ system/libhidl/vintfdata/manifest.xml
+-->
+<manifest version="8.0" type="framework">
+ <hal format="hidl" max-level="6">
+ <name>android.frameworks.displayservice</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.0::IDisplayService/default</fqname>
+ </hal>
+ <hal format="hidl" max-level="5">
+ <name>android.frameworks.schedulerservice</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.0::ISchedulingPolicyService/default</fqname>
+ </hal>
+ <hal format="aidl">
+ <name>android.frameworks.sensorservice</name>
+ <fqname>ISensorManager/default</fqname>
+ </hal>
+ <hal format="hidl" max-level="8">
+ <name>android.frameworks.sensorservice</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.0::ISensorManager/default</fqname>
+ </hal>
+ <hal format="hidl" max-level="8">
+ <name>android.hidl.memory</name>
+ <transport arch="32+64">passthrough</transport>
+ <fqname>@1.0::IMapper/ashmem</fqname>
+ </hal>
+ <hal format="hidl" max-level="7">
+ <name>android.system.net.netd</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.1::INetd/default</fqname>
+ </hal>
+ <hal format="hidl" max-level="7">
+ <name>android.system.wifi.keystore</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.0::IKeystore/default</fqname>
+ </hal>
+ <hal format="native">
+ <name>netutils-wrapper</name>
+ <version>1.0</version>
+ </hal>
+ <system-sdk>
+ <version>29</version>
+ <version>30</version>
+ <version>31</version>
+ <version>32</version>
+ <version>33</version>
+ <version>34</version>
+ <version>35</version>
+ <version>VanillaIceCream</version>
+ </system-sdk>
+</manifest>
diff --git a/teams/Android.bp b/teams/Android.bp
index 0f5b475..96d241b 100644
--- a/teams/Android.bp
+++ b/teams/Android.bp
@@ -4447,3 +4447,10 @@
// go/trendy/manage/engineers/5787938454863872
trendy_team_id: "5787938454863872",
}
+
+team {
+ name: "trendy_team_art_cloud",
+
+ // go/trendy/manage/engineers/5121440647577600
+ trendy_team_id: "5121440647577600",
+}
diff --git a/tools/aconfig/aconfig/src/codegen/java.rs b/tools/aconfig/aconfig/src/codegen/java.rs
index 1ac58c1..a34166d 100644
--- a/tools/aconfig/aconfig/src/codegen/java.rs
+++ b/tools/aconfig/aconfig/src/codegen/java.rs
@@ -137,6 +137,7 @@
pub default_value: bool,
pub device_config_namespace: String,
pub device_config_flag: String,
+ pub flag_name: String,
pub flag_name_constant_suffix: String,
pub flag_offset: u16,
pub is_read_write: bool,
@@ -156,6 +157,7 @@
default_value: pf.state() == ProtoFlagState::ENABLED,
device_config_namespace: pf.namespace().to_string(),
device_config_flag,
+ flag_name: pf.name().to_string(),
flag_name_constant_suffix: pf.name().to_ascii_uppercase(),
flag_offset: *flag_offsets.get(pf.name()).expect("didnt find package offset :("),
is_read_write: pf.permission() == ProtoFlagPermission::READ_WRITE,
@@ -507,97 +509,39 @@
private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl();
}"#;
- let expected_featureflagsmpl_content_0 = r#"
+ let expected_featureflagsmpl_content = r#"
package com.android.aconfig.test;
// TODO(b/303773055): Remove the annotation after access issue is resolved.
import android.compat.annotation.UnsupportedAppUsage;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
- "#;
+ import android.aconfig.storage.StorageInternalReader;
+ import java.nio.file.Files;
+ import java.nio.file.Paths;
- let expected_featureflagsmpl_content_1 = r#"
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags {
+ private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage"));
+ private static volatile boolean isCached = false;
private static volatile boolean aconfig_test_is_cached = false;
private static volatile boolean other_namespace_is_cached = false;
private static boolean disabledRw = false;
private static boolean disabledRwExported = false;
private static boolean disabledRwInOtherNamespace = false;
private static boolean enabledRw = true;
- "#;
- let expected_featureflagsmpl_content_2 = r#"
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean disabledRo() {
- return false;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean disabledRw() {
- if (!aconfig_test_is_cached) {
- load_overrides_aconfig_test();
+ private void init() {
+ StorageInternalReader reader = null;
+ try {
+ reader = new StorageInternalReader("system", "com.android.aconfig.test");
+ disabledRw = reader.getBooleanFlagValue(1);
+ disabledRwExported = reader.getBooleanFlagValue(2);
+ enabledRw = reader.getBooleanFlagValue(8);
+ disabledRwInOtherNamespace = reader.getBooleanFlagValue(3);
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot read flag in codegen", e);
}
- return disabledRw;
+ isCached = true;
}
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean disabledRwExported() {
- if (!aconfig_test_is_cached) {
- load_overrides_aconfig_test();
- }
- return disabledRwExported;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean disabledRwInOtherNamespace() {
- if (!other_namespace_is_cached) {
- load_overrides_other_namespace();
- }
- return disabledRwInOtherNamespace;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean enabledFixedRo() {
- return true;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean enabledFixedRoExported() {
- return true;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean enabledRo() {
- return true;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean enabledRoExported() {
- return true;
- }
- @Override
- @com.android.aconfig.annotations.AconfigFlagAccessor
- @UnsupportedAppUsage
- public boolean enabledRw() {
- if (!aconfig_test_is_cached) {
- load_overrides_aconfig_test();
- }
- return enabledRw;
- }
- }
- "#;
-
- let expect_featureflagsimpl_content_old = expected_featureflagsmpl_content_0.to_owned()
- + expected_featureflagsmpl_content_1
- + r#"
private void load_overrides_aconfig_test() {
try {
Properties properties = DeviceConfig.getProperties("aconfig_test");
@@ -636,188 +580,104 @@
);
}
other_namespace_is_cached = true;
- }"#
- + expected_featureflagsmpl_content_2;
+ }
+
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean disabledRo() {
+ return false;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean disabledRw() {
+ if (isReadFromNew) {
+ if (!isCached) {
+ init();
+ }
+ } else {
+ if (!aconfig_test_is_cached) {
+ load_overrides_aconfig_test();
+ }
+ }
+ return disabledRw;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean disabledRwExported() {
+ if (isReadFromNew) {
+ if (!isCached) {
+ init();
+ }
+ } else {
+ if (!aconfig_test_is_cached) {
+ load_overrides_aconfig_test();
+ }
+ }
+ return disabledRwExported;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean disabledRwInOtherNamespace() {
+ if (isReadFromNew) {
+ if (!isCached) {
+ init();
+ }
+ } else {
+ if (!other_namespace_is_cached) {
+ load_overrides_other_namespace();
+ }
+ }
+ return disabledRwInOtherNamespace;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean enabledFixedRo() {
+ return true;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean enabledFixedRoExported() {
+ return true;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean enabledRo() {
+ return true;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean enabledRoExported() {
+ return true;
+ }
+ @Override
+ @com.android.aconfig.annotations.AconfigFlagAccessor
+ @UnsupportedAppUsage
+ public boolean enabledRw() {
+ if (isReadFromNew) {
+ if (!isCached) {
+ init();
+ }
+ } else {
+ if (!aconfig_test_is_cached) {
+ load_overrides_aconfig_test();
+ }
+ }
+ return enabledRw;
+ }
+ }
+ "#;
let mut file_set = HashMap::from([
("com/android/aconfig/test/Flags.java", expect_flags_content.as_str()),
- (
- "com/android/aconfig/test/FeatureFlagsImpl.java",
- &expect_featureflagsimpl_content_old,
- ),
- ("com/android/aconfig/test/FeatureFlags.java", EXPECTED_FEATUREFLAGS_COMMON_CONTENT),
- (
- "com/android/aconfig/test/CustomFeatureFlags.java",
- EXPECTED_CUSTOMFEATUREFLAGS_CONTENT,
- ),
- (
- "com/android/aconfig/test/FakeFeatureFlagsImpl.java",
- EXPECTED_FAKEFEATUREFLAGSIMPL_CONTENT,
- ),
- ]);
-
- for file in generated_files {
- let file_path = file.path.to_str().unwrap();
- assert!(file_set.contains_key(file_path), "Cannot find {}", file_path);
- assert_eq!(
- None,
- crate::test::first_significant_code_diff(
- file_set.get(file_path).unwrap(),
- &String::from_utf8(file.contents).unwrap()
- ),
- "File {} content is not correct",
- file_path
- );
- file_set.remove(file_path);
- }
-
- assert!(file_set.is_empty());
-
- let parsed_flags = crate::test::parse_test_flags();
- let mode = CodegenMode::Production;
- let modified_parsed_flags =
- crate::commands::modify_parsed_flags_based_on_mode(parsed_flags, mode).unwrap();
- let flag_ids =
- assign_flag_ids(crate::test::TEST_PACKAGE, modified_parsed_flags.iter()).unwrap();
- let generated_files = generate_java_code(
- crate::test::TEST_PACKAGE,
- modified_parsed_flags.into_iter(),
- mode,
- flag_ids,
- true,
- )
- .unwrap();
-
- let expect_featureflagsimpl_content_new = expected_featureflagsmpl_content_0.to_owned()
- + r#"
- import android.aconfig.storage.StorageInternalReader;
- import android.util.Log;
- "#
- + expected_featureflagsmpl_content_1
- + r#"
- StorageInternalReader reader;
- boolean readFromNewStorage;
-
- boolean useNewStorageValueAndDiscardOld = false;
-
- private final static String TAG = "AconfigJavaCodegen";
- private final static String SUCCESS_LOG = "success: %s value matches";
- private final static String MISMATCH_LOG = "error: %s value mismatch, new storage value is %s, old storage value is %s";
- private final static String ERROR_LOG = "error: failed to read flag value";
-
- private void init() {
- if (reader != null) return;
- if (DeviceConfig.getBoolean("core_experiments_team_internal", "com.android.providers.settings.storage_test_mission_1", false)) {
- readFromNewStorage = true;
- try {
- reader = new StorageInternalReader("system", "com.android.aconfig.test");
- } catch (Exception e) {
- reader = null;
- }
- }
-
- useNewStorageValueAndDiscardOld =
- DeviceConfig.getBoolean("core_experiments_team_internal", "com.android.providers.settings.use_new_storage_value", false);
- }
-
- private void load_overrides_aconfig_test() {
- try {
- Properties properties = DeviceConfig.getProperties("aconfig_test");
- disabledRw =
- properties.getBoolean(Flags.FLAG_DISABLED_RW, false);
- disabledRwExported =
- properties.getBoolean(Flags.FLAG_DISABLED_RW_EXPORTED, false);
- enabledRw =
- properties.getBoolean(Flags.FLAG_ENABLED_RW, true);
- } catch (NullPointerException e) {
- throw new RuntimeException(
- "Cannot read value from namespace aconfig_test "
- + "from DeviceConfig. It could be that the code using flag "
- + "executed before SettingsProvider initialization. Please use "
- + "fixed read-only flag by adding is_fixed_read_only: true in "
- + "flag declaration.",
- e
- );
- }
- aconfig_test_is_cached = true;
- init();
- if (readFromNewStorage && reader != null) {
- boolean val;
- try {
- val = reader.getBooleanFlagValue(1);
- if (val != disabledRw) {
- Log.w(TAG, String.format(MISMATCH_LOG, "disabledRw", val, disabledRw));
- }
-
- if (useNewStorageValueAndDiscardOld) {
- disabledRw = val;
- }
-
- val = reader.getBooleanFlagValue(2);
- if (val != disabledRwExported) {
- Log.w(TAG, String.format(MISMATCH_LOG, "disabledRwExported", val, disabledRwExported));
- }
-
- if (useNewStorageValueAndDiscardOld) {
- disabledRwExported = val;
- }
-
- val = reader.getBooleanFlagValue(8);
- if (val != enabledRw) {
- Log.w(TAG, String.format(MISMATCH_LOG, "enabledRw", val, enabledRw));
- }
-
- if (useNewStorageValueAndDiscardOld) {
- enabledRw = val;
- }
-
- } catch (Exception e) {
- Log.e(TAG, ERROR_LOG, e);
- }
- }
- }
-
- private void load_overrides_other_namespace() {
- try {
- Properties properties = DeviceConfig.getProperties("other_namespace");
- disabledRwInOtherNamespace =
- properties.getBoolean(Flags.FLAG_DISABLED_RW_IN_OTHER_NAMESPACE, false);
- } catch (NullPointerException e) {
- throw new RuntimeException(
- "Cannot read value from namespace other_namespace "
- + "from DeviceConfig. It could be that the code using flag "
- + "executed before SettingsProvider initialization. Please use "
- + "fixed read-only flag by adding is_fixed_read_only: true in "
- + "flag declaration.",
- e
- );
- }
- other_namespace_is_cached = true;
- init();
- if (readFromNewStorage && reader != null) {
- boolean val;
- try {
- val = reader.getBooleanFlagValue(3);
- if (val != disabledRwInOtherNamespace) {
- Log.w(TAG, String.format(MISMATCH_LOG, "disabledRwInOtherNamespace", val, disabledRwInOtherNamespace));
- }
-
- if (useNewStorageValueAndDiscardOld) {
- disabledRwInOtherNamespace = val;
- }
-
- } catch (Exception e) {
- Log.e(TAG, ERROR_LOG, e);
- }
- }
- }"# + expected_featureflagsmpl_content_2;
-
- let mut file_set = HashMap::from([
- ("com/android/aconfig/test/Flags.java", expect_flags_content.as_str()),
- (
- "com/android/aconfig/test/FeatureFlagsImpl.java",
- &expect_featureflagsimpl_content_new,
- ),
+ ("com/android/aconfig/test/FeatureFlagsImpl.java", expected_featureflagsmpl_content),
("com/android/aconfig/test/FeatureFlags.java", EXPECTED_FEATUREFLAGS_COMMON_CONTENT),
(
"com/android/aconfig/test/CustomFeatureFlags.java",
@@ -908,7 +768,6 @@
private static boolean enabledFixedRoExported = false;
private static boolean enabledRoExported = false;
-
private void load_overrides_aconfig_test() {
try {
Properties properties = DeviceConfig.getProperties("aconfig_test");
@@ -933,21 +792,21 @@
@Override
public boolean disabledRwExported() {
if (!aconfig_test_is_cached) {
- load_overrides_aconfig_test();
+ load_overrides_aconfig_test();
}
return disabledRwExported;
}
@Override
public boolean enabledFixedRoExported() {
if (!aconfig_test_is_cached) {
- load_overrides_aconfig_test();
+ load_overrides_aconfig_test();
}
return enabledFixedRoExported;
}
@Override
public boolean enabledRoExported() {
if (!aconfig_test_is_cached) {
- load_overrides_aconfig_test();
+ load_overrides_aconfig_test();
}
return enabledRoExported;
}
diff --git a/tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template b/tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template
index bc01aa4..d1cf191 100644
--- a/tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template
+++ b/tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template
@@ -9,56 +9,50 @@
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
-
{{ -if not library_exported }}
-{{ -if allow_instrumentation }}
import android.aconfig.storage.StorageInternalReader;
-import android.util.Log;
-{{ -endif }}
+import java.nio.file.Files;
+import java.nio.file.Paths;
{{ -endif }}
{{ -endif }}
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ -if runtime_lookup_required }}
+{{ -if not library_exported }}
+ private static final boolean isReadFromNew = Files.exists(Paths.get("/metadata/aconfig/boot/enable_only_new_storage"));
+ private static volatile boolean isCached = false;
+{{ -endif }}
{{ -for namespace_with_flags in namespace_flags }}
private static volatile boolean {namespace_with_flags.namespace}_is_cached = false;
{{ -endfor- }}
{{ for flag in flag_elements }}
-{{- if flag.is_read_write }}
+{{ -if flag.is_read_write }}
private static boolean {flag.method_name} = {flag.default_value};
{{ -endif }}
{{ -endfor }}
-{{ -if not library_exported }}
-{{ -if allow_instrumentation }}
- StorageInternalReader reader;
- boolean readFromNewStorage;
- boolean useNewStorageValueAndDiscardOld = false;
-
- private final static String TAG = "AconfigJavaCodegen";
- private final static String SUCCESS_LOG = "success: %s value matches";
- private final static String MISMATCH_LOG = "error: %s value mismatch, new storage value is %s, old storage value is %s";
- private final static String ERROR_LOG = "error: failed to read flag value";
-
+{{ if not library_exported }}
private void init() \{
- if (reader != null) return;
- if (DeviceConfig.getBoolean("core_experiments_team_internal", "com.android.providers.settings.storage_test_mission_1", false)) \{
- readFromNewStorage = true;
- try \{
- reader = new StorageInternalReader("{container}", "{package_name}");
- } catch (Exception e) \{
- reader = null;
- }
+ StorageInternalReader reader = null;
+ try \{
+ reader = new StorageInternalReader("{container}", "{package_name}");
+{{ for namespace_with_flags in namespace_flags }}
+{{ -for flag in namespace_with_flags.flags }}
+{{ if flag.is_read_write }}
+ {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset});
+{{ endif }}
+{{ -endfor }}
+{{ -endfor }}
+ } catch (Exception e) \{
+ throw new RuntimeException("Cannot read flag in codegen", e);
}
-
- useNewStorageValueAndDiscardOld =
- DeviceConfig.getBoolean("core_experiments_team_internal", "com.android.providers.settings.use_new_storage_value", false);
+ isCached = true;
}
+{{ endif }}
-{{ -endif }}
-{{ -endif }}
+
{{ for namespace_with_flags in namespace_flags }}
private void load_overrides_{namespace_with_flags.namespace}() \{
try \{
@@ -80,34 +74,9 @@
);
}
{namespace_with_flags.namespace}_is_cached = true;
-{{ -if not library_exported }}
-{{ -if allow_instrumentation }}
- init();
- if (readFromNewStorage && reader != null) \{
- boolean val;
- try \{
-{{ -for flag in namespace_with_flags.flags }}
-{{ -if flag.is_read_write }}
-
- val = reader.getBooleanFlagValue({flag.flag_offset});
- if (val != {flag.method_name}) \{
- Log.w(TAG, String.format(MISMATCH_LOG, "{flag.method_name}", val, {flag.method_name}));
- }
-
- if (useNewStorageValueAndDiscardOld) \{
- {flag.method_name} = val;
- }
-
-{{ -endif }}
-{{ -endfor }}
- } catch (Exception e) \{
- Log.e(TAG, ERROR_LOG, e);
- }
- }
-{{ -endif }}
-{{ -endif }}
}
{{ endfor- }}
+
{{ -endif }}{#- end of runtime_lookup_required #}
{{ -for flag in flag_elements }}
@Override
@@ -116,19 +85,31 @@
@UnsupportedAppUsage
{{ -endif }}
public boolean {flag.method_name}() \{
+{{ -if not library_exported }}
{{ -if flag.is_read_write }}
- if (!{flag.device_config_namespace}_is_cached) \{
- load_overrides_{flag.device_config_namespace}();
+ if (isReadFromNew) \{
+ if (!isCached) \{
+ init();
+ }
+ } else \{
+ if (!{flag.device_config_namespace}_is_cached) \{
+ load_overrides_{flag.device_config_namespace}();
+ }
}
return {flag.method_name};
{{ -else }}
return {flag.default_value};
{{ -endif }}
+{{ else }}
+ if (!{flag.device_config_namespace}_is_cached) \{
+ load_overrides_{flag.device_config_namespace}();
+ }
+ return {flag.method_name};
+{{ -endif }}
}
{{ endfor }}
}
-{{ else }}
-{#- Generate only stub if in test mode #}
+{{ else }} {#- Generate only stub if in test mode #}
/** @hide */
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ for flag in flag_elements }}
diff --git a/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java b/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java
index 844232b..e2ad40a 100644
--- a/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java
+++ b/tools/aconfig/aconfig_device_paths/src/HostDeviceProtosTemplate.java
@@ -25,6 +25,7 @@
/**
* A host lib that can read all aconfig proto file paths on a given device.
+ * This lib is only available on device with root access (userdebug/eng).
*/
public class HostDeviceProtos {
/**
@@ -40,7 +41,8 @@
};
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 RECURSIVELY_LIST_APEX_DIR_COMMAND =
+ "shell su 0 find /apex | grep aconfig_flags";
private static final String APEX_ACONFIG_PATH_SUFFIX = "/etc/aconfig_flags.pb";
diff --git a/tools/aconfig/aconfig_flags/flags.aconfig b/tools/aconfig/aconfig_flags/flags.aconfig
index db8b1b7..0a004ca 100644
--- a/tools/aconfig/aconfig_flags/flags.aconfig
+++ b/tools/aconfig/aconfig_flags/flags.aconfig
@@ -7,3 +7,10 @@
bug: "312235596"
description: "When enabled, aconfig flags are read from the new aconfig storage only."
}
+
+flag {
+ name: "enable_aconfigd_from_mainline"
+ namespace: "core_experiments_team_internal"
+ bug: "369808805"
+ description: "When enabled, launch aconfigd from config infra module."
+}
diff --git a/tools/aconfig/aconfig_flags/src/lib.rs b/tools/aconfig/aconfig_flags/src/lib.rs
index a607efb..2e89127 100644
--- a/tools/aconfig/aconfig_flags/src/lib.rs
+++ b/tools/aconfig/aconfig_flags/src/lib.rs
@@ -34,6 +34,11 @@
pub fn enable_only_new_storage() -> bool {
aconfig_flags_rust::enable_only_new_storage()
}
+
+ /// Returns the value for the enable_aconfigd_from_mainline flag.
+ pub fn enable_aconfigd_from_mainline() -> bool {
+ aconfig_flags_rust::enable_only_new_storage()
+ }
}
/// Module used when building with cargo
@@ -44,4 +49,10 @@
// Used only to enable typechecking and testing with cargo
true
}
+
+ /// Returns a placeholder value for the enable_aconfigd_from_mainline flag.
+ pub fn enable_aconfigd_from_mainline() -> bool {
+ // Used only to enable typechecking and testing with cargo
+ true
+ }
}
diff --git a/tools/aconfig/aconfig_storage_read_api/Android.bp b/tools/aconfig/aconfig_storage_read_api/Android.bp
index f96b223..6ae34f3 100644
--- a/tools/aconfig/aconfig_storage_read_api/Android.bp
+++ b/tools/aconfig/aconfig_storage_read_api/Android.bp
@@ -107,31 +107,12 @@
afdo: true,
}
-soong_config_module_type {
- name: "aconfig_lib_cc_shared_link_defaults",
- module_type: "cc_defaults",
- config_namespace: "Aconfig",
- bool_variables: [
- "read_from_new_storage",
- ],
- properties: [
- "shared_libs",
- ],
-}
-
-soong_config_bool_variable {
- name: "read_from_new_storage",
-}
-
-aconfig_lib_cc_shared_link_defaults {
+cc_defaults {
name: "aconfig_lib_cc_shared_link.defaults",
- soong_config_variables: {
- read_from_new_storage: {
- shared_libs: [
- "libaconfig_storage_read_api_cc",
- ],
- },
- },
+ shared_libs: select(release_flag("RELEASE_READ_FROM_NEW_STORAGE"), {
+ true: ["libaconfig_storage_read_api_cc"],
+ default: [],
+ }),
}
cc_defaults {
diff --git a/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp b/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp
index 7b43574..03a8fa2 100644
--- a/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp
+++ b/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp
@@ -100,18 +100,4 @@
return {};
}
-android::base::Result<void> create_flag_info(
- std::string const& package_map,
- std::string const& flag_map,
- std::string const& flag_info_out) {
- auto creation_cxx = create_flag_info_cxx(
- rust::Str(package_map.c_str()),
- rust::Str(flag_map.c_str()),
- rust::Str(flag_info_out.c_str()));
- if (creation_cxx.success) {
- return {};
- } else {
- return android::base::Error() << creation_cxx.error_message;
- }
-}
} // namespace aconfig_storage
diff --git a/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp b/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp
index 0bba7ff..50a5188 100644
--- a/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp
+++ b/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp
@@ -36,13 +36,4 @@
uint32_t offset,
bool value);
-/// Create flag info file based on package and flag map
-/// \input package_map: package map file
-/// \input flag_map: flag map file
-/// \input flag_info_out: flag info file to be created
-android::base::Result<void> create_flag_info(
- std::string const& package_map,
- std::string const& flag_map,
- std::string const& flag_info_out);
-
} // namespace aconfig_storage
diff --git a/tools/aconfig/aconfig_storage_write_api/src/lib.rs b/tools/aconfig/aconfig_storage_write_api/src/lib.rs
index 0396a63..09bb41f 100644
--- a/tools/aconfig/aconfig_storage_write_api/src/lib.rs
+++ b/tools/aconfig/aconfig_storage_write_api/src/lib.rs
@@ -24,15 +24,10 @@
#[cfg(test)]
mod test_utils;
-use aconfig_storage_file::{
- AconfigStorageError, FlagInfoHeader, FlagInfoList, FlagInfoNode, FlagTable, FlagValueType,
- PackageTable, StorageFileType, StoredFlagType, FILE_VERSION,
-};
+use aconfig_storage_file::{AconfigStorageError, FlagValueType};
use anyhow::anyhow;
use memmap2::MmapMut;
-use std::fs::File;
-use std::io::{Read, Write};
/// Get read write mapped storage files.
///
@@ -104,86 +99,6 @@
})
}
-/// Read in storage file as bytes
-fn read_file_to_bytes(file_path: &str) -> Result<Vec<u8>, AconfigStorageError> {
- let mut file = File::open(file_path).map_err(|errmsg| {
- AconfigStorageError::FileReadFail(anyhow!("Failed to open file {}: {}", file_path, errmsg))
- })?;
- let mut buffer = Vec::new();
- file.read_to_end(&mut buffer).map_err(|errmsg| {
- AconfigStorageError::FileReadFail(anyhow!(
- "Failed to read bytes from file {}: {}",
- file_path,
- errmsg
- ))
- })?;
- Ok(buffer)
-}
-
-/// Create flag info file given package map file and flag map file
-/// \input package_map: package map file
-/// \input flag_map: flag map file
-/// \output flag_info_out: created flag info file
-pub fn create_flag_info(
- package_map: &str,
- flag_map: &str,
- flag_info_out: &str,
-) -> Result<(), AconfigStorageError> {
- let package_table = PackageTable::from_bytes(&read_file_to_bytes(package_map)?)?;
- let flag_table = FlagTable::from_bytes(&read_file_to_bytes(flag_map)?)?;
-
- if package_table.header.container != flag_table.header.container {
- return Err(AconfigStorageError::FileCreationFail(anyhow!(
- "container for package map {} and flag map {} does not match",
- package_table.header.container,
- flag_table.header.container,
- )));
- }
-
- let mut package_start_index = vec![0; package_table.header.num_packages as usize];
- for node in package_table.nodes.iter() {
- package_start_index[node.package_id as usize] = node.boolean_start_index;
- }
-
- let mut is_flag_rw = vec![false; flag_table.header.num_flags as usize];
- for node in flag_table.nodes.iter() {
- let flag_index = package_start_index[node.package_id as usize] + node.flag_index as u32;
- is_flag_rw[flag_index as usize] = node.flag_type == StoredFlagType::ReadWriteBoolean;
- }
-
- let mut list = FlagInfoList {
- header: FlagInfoHeader {
- version: FILE_VERSION,
- container: flag_table.header.container,
- file_type: StorageFileType::FlagInfo as u8,
- file_size: 0,
- num_flags: flag_table.header.num_flags,
- boolean_flag_offset: 0,
- },
- nodes: is_flag_rw.iter().map(|&rw| FlagInfoNode::create(rw)).collect(),
- };
-
- list.header.boolean_flag_offset = list.header.into_bytes().len() as u32;
- list.header.file_size = list.into_bytes().len() as u32;
-
- let mut file = File::create(flag_info_out).map_err(|errmsg| {
- AconfigStorageError::FileCreationFail(anyhow!(
- "fail to create file {}: {}",
- flag_info_out,
- errmsg
- ))
- })?;
- file.write_all(&list.into_bytes()).map_err(|errmsg| {
- AconfigStorageError::FileCreationFail(anyhow!(
- "fail to write to file {}: {}",
- flag_info_out,
- errmsg
- ))
- })?;
-
- Ok(())
-}
-
// *************************************** //
// CC INTERLOP
// *************************************** //
@@ -212,12 +127,6 @@
pub error_message: String,
}
- // Flag info file creation return for cc interlop
- pub struct FlagInfoCreationCXX {
- pub success: bool,
- pub error_message: String,
- }
-
// Rust export to c++
extern "Rust" {
pub fn update_boolean_flag_value_cxx(
@@ -239,12 +148,6 @@
offset: u32,
value: bool,
) -> FlagHasLocalOverrideUpdateCXX;
-
- pub fn create_flag_info_cxx(
- package_map: &str,
- flag_map: &str,
- flag_info_out: &str,
- ) -> FlagInfoCreationCXX;
}
}
@@ -329,34 +232,15 @@
}
}
-/// Create flag info file cc interlop
-pub(crate) fn create_flag_info_cxx(
- package_map: &str,
- flag_map: &str,
- flag_info_out: &str,
-) -> ffi::FlagInfoCreationCXX {
- match create_flag_info(package_map, flag_map, flag_info_out) {
- Ok(()) => ffi::FlagInfoCreationCXX { success: true, error_message: String::from("") },
- Err(errmsg) => {
- ffi::FlagInfoCreationCXX { success: false, error_message: format!("{:?}", errmsg) }
- }
- }
-}
-
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::copy_to_temp_file;
- use aconfig_storage_file::test_utils::{
- create_test_flag_info_list, create_test_flag_table, create_test_package_table,
- write_bytes_to_temp_file,
- };
use aconfig_storage_file::FlagInfoBit;
use aconfig_storage_read_api::flag_info_query::find_flag_attribute;
use aconfig_storage_read_api::flag_value_query::find_boolean_flag_value;
use std::fs::File;
use std::io::Read;
- use tempfile::NamedTempFile;
fn get_boolean_flag_value_at_offset(file: &str, offset: u32) -> bool {
let mut f = File::open(&file).unwrap();
@@ -439,31 +323,4 @@
}
}
}
-
- fn create_empty_temp_file() -> Result<NamedTempFile, AconfigStorageError> {
- let file = NamedTempFile::new().map_err(|_| {
- AconfigStorageError::FileCreationFail(anyhow!("Failed to create temp file"))
- })?;
- Ok(file)
- }
-
- #[test]
- // this test point locks down the flag info creation
- fn test_create_flag_info() {
- let package_table =
- write_bytes_to_temp_file(&create_test_package_table().into_bytes()).unwrap();
- let flag_table = write_bytes_to_temp_file(&create_test_flag_table().into_bytes()).unwrap();
- let flag_info = create_empty_temp_file().unwrap();
-
- let package_table_path = package_table.path().display().to_string();
- let flag_table_path = flag_table.path().display().to_string();
- let flag_info_path = flag_info.path().display().to_string();
-
- assert!(create_flag_info(&package_table_path, &flag_table_path, &flag_info_path).is_ok());
-
- let flag_info =
- FlagInfoList::from_bytes(&read_file_to_bytes(&flag_info_path).unwrap()).unwrap();
- let expected_flag_info = create_test_flag_info_list();
- assert_eq!(flag_info, expected_flag_info);
- }
}
diff --git a/tools/auto_gen_test_config.py b/tools/auto_gen_test_config.py
index 8ee599a..d54c412 100755
--- a/tools/auto_gen_test_config.py
+++ b/tools/auto_gen_test_config.py
@@ -34,6 +34,7 @@
PLACEHOLDER_PACKAGE = '{PACKAGE}'
PLACEHOLDER_RUNNER = '{RUNNER}'
PLACEHOLDER_TEST_TYPE = '{TEST_TYPE}'
+PLACEHOLDER_EXTRA_TEST_RUNNER_CONFIGS = '{EXTRA_TEST_RUNNER_CONFIGS}'
def main(argv):
@@ -59,6 +60,7 @@
"instrumentation_test_config_template",
help="Path to the instrumentation test config template.")
parser.add_argument("--extra-configs", default="")
+ parser.add_argument("--extra-test-runner-configs", default="")
args = parser.parse_args(argv)
target_config = args.target_config
@@ -66,6 +68,7 @@
empty_config = args.empty_config
instrumentation_test_config_template = args.instrumentation_test_config_template
extra_configs = '\n'.join(args.extra_configs.split('\\n'))
+ extra_test_runner_configs = '\n'.join(args.extra_test_runner_configs.split('\\n'))
module = os.path.splitext(os.path.basename(target_config))[0]
@@ -131,6 +134,7 @@
config = config.replace(PLACEHOLDER_PACKAGE, package)
config = config.replace(PLACEHOLDER_TEST_TYPE, test_type)
config = config.replace(PLACEHOLDER_EXTRA_CONFIGS, extra_configs)
+ config = config.replace(PLACEHOLDER_EXTRA_TEST_RUNNER_CONFIGS, extra_test_runner_configs)
config = config.replace(PLACEHOLDER_RUNNER, runner)
with open(target_config, 'w') as config_file:
config_file.write(config)
diff --git a/tools/edit_monitor/daemon_manager.py b/tools/edit_monitor/daemon_manager.py
index 8ec2588..79831a7 100644
--- a/tools/edit_monitor/daemon_manager.py
+++ b/tools/edit_monitor/daemon_manager.py
@@ -25,6 +25,9 @@
DEFAULT_PROCESS_TERMINATION_TIMEOUT_SECONDS = 1
+DEFAULT_MONITOR_INTERVAL_SECONDS = 5
+DEFAULT_MEMORY_USAGE_THRESHOLD = 2000
+DEFAULT_CPU_USAGE_THRESHOLD = 10
def default_daemon_target():
@@ -48,6 +51,9 @@
self.pid = os.getpid()
self.daemon_process = None
+ self.max_memory_usage = 0
+ self.max_cpu_usage = 0
+
pid_file_dir = pathlib.Path(tempfile.gettempdir()).joinpath("edit_monitor")
pid_file_dir.mkdir(parents=True, exist_ok=True)
self.pid_file_path = self._get_pid_file_path(pid_file_dir)
@@ -61,6 +67,50 @@
except Exception as e:
logging.exception("Failed to start daemon manager with error %s", e)
+ def monitor_daemon(
+ self,
+ interval: int = DEFAULT_MONITOR_INTERVAL_SECONDS,
+ memory_threshold: float = DEFAULT_MEMORY_USAGE_THRESHOLD,
+ cpu_threshold: float = DEFAULT_CPU_USAGE_THRESHOLD,
+ ):
+ """Monits the daemon process status.
+
+ Periodically check the CPU/Memory usage of the daemon process as long as the
+ process is still running and kill the process if the resource usage is above
+ given thresholds.
+ """
+ logging.info("start monitoring daemon process %d.", self.daemon_process.pid)
+
+ while self.daemon_process.is_alive():
+ try:
+ memory_usage = self._get_process_memory_percent(self.daemon_process.pid)
+ self.max_memory_usage = max(self.max_memory_usage, memory_usage)
+
+ cpu_usage = self._get_process_cpu_percent(self.daemon_process.pid)
+ self.max_cpu_usage = max(self.max_cpu_usage, cpu_usage)
+
+ time.sleep(interval)
+ except Exception as e:
+ # Logging the error and continue.
+ logging.warning("Failed to monitor daemon process with error: %s", e)
+
+ if (
+ self.max_memory_usage >= memory_threshold
+ or self.max_cpu_usage >= cpu_threshold
+ ):
+ logging.error(
+ "Daemon process is consuming too much resource, killing..."
+ ),
+ self._terminate_process(self.daemon_process.pid)
+
+ logging.info(
+ "Daemon process %d terminated. Max memory usage: %f, Max cpu"
+ " usage: %f.",
+ self.daemon_process.pid,
+ self.max_memory_usage,
+ self.max_cpu_usage,
+ )
+
def stop(self):
"""Stops the daemon process and removes the pidfile."""
@@ -180,3 +230,45 @@
logging.info("pid_file_path: %s", pid_file_path)
return pid_file_path
+
+ def _get_process_memory_percent(self, pid: int) -> float:
+ try:
+ with open(f"/proc/{pid}/stat", "r") as f:
+ stat_data = f.readline().split()
+ # RSS is the 24th field in /proc/[pid]/stat
+ rss_pages = int(stat_data[23])
+ return rss_pages * 4 / 1024 # Covert to MB
+ except (FileNotFoundError, IndexError, ValueError, IOError) as e:
+ logging.exception("Failed to get memory usage.")
+ raise e
+
+ def _get_process_cpu_percent(self, pid: int, interval: int = 1) -> float:
+ try:
+ total_start_time = self._get_total_cpu_time(pid)
+ with open("/proc/uptime", "r") as f:
+ uptime_start = float(f.readline().split()[0])
+
+ time.sleep(interval)
+
+ total_end_time = self._get_total_cpu_time(pid)
+ with open("/proc/uptime", "r") as f:
+ uptime_end = float(f.readline().split()[0])
+
+ return (
+ (total_end_time - total_start_time)
+ / (uptime_end - uptime_start)
+ * 100
+ )
+ except (FileNotFoundError, IndexError, ValueError, IOError) as e:
+ logging.exception("Failed to get CPU usage.")
+ raise e
+
+ def _get_total_cpu_time(self, pid: int) -> float:
+ with open(f"/proc/{str(pid)}/stat", "r") as f:
+ stats = f.readline().split()
+ # utime is the 14th field in /proc/[pid]/stat measured in clock ticks.
+ utime = int(stats[13])
+ # stime is the 15th field in /proc/[pid]/stat measured in clock ticks.
+ stime = int(stats[14])
+ return (utime + stime) / os.sysconf(os.sysconf_names["SC_CLK_TCK"])
+
diff --git a/tools/edit_monitor/daemon_manager_test.py b/tools/edit_monitor/daemon_manager_test.py
index 214b038..0c9e04b 100644
--- a/tools/edit_monitor/daemon_manager_test.py
+++ b/tools/edit_monitor/daemon_manager_test.py
@@ -43,6 +43,25 @@
time.sleep(1)
+def memory_consume_daemon_target(size_mb):
+ try:
+ size_bytes = size_mb * 1024 * 1024
+ dummy_data = bytearray(size_bytes)
+ time.sleep(10)
+ except MemoryError:
+ print(f'Process failed to allocate {size_mb} MB of memory.')
+
+
+def cpu_consume_daemon_target(target_usage_percent):
+ while True:
+ start_time = time.time()
+ while time.time() - start_time < target_usage_percent / 100:
+ pass # Busy loop to consume CPU
+
+ # Sleep to reduce CPU usage
+ time.sleep(1 - target_usage_percent / 100)
+
+
class DaemonManagerTest(unittest.TestCase):
@classmethod
@@ -102,7 +121,7 @@
def test_start_success_with_existing_instance_from_different_binary(self):
# First start an instance based on "some_binary_path"
existing_dm = daemon_manager.DaemonManager(
- "some_binary_path",
+ 'some_binary_path',
daemon_target=long_running_daemon,
)
existing_dm.start()
@@ -149,6 +168,35 @@
# Verifies no daemon process is started.
self.assertIsNone(dm.daemon_process)
+ def test_monitor_daemon_subprocess_killed_high_memory_usage(self):
+ dm = daemon_manager.DaemonManager(
+ TEST_BINARY_FILE,
+ daemon_target=memory_consume_daemon_target,
+ daemon_args=(2,),
+ )
+ dm.start()
+ dm.monitor_daemon(interval=1, memory_threshold=2)
+
+ self.assertTrue(dm.max_memory_usage >= 2)
+ self.assert_no_subprocess_running()
+
+ def test_monitor_daemon_subprocess_killed_high_cpu_usage(self):
+ dm = daemon_manager.DaemonManager(
+ TEST_BINARY_FILE,
+ daemon_target=cpu_consume_daemon_target,
+ daemon_args=(20,),
+ )
+ dm.start()
+ dm.monitor_daemon(interval=1, cpu_threshold=20)
+
+ self.assertTrue(dm.max_cpu_usage >= 20)
+ self.assert_no_subprocess_running()
+
+ @mock.patch('subprocess.check_output')
+ def test_monitor_daemon_failed_does_not_matter(self, mock_output):
+ mock_output.side_effect = OSError('Unknown OSError')
+ self.assert_run_simple_daemon_success()
+
def test_stop_success(self):
dm = daemon_manager.DaemonManager(
TEST_BINARY_FILE, daemon_target=long_running_daemon
@@ -194,7 +242,7 @@
daemon_args=(damone_output_file.name,),
)
dm.start()
- dm.daemon_process.join()
+ dm.monitor_daemon(interval=1)
# Verifies the expected pid file is created.
expected_pid_file_path = pathlib.Path(self.working_dir.name).joinpath(
diff --git a/tools/filelistdiff/allowlist b/tools/filelistdiff/allowlist
index 10bc8d5..ae8a662 100644
--- a/tools/filelistdiff/allowlist
+++ b/tools/filelistdiff/allowlist
@@ -1,17 +1,11 @@
# Known diffs only in the KATI system image
-etc/NOTICE.xml.gz
framework/oat/x86_64/apex@com.android.compos@javalib@service-compos.jar@classes.odex
framework/oat/x86_64/apex@com.android.compos@javalib@service-compos.jar@classes.odex.fsv_meta
framework/oat/x86_64/apex@com.android.compos@javalib@service-compos.jar@classes.vdex
framework/oat/x86_64/apex@com.android.compos@javalib@service-compos.jar@classes.vdex.fsv_meta
-lib/libvendorsupport.so
+# Known diffs that are installed in either system image with the configuration
# b/353429422
init.environ.rc
-
-# Known diffs only in the Soong system image
-lib/libhidcommand_jni.so
-lib/libuinputcommand_jni.so
-
-# Known diffs in internal source
-etc/aconfig/flag.info
+# b/338342381
+etc/NOTICE.xml.gz
diff --git a/tools/filelistdiff/file_list_diff.py b/tools/filelistdiff/file_list_diff.py
index cdc5b2e..30ed107 100644
--- a/tools/filelistdiff/file_list_diff.py
+++ b/tools/filelistdiff/file_list_diff.py
@@ -34,23 +34,24 @@
unique_in_soong = set(filter(is_unknown_diff, soong_files - kati_files))
if unique_in_kati:
- print(f'{COLOR_ERROR}Please add following modules into system image module {system_module_name}.{COLOR_NORMAL}')
- print(f'{COLOR_WARNING}KATI only module(s):{COLOR_NORMAL}')
+ print('')
+ print(f'{COLOR_ERROR}Missing required modules in {system_module_name} module.{COLOR_NORMAL}')
+ print(f'To resolve this issue, please add the modules to the Android.bp file for the {system_module_name} to install the following KATI only installed files.')
+ print(f'You can find the correct Android.bp file using the command "gomod {system_module_name}".')
+ print(f'{COLOR_WARNING}KATI only installed file(s):{COLOR_NORMAL}')
for item in sorted(unique_in_kati):
- print(item)
+ print(' '+item)
if unique_in_soong:
- if unique_in_kati:
- print('')
-
- print(f'{COLOR_ERROR}Please add following modules into build/make/target/product/base_system.mk.{COLOR_NORMAL}')
- print(f'{COLOR_WARNING}Soong only module(s):{COLOR_NORMAL}')
+ print('')
+ print(f'{COLOR_ERROR}Missing packages in base_system.mk.{COLOR_NORMAL}')
+ print('Please add packages into build/make/target/product/base_system.mk or build/make/tools/filelistdiff/allowlist to install or skip the following Soong only installed files.')
+ print(f'{COLOR_WARNING}Soong only installed file(s):{COLOR_NORMAL}')
for item in sorted(unique_in_soong):
- print(item)
+ print(' '+item)
if unique_in_kati or unique_in_soong:
print('')
- print(f'{COLOR_ERROR}FAILED: System image from KATI and SOONG differs from installed file list.{COLOR_NORMAL}')
sys.exit(1)
diff --git a/tools/signapk/src/com/android/signapk/SignApk.java b/tools/signapk/src/com/android/signapk/SignApk.java
index 6b2341b..654e196 100644
--- a/tools/signapk/src/com/android/signapk/SignApk.java
+++ b/tools/signapk/src/com/android/signapk/SignApk.java
@@ -302,7 +302,6 @@
final KeyStore keyStore, final String keyName)
throws CertificateException, KeyStoreException, NoSuchAlgorithmException,
UnrecoverableKeyException, UnrecoverableEntryException {
- final Key key = keyStore.getKey(keyName, readPassword(keyName));
final PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(keyName, null);
if (privateKeyEntry == null) {
throw new Error(