diff options
| -rw-r--r-- | AconfigFlags.bp | 14 | ||||
| -rw-r--r-- | core/api/system-current.txt | 5 | ||||
| -rw-r--r-- | core/java/android/hardware/usb/UsbPort.java | 20 | ||||
| -rw-r--r-- | core/java/android/hardware/usb/UsbPortStatus.java | 62 | ||||
| -rw-r--r-- | core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig | 8 | ||||
| -rw-r--r-- | core/java/android/window/flags/responsible_apis.aconfig | 7 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/BackgroundActivityStartController.java | 32 | ||||
| -rw-r--r-- | services/usb/Android.bp | 2 | ||||
| -rw-r--r-- | services/usb/java/com/android/server/usb/UsbService.java | 7 | ||||
| -rw-r--r-- | services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java | 19 |
10 files changed, 159 insertions, 17 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp index ab0d5a33977d..3a772e1b43a8 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -61,6 +61,7 @@ aconfig_srcjars = [ ":service-jobscheduler-deviceidle.flags-aconfig-java{.generated_srcjars}", ":surfaceflinger_flags_java_lib{.generated_srcjars}", ":android.view.contentcapture.flags-aconfig-java{.generated_srcjars}", + ":android.hardware.usb.flags-aconfig-java{.generated_srcjars}", ] filegroup { @@ -681,3 +682,16 @@ java_aconfig_library { aconfig_declarations: "android.view.contentcapture.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], } + +// USB +aconfig_declarations { + name: "android.hardware.usb.flags-aconfig", + package: "android.hardware.usb.flags", + srcs: ["core/java/android/hardware/usb/flags/*.aconfig"], +} + +java_aconfig_library { + name: "android.hardware.usb.flags-aconfig-java", + aconfig_declarations: "android.hardware.usb.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 2a3593b2c481..8bebd6b7c281 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -6188,8 +6188,13 @@ package android.hardware.usb { method public void writeToParcel(android.os.Parcel, int); field public static final int COMPLIANCE_WARNING_BC_1_2 = 3; // 0x3 field public static final int COMPLIANCE_WARNING_DEBUG_ACCESSORY = 2; // 0x2 + field @FlaggedApi("android.hardware.usb.flags.enable_usb_data_compliance_warning") public static final int COMPLIANCE_WARNING_ENUMERATION_FAIL = 7; // 0x7 + field @FlaggedApi("android.hardware.usb.flags.enable_usb_data_compliance_warning") public static final int COMPLIANCE_WARNING_FLAKY_CONNECTION = 8; // 0x8 + field @FlaggedApi("android.hardware.usb.flags.enable_usb_data_compliance_warning") public static final int COMPLIANCE_WARNING_INPUT_POWER_LIMITED = 5; // 0x5 + field @FlaggedApi("android.hardware.usb.flags.enable_usb_data_compliance_warning") public static final int COMPLIANCE_WARNING_MISSING_DATA_LINES = 6; // 0x6 field public static final int COMPLIANCE_WARNING_MISSING_RP = 4; // 0x4 field public static final int COMPLIANCE_WARNING_OTHER = 1; // 0x1 + field @FlaggedApi("android.hardware.usb.flags.enable_usb_data_compliance_warning") public static final int COMPLIANCE_WARNING_UNRELIABLE_IO = 9; // 0x9 field @NonNull public static final android.os.Parcelable.Creator<android.hardware.usb.UsbPortStatus> CREATOR; field public static final int DATA_ROLE_DEVICE = 2; // 0x2 field public static final int DATA_ROLE_HOST = 1; // 0x1 diff --git a/core/java/android/hardware/usb/UsbPort.java b/core/java/android/hardware/usb/UsbPort.java index 490b128d8bac..8f0149b39b9a 100644 --- a/core/java/android/hardware/usb/UsbPort.java +++ b/core/java/android/hardware/usb/UsbPort.java @@ -52,6 +52,11 @@ import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESS import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_BC_1_2; import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP; import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_OTHER; +import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_INPUT_POWER_LIMITED; +import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_MISSING_DATA_LINES; +import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_ENUMERATION_FAIL; +import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_FLAKY_CONNECTION; +import static android.hardware.usb.UsbPortStatus.COMPLIANCE_WARNING_UNRELIABLE_IO; import static android.hardware.usb.DisplayPortAltModeInfo.DISPLAYPORT_ALT_MODE_STATUS_UNKNOWN; import static android.hardware.usb.DisplayPortAltModeInfo.DISPLAYPORT_ALT_MODE_STATUS_NOT_CAPABLE; import static android.hardware.usb.DisplayPortAltModeInfo.DISPLAYPORT_ALT_MODE_STATUS_CAPABLE_DISABLED; @@ -789,6 +794,21 @@ public final class UsbPort { case UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP: complianceWarningString.append("missing rp, "); break; + case UsbPortStatus.COMPLIANCE_WARNING_INPUT_POWER_LIMITED: + complianceWarningString.append("input power limited, "); + break; + case UsbPortStatus.COMPLIANCE_WARNING_MISSING_DATA_LINES: + complianceWarningString.append("missing data lines, "); + break; + case UsbPortStatus.COMPLIANCE_WARNING_ENUMERATION_FAIL: + complianceWarningString.append("enumeration fail, "); + break; + case UsbPortStatus.COMPLIANCE_WARNING_FLAKY_CONNECTION: + complianceWarningString.append("flaky connection, "); + break; + case UsbPortStatus.COMPLIANCE_WARNING_UNRELIABLE_IO: + complianceWarningString.append("unreliable io, "); + break; default: complianceWarningString.append(String.format("Unknown(%d), ", warning)); break; diff --git a/core/java/android/hardware/usb/UsbPortStatus.java b/core/java/android/hardware/usb/UsbPortStatus.java index b4fe3a2a249c..d95924002f1f 100644 --- a/core/java/android/hardware/usb/UsbPortStatus.java +++ b/core/java/android/hardware/usb/UsbPortStatus.java @@ -18,11 +18,13 @@ package android.hardware.usb; import android.Manifest; import android.annotation.CheckResult; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; +import android.hardware.usb.flags.Flags; import android.os.Parcel; import android.os.Parcelable; @@ -310,6 +312,54 @@ public final class UsbPortStatus implements Parcelable { public static final int COMPLIANCE_WARNING_MISSING_RP = 4; /** + * Used to indicate the charging setups on the USB ports are unable to + * deliver negotiated power. Introduced in Android V (API level 35) + * and client applicantions that target API levels lower than 35 will + * receive {@link #COMPLIANCE_WARNING_OTHER} instead. + */ + @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) + public static final int COMPLIANCE_WARNING_INPUT_POWER_LIMITED = 5; + + /** + * Used to indicate the cable/connector on the USB ports are missing + * the required wires on the data pins to make data transfer. + * Introduced in Android V (API level 35) and client applicantions that + * target API levels lower than 35 will receive + * {@link #COMPLIANCE_WARNING_OTHER} instead. + */ + @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) + public static final int COMPLIANCE_WARNING_MISSING_DATA_LINES = 6; + + /** + * Used to indicate enumeration failures on the USB ports, potentially due to + * signal integrity issues or other causes. Introduced in Android V + * (API level 35) and client applicantions that target API levels lower + * than 35 will receive {@link #COMPLIANCE_WARNING_OTHER} instead. + */ + @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) + public static final int COMPLIANCE_WARNING_ENUMERATION_FAIL = 7; + + /** + * Used to indicate unexpected data disconnection on the USB ports, + * potentially due to signal integrity issues or other causes. + * Introduced in Android V (API level 35) and client applicantions that + * target API levels lower than 35 will receive + * {@link #COMPLIANCE_WARNING_OTHER} instead. + */ + @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) + public static final int COMPLIANCE_WARNING_FLAKY_CONNECTION = 8; + + /** + * Used to indicate unreliable or slow data transfer on the USB ports, + * potentially due to signal integrity issues or other causes. + * Introduced in Android V (API level 35) and client applicantions that + * target API levels lower than 35 will receive + * {@link #COMPLIANCE_WARNING_OTHER} instead. + */ + @FlaggedApi(Flags.FLAG_ENABLE_USB_DATA_COMPLIANCE_WARNING) + public static final int COMPLIANCE_WARNING_UNRELIABLE_IO = 9; + + /** * Indicates that the Type-C plug orientation cannot be * determined because the connected state of the device is unknown. */ @@ -372,6 +422,11 @@ public final class UsbPortStatus implements Parcelable { COMPLIANCE_WARNING_DEBUG_ACCESSORY, COMPLIANCE_WARNING_BC_1_2, COMPLIANCE_WARNING_MISSING_RP, + COMPLIANCE_WARNING_INPUT_POWER_LIMITED, + COMPLIANCE_WARNING_MISSING_DATA_LINES, + COMPLIANCE_WARNING_ENUMERATION_FAIL, + COMPLIANCE_WARNING_FLAKY_CONNECTION, + COMPLIANCE_WARNING_UNRELIABLE_IO, }) @Retention(RetentionPolicy.SOURCE) @interface ComplianceWarning{} @@ -591,7 +646,12 @@ public final class UsbPortStatus implements Parcelable { * @return array including {@link #COMPLIANCE_WARNING_OTHER}, * {@link #COMPLIANCE_WARNING_DEBUG_ACCESSORY}, * {@link #COMPLIANCE_WARNING_BC_1_2}, - * or {@link #COMPLIANCE_WARNING_MISSING_RP} + * {@link #COMPLIANCE_WARNING_MISSING_RP}, + * {@link #COMPLIANCE_WARNING_INPUT_POWER_LIMITED}, + * {@link #COMPLIANCE_WARNING_MISSING_DATA_LINES}, + * {@link #COMPLIANCE_WARNING_ENUMERATION_FAIL}, + * {@link #COMPLIANCE_WARNING_FLAKY_CONNECTION}, + * {@link #COMPLIANCE_WARNING_UNRELIABLE_IO}. */ @CheckResult @NonNull diff --git a/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig b/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig new file mode 100644 index 000000000000..6b78d05c848d --- /dev/null +++ b/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig @@ -0,0 +1,8 @@ +package: "android.hardware.usb.flags" + +flag { + name: "enable_usb_data_compliance_warning" + namespace: "system_sw_usb" + description: "Enable USB data compliance warnings when set" + bug: "296119135" +} diff --git a/core/java/android/window/flags/responsible_apis.aconfig b/core/java/android/window/flags/responsible_apis.aconfig index 4bfb17700a76..94e6009f4cd6 100644 --- a/core/java/android/window/flags/responsible_apis.aconfig +++ b/core/java/android/window/flags/responsible_apis.aconfig @@ -19,4 +19,11 @@ flag { namespace: "responsible_apis" description: "Enable toasts to indicate (potential) BAL blocking." bug: "308059069" +} + +flag { + name: "bal_show_toasts_blocked" + namespace: "responsible_apis" + description: "Enable toasts to indicate actual BAL blocking." + bug: "308059069" }
\ No newline at end of file diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java index cdaab466bc1a..d72544f5b8f3 100644 --- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java +++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java @@ -30,6 +30,7 @@ import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_ALLOW; import static com.android.server.wm.ActivityTaskManagerService.APP_SWITCH_FG_ONLY; import static com.android.server.wm.ActivityTaskSupervisor.getApplicationLabel; import static com.android.window.flags.Flags.balShowToasts; +import static com.android.window.flags.Flags.balShowToastsBlocked; import static com.android.server.wm.PendingRemoteAnimationRegistry.TIMEOUT_MS; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -321,6 +322,7 @@ public class BackgroundActivityStartController { .append(getDebugPackageName(mCallingPackage, mCallingUid)); sb.append("; callingUid: ").append(mCallingUid); sb.append("; callingPid: ").append(mCallingPid); + sb.append("; isPendingIntent: ").append(isPendingIntent()); sb.append("; appSwitchState: ").append(mAppSwitchState); sb.append("; callingUidHasAnyVisibleWindow: ").append(mCallingUidHasAnyVisibleWindow); sb.append("; callingUidProcState: ").append(DebugUtils.valueToString( @@ -328,7 +330,7 @@ public class BackgroundActivityStartController { sb.append("; isCallingUidPersistentSystemProcess: ") .append(mIsCallingUidPersistentSystemProcess); sb.append("; balAllowedByPiCreator: ").append(mBalAllowedByPiCreator); - if (!isPendingIntent()) { + if (isPendingIntent()) { sb.append("; balAllowedByPiSender: ").append(mBalAllowedByPiSender); sb.append("; realCallingPackage: ") .append(getDebugPackageName(mRealCallingPackage, mRealCallingUid)); @@ -340,16 +342,18 @@ public class BackgroundActivityStartController { ActivityManager.class, "PROCESS_STATE_", mRealCallingUidProcState)); sb.append("; isRealCallingUidPersistentSystemProcess: ") .append(mIsRealCallingUidPersistentSystemProcess); + sb.append("; originatingPendingIntent: ").append(mOriginatingPendingIntent); } - sb.append("; originatingPendingIntent: ").append(mOriginatingPendingIntent); sb.append("; backgroundStartPrivileges: ").append(mBackgroundStartPrivileges); sb.append("; intent: ").append(mIntent); sb.append("; callerApp: ").append(mCallerApp); - sb.append("; realCallerApp: ").append(mRealCallerApp); + if (isPendingIntent()) { + sb.append("; realCallerApp: ").append(mRealCallerApp); + } if (mCallerApp != null) { sb.append("; inVisibleTask: ").append(mCallerApp.hasActivityInVisibleTask()); } - if (!isPendingIntent()) { + if (isPendingIntent()) { if (mRealCallerApp != null) { sb.append("; realInVisibleTask: ") .append(mRealCallerApp.hasActivityInVisibleTask()); @@ -469,7 +473,7 @@ public class BackgroundActivityStartController { // anything that has fallen through would currently be aborted Slog.w(TAG, "Background activity launch blocked! " + state.dump(resultForCaller)); - showBalToast("BAL blocked", state); + showBalBlockedToast("BAL blocked", state); return statsLog(BalVerdict.BLOCK, state); } @@ -512,7 +516,7 @@ public class BackgroundActivityStartController { "With Android 15 BAL hardening this activity start would be blocked" + " (missing opt in by PI creator)! " + state.dump(resultForCaller, resultForRealCaller)); - showBalToast("BAL would be blocked", state); + showBalRiskToast("BAL would be blocked", state); // return the realCaller result for backwards compatibility return statsLog(resultForRealCaller, state); } @@ -524,7 +528,7 @@ public class BackgroundActivityStartController { "With Android 15 BAL hardening this activity start would be blocked" + " (missing opt in by PI creator)! " + state.dump(resultForCaller, resultForRealCaller)); - showBalToast("BAL would be blocked", state); + showBalRiskToast("BAL would be blocked", state); return statsLog(resultForCaller, state); } if (resultForRealCaller.allows() @@ -536,7 +540,7 @@ public class BackgroundActivityStartController { "With Android 14 BAL hardening this activity start would be blocked" + " (missing opt in by PI sender)! " + state.dump(resultForCaller, resultForRealCaller)); - showBalToast("BAL would be blocked", state); + showBalBlockedToast("BAL would be blocked", state); return statsLog(resultForRealCaller, state); } Slog.wtf(TAG, "Without Android 14 BAL hardening this activity start would be allowed" @@ -547,7 +551,7 @@ public class BackgroundActivityStartController { // anything that has fallen through would currently be aborted Slog.w(TAG, "Background activity launch blocked! " + state.dump(resultForCaller, resultForRealCaller)); - showBalToast("BAL blocked", state); + showBalBlockedToast("BAL blocked", state); return statsLog(BalVerdict.BLOCK, state); } @@ -922,7 +926,15 @@ public class BackgroundActivityStartController { return true; } - private void showBalToast(String toastText, BalState state) { + private void showBalBlockedToast(String toastText, BalState state) { + if (balShowToastsBlocked()) { + showToast(toastText + + " caller:" + state.mCallingPackage + + " realCaller:" + state.mRealCallingPackage); + } + } + + private void showBalRiskToast(String toastText, BalState state) { if (balShowToasts()) { showToast(toastText + " caller:" + state.mCallingPackage diff --git a/services/usb/Android.bp b/services/usb/Android.bp index 9f3b52eddd67..1dc5dcf320e0 100644 --- a/services/usb/Android.bp +++ b/services/usb/Android.bp @@ -33,6 +33,6 @@ java_library_static { "android.hardware.usb-V1.1-java", "android.hardware.usb-V1.2-java", "android.hardware.usb-V1.3-java", - "android.hardware.usb-V2-java", + "android.hardware.usb-V3-java", ], } diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java index 35e2fcfecb6b..fb13b33a30ce 100644 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -1285,12 +1285,17 @@ public class UsbService extends IUsbManager.Stub { pw.println(" dumpsys usb add-port \"matrix\" dual --compliance-warnings"); pw.println(" dumpsys usb set-compliance-reasons \"matrix\" <reason-list>"); pw.println(" dumpsys usb clear-compliance-reasons \"matrix\""); - pw.println("<reason-list> is expected to be formatted as \"1, ..., 4\""); + pw.println("<reason-list> is expected to be formatted as \"1, ..., N\""); pw.println("with reasons that need to be simulated."); pw.println(" 1: other"); pw.println(" 2: debug accessory"); pw.println(" 3: bc12"); pw.println(" 4: missing rp"); + pw.println(" 5: input power limited"); + pw.println(" 6: missing data lines"); + pw.println(" 7: enumeration fail"); + pw.println(" 8: flaky connection"); + pw.println(" 9: unreliable io"); pw.println(); pw.println("Example simulate DisplayPort Alt Mode Changes:"); pw.println(" dumpsys usb add-port \"matrix\" dual --displayport"); diff --git a/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java b/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java index c7a7a9bbe59e..45b623bc4c93 100644 --- a/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java +++ b/services/usb/java/com/android/server/usb/hal/port/UsbPortAidl.java @@ -39,6 +39,7 @@ import android.hardware.usb.DisplayPortAltModeInfo; import android.hardware.usb.AltModeData; import android.hardware.usb.AltModeData.DisplayPortAltModeData; import android.hardware.usb.DisplayPortAltModePinAssignment; +import android.hardware.usb.flags.Flags; import android.os.Build; import android.os.ServiceManager; import android.os.IBinder; @@ -593,11 +594,21 @@ public final class UsbPortAidl implements UsbPortHal { for (int warning : complianceWarnings) { if (newComplianceWarnings.indexOf(warning) == -1 && warning >= UsbPortStatus.COMPLIANCE_WARNING_OTHER) { - // ComplianceWarnings range from [1, 4] in Android U - if (warning > UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP) { - newComplianceWarnings.add(UsbPortStatus.COMPLIANCE_WARNING_OTHER); + if (Flags.enableUsbDataComplianceWarning()) { + // ComplianceWarnings range extends to [1, 9] when feature flag is on + if (warning + > UsbPortStatus.COMPLIANCE_WARNING_UNRELIABLE_IO) { + newComplianceWarnings.add(UsbPortStatus.COMPLIANCE_WARNING_OTHER); + } else { + newComplianceWarnings.add(warning); + } } else { - newComplianceWarnings.add(warning); + // ComplianceWarnings range from [1, 4] in Android U + if (warning > UsbPortStatus.COMPLIANCE_WARNING_MISSING_RP) { + newComplianceWarnings.add(UsbPortStatus.COMPLIANCE_WARNING_OTHER); + } else { + newComplianceWarnings.add(warning); + } } } } |