From 9a149b677c954bd111608d0bc80855ddbcb72d93 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Thu, 3 Sep 2026 20:56:30 +0000 Subject: [PATCH 1/7] [Android] Add exit code constants and ProcessExitInfo data model --- .../_internal/platforms/android/constants.py | 30 +++++++++++++++++++ .../_internal/platforms/android/util.py | 12 ++++++++ 2 files changed, 42 insertions(+) diff --git a/src/clusterfuzz/_internal/platforms/android/constants.py b/src/clusterfuzz/_internal/platforms/android/constants.py index 86739d43fa3..2233e6bd553 100644 --- a/src/clusterfuzz/_internal/platforms/android/constants.py +++ b/src/clusterfuzz/_internal/platforms/android/constants.py @@ -83,3 +83,33 @@ # Restrict pixel6 from picking up generic Android jobs to avoid # Binary Mismatch: Hence, 'ANDROID:PIXEL6' is added to the list. DEVICES_WITH_NO_FALLBACK_QUEUE_LIST = ['ANDROID:PIXEL6'] + + +class ExitReason: + """Android process exit reasons from ApplicationExitInfo.""" + + EXIT_SELF = 1 + SIGNALED = 2 + LOW_MEMORY = 3 + CRASH = 4 + CRASH_NATIVE = 5 + ANR = 6 + INITIALIZATION_FAILURE = 7 + PERMISSION_CHANGE = 8 + EXCESSIVE_RESOURCE_USAGE = 9 + USER_REQUESTED = 10 + USER_STOPPED = 11 + DEPENDENCY_DIED = 12 + OTHER_KILLS_BY_SYSTEM = 13 + FREEZER = 14 + PACKAGE_STATE_CHANGE = 15 + PACKAGE_UPDATED = 16 + + +class ExitStatus: + """Process exit signal statuses.""" + + SIGILL = 4 + SIGABRT = 6 + SIGKILL = 9 + SIGSEGV = 11 diff --git a/src/clusterfuzz/_internal/platforms/android/util.py b/src/clusterfuzz/_internal/platforms/android/util.py index 3cab131b78a..27f93023679 100644 --- a/src/clusterfuzz/_internal/platforms/android/util.py +++ b/src/clusterfuzz/_internal/platforms/android/util.py @@ -13,6 +13,7 @@ # limitations under the License. """Utility functions for Android device.""" +from dataclasses import dataclass import os from clusterfuzz._internal.metrics import logs @@ -20,6 +21,17 @@ from clusterfuzz._internal.system import environment +@dataclass(frozen=True) +class ProcessExitInfo: + """DTO representing process exit metadata from dumpsys activity exit-info.""" + + reason: int + reason_name: str # e.g., 'APP CRASH(NATIVE)', 'SIGNALED' + subreason: int + subreason_name: str # e.g., 'UNKNOWN', 'ISOLATED NOT NEEDED' + status: int + + def get_device_path(local_path): """Returns device path for the given local path.""" root_directory = environment.get_root_directory() From 13e806a603a9f051eca2ffd9f0ef60375ad80093 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Thu, 3 Sep 2026 22:38:57 +0000 Subject: [PATCH 2/7] [Android] Adds reference to docs --- src/clusterfuzz/_internal/platforms/android/constants.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/clusterfuzz/_internal/platforms/android/constants.py b/src/clusterfuzz/_internal/platforms/android/constants.py index 2233e6bd553..9269cb268bf 100644 --- a/src/clusterfuzz/_internal/platforms/android/constants.py +++ b/src/clusterfuzz/_internal/platforms/android/constants.py @@ -86,7 +86,9 @@ class ExitReason: - """Android process exit reasons from ApplicationExitInfo.""" + """Android process exit reasons from ApplicationExitInfo. Taken from + https://developer.android.com/reference/android/app/ApplicationExitInfo + """ EXIT_SELF = 1 SIGNALED = 2 @@ -107,7 +109,9 @@ class ExitReason: class ExitStatus: - """Process exit signal statuses.""" + """Process exit signal statuses. Taken from + https://developer.android.com/reference/android/app/ApplicationExitInfo + """ SIGILL = 4 SIGABRT = 6 From d9349f1111de983bf13493dddb250f1e730460de Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Fri, 4 Sep 2026 17:13:06 +0000 Subject: [PATCH 3/7] [Android] Adds missing reasons & adds link to android docs --- src/clusterfuzz/_internal/platforms/android/constants.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/clusterfuzz/_internal/platforms/android/constants.py b/src/clusterfuzz/_internal/platforms/android/constants.py index 9269cb268bf..bebf9fca55c 100644 --- a/src/clusterfuzz/_internal/platforms/android/constants.py +++ b/src/clusterfuzz/_internal/platforms/android/constants.py @@ -106,11 +106,13 @@ class ExitReason: FREEZER = 14 PACKAGE_STATE_CHANGE = 15 PACKAGE_UPDATED = 16 + REASON_MEMORY_LIMITER = 17 + REASON_ANOMALY = 18 class ExitStatus: - """Process exit signal statuses. Taken from - https://developer.android.com/reference/android/app/ApplicationExitInfo + """Process exit signal statuses. Taken from: + https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/os/Process.java?q=content:SIGNAL_KILL """ SIGILL = 4 From 75d25bc05318c903e95358f9596ae66271a969c5 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Fri, 4 Sep 2026 18:01:06 +0000 Subject: [PATCH 4/7] [Android] Adds more docs links! --- src/clusterfuzz/_internal/platforms/android/util.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/clusterfuzz/_internal/platforms/android/util.py b/src/clusterfuzz/_internal/platforms/android/util.py index 27f93023679..8a111aed1d5 100644 --- a/src/clusterfuzz/_internal/platforms/android/util.py +++ b/src/clusterfuzz/_internal/platforms/android/util.py @@ -23,7 +23,11 @@ @dataclass(frozen=True) class ProcessExitInfo: - """DTO representing process exit metadata from dumpsys activity exit-info.""" + """DTO representing process exit metadata from dumpsys activity exit-info. + + For a full list of android exit info reasons and subreasons, see: + https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/proto_logging/stats/enums/app_shared/app_enums.proto;l=270?q=content:subreason + """ reason: int reason_name: str # e.g., 'APP CRASH(NATIVE)', 'SIGNALED' From c9ab66816cdbbe1b8c49ca434e10a58e56b99ee6 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Fri, 4 Sep 2026 22:12:38 +0000 Subject: [PATCH 5/7] [Android] Update enums to be used inside our DTO --- src/clusterfuzz/_internal/platforms/android/constants.py | 5 +++-- src/clusterfuzz/_internal/platforms/android/util.py | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/clusterfuzz/_internal/platforms/android/constants.py b/src/clusterfuzz/_internal/platforms/android/constants.py index bebf9fca55c..c8a0e066792 100644 --- a/src/clusterfuzz/_internal/platforms/android/constants.py +++ b/src/clusterfuzz/_internal/platforms/android/constants.py @@ -13,6 +13,7 @@ # limitations under the License. """Common constants.""" +from enum import IntEnum import re DEVICE_DOWNLOAD_DIR = '/sdcard/Download' @@ -85,7 +86,7 @@ DEVICES_WITH_NO_FALLBACK_QUEUE_LIST = ['ANDROID:PIXEL6'] -class ExitReason: +class ExitReason(IntEnum): """Android process exit reasons from ApplicationExitInfo. Taken from https://developer.android.com/reference/android/app/ApplicationExitInfo """ @@ -110,7 +111,7 @@ class ExitReason: REASON_ANOMALY = 18 -class ExitStatus: +class ExitStatus(IntEnum): """Process exit signal statuses. Taken from: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/os/Process.java?q=content:SIGNAL_KILL """ diff --git a/src/clusterfuzz/_internal/platforms/android/util.py b/src/clusterfuzz/_internal/platforms/android/util.py index 8a111aed1d5..6b9c7f5404a 100644 --- a/src/clusterfuzz/_internal/platforms/android/util.py +++ b/src/clusterfuzz/_internal/platforms/android/util.py @@ -29,11 +29,11 @@ class ProcessExitInfo: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/proto_logging/stats/enums/app_shared/app_enums.proto;l=270?q=content:subreason """ - reason: int - reason_name: str # e.g., 'APP CRASH(NATIVE)', 'SIGNALED' + reason: android.constants.ExitReason | int + reason_name: str # e.g., 'APP_CRASH(NATIVE)', 'SIGNALED' subreason: int - subreason_name: str # e.g., 'UNKNOWN', 'ISOLATED NOT NEEDED' - status: int + subreason_name: str # e.g., 'UNKNOWN', 'ISOLATED_NOT_NEEDED' + status: android.constants.ExitStatus | int def get_device_path(local_path): From 680ef2825545c6bbe0b7f8f59c26e2c3f41fd49b Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Fri, 4 Sep 2026 22:27:41 +0000 Subject: [PATCH 6/7] [Android] Removes one of cs links --- src/clusterfuzz/_internal/platforms/android/constants.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/clusterfuzz/_internal/platforms/android/constants.py b/src/clusterfuzz/_internal/platforms/android/constants.py index c8a0e066792..af3cda7f16d 100644 --- a/src/clusterfuzz/_internal/platforms/android/constants.py +++ b/src/clusterfuzz/_internal/platforms/android/constants.py @@ -112,10 +112,12 @@ class ExitReason(IntEnum): class ExitStatus(IntEnum): - """Process exit signal statuses. Taken from: - https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/os/Process.java?q=content:SIGNAL_KILL + """Process exit signal statuses corresponding to POSIX signals. + + See: https://developer.android.com/reference/android/os/Process """ + SIGQUIT = 3 SIGILL = 4 SIGABRT = 6 SIGKILL = 9 From 61ad6176226362ba7915e340b058c5edbaf4a853 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Fri, 4 Sep 2026 22:29:35 +0000 Subject: [PATCH 7/7] [Android] Adds reason uknown --- src/clusterfuzz/_internal/platforms/android/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/clusterfuzz/_internal/platforms/android/constants.py b/src/clusterfuzz/_internal/platforms/android/constants.py index af3cda7f16d..3beb91cf572 100644 --- a/src/clusterfuzz/_internal/platforms/android/constants.py +++ b/src/clusterfuzz/_internal/platforms/android/constants.py @@ -91,6 +91,7 @@ class ExitReason(IntEnum): https://developer.android.com/reference/android/app/ApplicationExitInfo """ + UNKNOWN = 0 EXIT_SELF = 1 SIGNALED = 2 LOW_MEMORY = 3