Loading core/api/current.txt +8 −0 Original line number Diff line number Diff line Loading @@ -33184,6 +33184,7 @@ package android.os { } public interface IBinder { method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default void addFrozenStateChangeCallback(@NonNull android.os.IBinder.FrozenStateChangeCallback) throws android.os.RemoteException; method public void dump(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException; method public void dumpAsync(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException; method @Nullable public String getInterfaceDescriptor() throws android.os.RemoteException; Loading @@ -33192,6 +33193,7 @@ package android.os { method public void linkToDeath(@NonNull android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException; method public boolean pingBinder(); method @Nullable public android.os.IInterface queryLocalInterface(@NonNull String); method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default boolean removeFrozenStateChangeCallback(@NonNull android.os.IBinder.FrozenStateChangeCallback); method public boolean transact(int, @NonNull android.os.Parcel, @Nullable android.os.Parcel, int) throws android.os.RemoteException; method public boolean unlinkToDeath(@NonNull android.os.IBinder.DeathRecipient, int); field public static final int DUMP_TRANSACTION = 1598311760; // 0x5f444d50 Loading @@ -33209,6 +33211,12 @@ package android.os { method public default void binderDied(@NonNull android.os.IBinder); } @FlaggedApi("android.os.binder_frozen_state_change_callback") public static interface IBinder.FrozenStateChangeCallback { method public void onFrozenStateChanged(@NonNull android.os.IBinder, int); field public static final int STATE_FROZEN = 0; // 0x0 field public static final int STATE_UNFROZEN = 1; // 0x1 } public interface IInterface { method public android.os.IBinder asBinder(); } core/java/android/os/BinderProxy.java +8 −9 Original line number Diff line number Diff line Loading @@ -650,13 +650,13 @@ public final class BinderProxy implements IBinder { * weakly referenced by JNI so the strong references here are needed to keep the callbacks * around until the proxy is GC'ed. */ private List<IFrozenStateChangeCallback> mFrozenStateChangeCallbacks = private List<FrozenStateChangeCallback> mFrozenStateChangeCallbacks = Collections.synchronizedList(new ArrayList<>()); /** * See {@link IBinder#addFrozenStateChangeCallback(IFrozenStateChangeCallback)} * See {@link IBinder#addFrozenStateChangeCallback(FrozenStateChangeCallback)} */ public void addFrozenStateChangeCallback(IFrozenStateChangeCallback callback) public void addFrozenStateChangeCallback(FrozenStateChangeCallback callback) throws RemoteException { addFrozenStateChangeCallbackNative(callback); mFrozenStateChangeCallbacks.add(callback); Loading @@ -665,16 +665,16 @@ public final class BinderProxy implements IBinder { /** * See {@link IBinder#removeFrozenStateChangeCallback} */ public boolean removeFrozenStateChangeCallback(IFrozenStateChangeCallback callback) { public boolean removeFrozenStateChangeCallback(FrozenStateChangeCallback callback) { mFrozenStateChangeCallbacks.remove(callback); return removeFrozenStateChangeCallbackNative(callback); } private native void addFrozenStateChangeCallbackNative(IFrozenStateChangeCallback callback) private native void addFrozenStateChangeCallbackNative(FrozenStateChangeCallback callback) throws RemoteException; private native boolean removeFrozenStateChangeCallbackNative( IFrozenStateChangeCallback callback); FrozenStateChangeCallback callback); /** * Perform a dump on the remote object Loading Loading @@ -762,10 +762,9 @@ public final class BinderProxy implements IBinder { } private static void invokeFrozenStateChangeCallback( IFrozenStateChangeCallback callback, IBinder binderProxy, int stateIndex) { FrozenStateChangeCallback callback, IBinder binderProxy, int stateIndex) { try { callback.onFrozenStateChanged(binderProxy, IFrozenStateChangeCallback.State.values()[stateIndex]); callback.onFrozenStateChanged(binderProxy, stateIndex); } catch (RuntimeException exc) { Log.w("BinderNative", "Uncaught exception from frozen state change callback", exc); Loading core/java/android/os/IBinder.java +31 −12 Original line number Diff line number Diff line Loading @@ -16,11 +16,15 @@ package android.os; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import java.io.FileDescriptor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Base interface for a remotable object, the core part of a lightweight Loading Loading @@ -377,9 +381,24 @@ public interface IBinder { */ public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags); /** @hide */ interface IFrozenStateChangeCallback { enum State {FROZEN, UNFROZEN}; /** * A callback interface for receiving frozen state change events. */ @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK) interface FrozenStateChangeCallback { /** * @hide */ @IntDef(prefix = {"STATE_"}, value = { STATE_FROZEN, STATE_UNFROZEN, }) @Retention(RetentionPolicy.SOURCE) @interface State { } int STATE_FROZEN = 0; int STATE_UNFROZEN = 1; /** * Interface for receiving a callback when the process hosting an IBinder Loading @@ -387,13 +406,13 @@ public interface IBinder { * @param who The IBinder whose hosting process has changed state. * @param state The latest state. */ void onFrozenStateChanged(@NonNull IBinder who, State state); void onFrozenStateChanged(@NonNull IBinder who, @State int state); } /** * {@link addFrozenStateChangeCallback} provides a callback mechanism to notify about process * frozen/unfrozen events. Upon registration and any subsequent state changes, the callback is * invoked with the latest process frozen state. * This method provides a callback mechanism to notify about process frozen/unfrozen events. * Upon registration and any subsequent state changes, the callback is invoked with the latest * process frozen state. * * <p>If the listener process (the one using this API) is itself frozen, state change events * might be combined into a single one with the latest frozen state. This single event would Loading @@ -410,19 +429,19 @@ public interface IBinder { * * <p>@throws {@link UnsupportedOperationException} if the kernel binder driver does not support * this feature. * @hide */ default void addFrozenStateChangeCallback(@NonNull IFrozenStateChangeCallback callback) @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK) default void addFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) throws RemoteException { throw new UnsupportedOperationException(); } /** * Unregister a {@link IFrozenStateChangeCallback}. The callback will no longer be invoked when * Unregister a {@link FrozenStateChangeCallback}. The callback will no longer be invoked when * the hosting process changes its frozen state. * @hide */ default boolean removeFrozenStateChangeCallback(@NonNull IFrozenStateChangeCallback callback) { @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK) default boolean removeFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) { throw new UnsupportedOperationException(); } } core/java/android/os/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,14 @@ flag { bug: "317250784" } flag { name: "binder_frozen_state_change_callback" is_exported: true namespace: "system_performance" description: "Guards the frozen state change callback API." bug: "361157077" } flag { name: "message_queue_tail_tracking" namespace: "system_performance" Loading core/jni/android_util_Binder.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -1747,9 +1747,9 @@ static const JNINativeMethod gBinderProxyMethods[] = { {"linkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, {"unlinkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, {"addFrozenStateChangeCallbackNative", "(Landroid/os/IBinder$IFrozenStateChangeCallback;)V", (void*)android_os_BinderProxy_addFrozenStateChangeCallback}, "(Landroid/os/IBinder$FrozenStateChangeCallback;)V", (void*)android_os_BinderProxy_addFrozenStateChangeCallback}, {"removeFrozenStateChangeCallbackNative", "(Landroid/os/IBinder$IFrozenStateChangeCallback;)Z", (void*)android_os_BinderProxy_removeFrozenStateChangeCallback}, "(Landroid/os/IBinder$FrozenStateChangeCallback;)Z", (void*)android_os_BinderProxy_removeFrozenStateChangeCallback}, {"getNativeFinalizer", "()J", (void*)android_os_BinderProxy_getNativeFinalizer}, {"getExtension", "()Landroid/os/IBinder;", (void*)android_os_BinderProxy_getExtension}, }; Loading @@ -1774,7 +1774,7 @@ static int int_register_android_os_BinderProxy(JNIEnv* env) "(Landroid/os/IBinder$DeathRecipient;Landroid/os/IBinder;)V"); gBinderProxyOffsets.mInvokeFrozenStateChangeCallback = GetStaticMethodIDOrDie(env, clazz, "invokeFrozenStateChangeCallback", "(Landroid/os/IBinder$IFrozenStateChangeCallback;Landroid/os/" "(Landroid/os/IBinder$FrozenStateChangeCallback;Landroid/os/" "IBinder;I)V"); gBinderProxyOffsets.mNativeData = GetFieldIDOrDie(env, clazz, "mNativeData", "J"); Loading Loading
core/api/current.txt +8 −0 Original line number Diff line number Diff line Loading @@ -33184,6 +33184,7 @@ package android.os { } public interface IBinder { method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default void addFrozenStateChangeCallback(@NonNull android.os.IBinder.FrozenStateChangeCallback) throws android.os.RemoteException; method public void dump(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException; method public void dumpAsync(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException; method @Nullable public String getInterfaceDescriptor() throws android.os.RemoteException; Loading @@ -33192,6 +33193,7 @@ package android.os { method public void linkToDeath(@NonNull android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException; method public boolean pingBinder(); method @Nullable public android.os.IInterface queryLocalInterface(@NonNull String); method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default boolean removeFrozenStateChangeCallback(@NonNull android.os.IBinder.FrozenStateChangeCallback); method public boolean transact(int, @NonNull android.os.Parcel, @Nullable android.os.Parcel, int) throws android.os.RemoteException; method public boolean unlinkToDeath(@NonNull android.os.IBinder.DeathRecipient, int); field public static final int DUMP_TRANSACTION = 1598311760; // 0x5f444d50 Loading @@ -33209,6 +33211,12 @@ package android.os { method public default void binderDied(@NonNull android.os.IBinder); } @FlaggedApi("android.os.binder_frozen_state_change_callback") public static interface IBinder.FrozenStateChangeCallback { method public void onFrozenStateChanged(@NonNull android.os.IBinder, int); field public static final int STATE_FROZEN = 0; // 0x0 field public static final int STATE_UNFROZEN = 1; // 0x1 } public interface IInterface { method public android.os.IBinder asBinder(); }
core/java/android/os/BinderProxy.java +8 −9 Original line number Diff line number Diff line Loading @@ -650,13 +650,13 @@ public final class BinderProxy implements IBinder { * weakly referenced by JNI so the strong references here are needed to keep the callbacks * around until the proxy is GC'ed. */ private List<IFrozenStateChangeCallback> mFrozenStateChangeCallbacks = private List<FrozenStateChangeCallback> mFrozenStateChangeCallbacks = Collections.synchronizedList(new ArrayList<>()); /** * See {@link IBinder#addFrozenStateChangeCallback(IFrozenStateChangeCallback)} * See {@link IBinder#addFrozenStateChangeCallback(FrozenStateChangeCallback)} */ public void addFrozenStateChangeCallback(IFrozenStateChangeCallback callback) public void addFrozenStateChangeCallback(FrozenStateChangeCallback callback) throws RemoteException { addFrozenStateChangeCallbackNative(callback); mFrozenStateChangeCallbacks.add(callback); Loading @@ -665,16 +665,16 @@ public final class BinderProxy implements IBinder { /** * See {@link IBinder#removeFrozenStateChangeCallback} */ public boolean removeFrozenStateChangeCallback(IFrozenStateChangeCallback callback) { public boolean removeFrozenStateChangeCallback(FrozenStateChangeCallback callback) { mFrozenStateChangeCallbacks.remove(callback); return removeFrozenStateChangeCallbackNative(callback); } private native void addFrozenStateChangeCallbackNative(IFrozenStateChangeCallback callback) private native void addFrozenStateChangeCallbackNative(FrozenStateChangeCallback callback) throws RemoteException; private native boolean removeFrozenStateChangeCallbackNative( IFrozenStateChangeCallback callback); FrozenStateChangeCallback callback); /** * Perform a dump on the remote object Loading Loading @@ -762,10 +762,9 @@ public final class BinderProxy implements IBinder { } private static void invokeFrozenStateChangeCallback( IFrozenStateChangeCallback callback, IBinder binderProxy, int stateIndex) { FrozenStateChangeCallback callback, IBinder binderProxy, int stateIndex) { try { callback.onFrozenStateChanged(binderProxy, IFrozenStateChangeCallback.State.values()[stateIndex]); callback.onFrozenStateChanged(binderProxy, stateIndex); } catch (RuntimeException exc) { Log.w("BinderNative", "Uncaught exception from frozen state change callback", exc); Loading
core/java/android/os/IBinder.java +31 −12 Original line number Diff line number Diff line Loading @@ -16,11 +16,15 @@ package android.os; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import java.io.FileDescriptor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Base interface for a remotable object, the core part of a lightweight Loading Loading @@ -377,9 +381,24 @@ public interface IBinder { */ public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags); /** @hide */ interface IFrozenStateChangeCallback { enum State {FROZEN, UNFROZEN}; /** * A callback interface for receiving frozen state change events. */ @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK) interface FrozenStateChangeCallback { /** * @hide */ @IntDef(prefix = {"STATE_"}, value = { STATE_FROZEN, STATE_UNFROZEN, }) @Retention(RetentionPolicy.SOURCE) @interface State { } int STATE_FROZEN = 0; int STATE_UNFROZEN = 1; /** * Interface for receiving a callback when the process hosting an IBinder Loading @@ -387,13 +406,13 @@ public interface IBinder { * @param who The IBinder whose hosting process has changed state. * @param state The latest state. */ void onFrozenStateChanged(@NonNull IBinder who, State state); void onFrozenStateChanged(@NonNull IBinder who, @State int state); } /** * {@link addFrozenStateChangeCallback} provides a callback mechanism to notify about process * frozen/unfrozen events. Upon registration and any subsequent state changes, the callback is * invoked with the latest process frozen state. * This method provides a callback mechanism to notify about process frozen/unfrozen events. * Upon registration and any subsequent state changes, the callback is invoked with the latest * process frozen state. * * <p>If the listener process (the one using this API) is itself frozen, state change events * might be combined into a single one with the latest frozen state. This single event would Loading @@ -410,19 +429,19 @@ public interface IBinder { * * <p>@throws {@link UnsupportedOperationException} if the kernel binder driver does not support * this feature. * @hide */ default void addFrozenStateChangeCallback(@NonNull IFrozenStateChangeCallback callback) @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK) default void addFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) throws RemoteException { throw new UnsupportedOperationException(); } /** * Unregister a {@link IFrozenStateChangeCallback}. The callback will no longer be invoked when * Unregister a {@link FrozenStateChangeCallback}. The callback will no longer be invoked when * the hosting process changes its frozen state. * @hide */ default boolean removeFrozenStateChangeCallback(@NonNull IFrozenStateChangeCallback callback) { @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK) default boolean removeFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) { throw new UnsupportedOperationException(); } }
core/java/android/os/flags.aconfig +8 −0 Original line number Diff line number Diff line Loading @@ -168,6 +168,14 @@ flag { bug: "317250784" } flag { name: "binder_frozen_state_change_callback" is_exported: true namespace: "system_performance" description: "Guards the frozen state change callback API." bug: "361157077" } flag { name: "message_queue_tail_tracking" namespace: "system_performance" Loading
core/jni/android_util_Binder.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -1747,9 +1747,9 @@ static const JNINativeMethod gBinderProxyMethods[] = { {"linkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, {"unlinkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, {"addFrozenStateChangeCallbackNative", "(Landroid/os/IBinder$IFrozenStateChangeCallback;)V", (void*)android_os_BinderProxy_addFrozenStateChangeCallback}, "(Landroid/os/IBinder$FrozenStateChangeCallback;)V", (void*)android_os_BinderProxy_addFrozenStateChangeCallback}, {"removeFrozenStateChangeCallbackNative", "(Landroid/os/IBinder$IFrozenStateChangeCallback;)Z", (void*)android_os_BinderProxy_removeFrozenStateChangeCallback}, "(Landroid/os/IBinder$FrozenStateChangeCallback;)Z", (void*)android_os_BinderProxy_removeFrozenStateChangeCallback}, {"getNativeFinalizer", "()J", (void*)android_os_BinderProxy_getNativeFinalizer}, {"getExtension", "()Landroid/os/IBinder;", (void*)android_os_BinderProxy_getExtension}, }; Loading @@ -1774,7 +1774,7 @@ static int int_register_android_os_BinderProxy(JNIEnv* env) "(Landroid/os/IBinder$DeathRecipient;Landroid/os/IBinder;)V"); gBinderProxyOffsets.mInvokeFrozenStateChangeCallback = GetStaticMethodIDOrDie(env, clazz, "invokeFrozenStateChangeCallback", "(Landroid/os/IBinder$IFrozenStateChangeCallback;Landroid/os/" "(Landroid/os/IBinder$FrozenStateChangeCallback;Landroid/os/" "IBinder;I)V"); gBinderProxyOffsets.mNativeData = GetFieldIDOrDie(env, clazz, "mNativeData", "J"); Loading