diff --git a/core/api/current.txt b/core/api/current.txt index 5f31e0be99654..8bf9edc3f8fe2 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -31865,6 +31865,7 @@ package android.os { method public void close(); method @NonNull public static android.os.SharedMemory create(@Nullable String, int) throws android.system.ErrnoException; method public int describeContents(); + method @NonNull public static android.os.SharedMemory fromFileDescriptor(@NonNull android.os.ParcelFileDescriptor); method public int getSize(); method @NonNull public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException; method @NonNull public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException; diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index ef9df6609bb93..aa0f61e3e3dc4 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -274,10 +274,6 @@ package android.os { field public static final int VPN_UID = 1016; // 0x3f8 } - public final class SharedMemory implements java.io.Closeable android.os.Parcelable { - method @NonNull public static android.os.SharedMemory create(@NonNull android.os.ParcelFileDescriptor); - } - public class StatsServiceManager { method @NonNull public android.os.StatsServiceManager.ServiceRegisterer getStatsCompanionServiceRegisterer(); method @NonNull public android.os.StatsServiceManager.ServiceRegisterer getStatsManagerServiceRegisterer(); diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java index f9b16951f0db9..46eb2ece435cb 100644 --- a/core/java/android/os/SharedMemory.java +++ b/core/java/android/os/SharedMemory.java @@ -18,7 +18,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.system.ErrnoException; import android.system.Os; @@ -95,15 +94,23 @@ public final class SharedMemory implements Parcelable, Closeable { } /** - * Creates from existing shared memory passed as {@link ParcelFileDesciptor}. + * Creates an instance from existing shared memory passed as {@link ParcelFileDescriptor}. * - * @param fd File descriptor of shared memory passed as {@link #ParcelFileDescriptor}. + *

The {@code fd} should be a shared memory created from + {@code SharedMemory or ASharedMemory}. This can be useful when shared memory is passed as + file descriptor through JNI or binder service implemented in cpp. + *

Note that newly created {@code SharedMemory} takes ownership of passed {@code fd} and + * the original {@code fd} becomes detached (Check {@link ParcelFileDescriptor#detachFd()}). + * If the caller wants to use the file descriptor after the call, the caller should duplicate + * the file descriptor (Check {@link ParcelFileDescriptor#dup()}) and pass the duped version + * instead. * - * @hide + * @param fd File descriptor of shared memory passed as {@link ParcelFileDescriptor}. */ - @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) - public static @NonNull SharedMemory create(@NonNull ParcelFileDescriptor fd) { - return new SharedMemory(fd.getFileDescriptor()); + public static @NonNull SharedMemory fromFileDescriptor(@NonNull ParcelFileDescriptor fd) { + FileDescriptor f = new FileDescriptor(); + f.setInt$(fd.detachFd()); + return new SharedMemory(f); } private static final int PROT_MASK = OsConstants.PROT_READ | OsConstants.PROT_WRITE