Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f66934ad authored by John Wu's avatar John Wu
Browse files

[HostStubGen] Introduce new feature: method redirection

The existing implementation supports "NativeSubstitution" on classes
with native methods, so that all native methods of that class are
redirected to the "native substitution" class.

Instead of restricting method redirection to native methods (which is
commonly abused to support additional Ravenwood specific methods in
classes), let's properly introduce a mechanism to specify a generic
method redirection.

To reduce code debt, we also migrate all usages of native substitution
to the newly introduced mechanism, and completely remove native
substitution related implementation in HostStubGen.

Bug: 292141694
Flag: EXEMPT host test change only
Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh
Change-Id: Ic8193f97e59d866957e50202dff101e543430f73
parent 52db2456
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -26,6 +26,10 @@ import android.database.sqlite.SQLiteClosable;
import android.database.sqlite.SQLiteException;
import android.os.Parcel;
import android.os.Parcelable;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodRedirect;
import android.ravenwood.annotation.RavenwoodRedirectionClass;
import android.ravenwood.annotation.RavenwoodThrow;

import dalvik.annotation.optimization.FastNative;
import dalvik.system.CloseGuard;
@@ -40,8 +44,8 @@ import dalvik.system.CloseGuard;
 * consumer for reading.
 * </p>
 */
@android.ravenwood.annotation.RavenwoodKeepWholeClass
@android.ravenwood.annotation.RavenwoodNativeSubstitutionClass(
@RavenwoodKeepWholeClass
@RavenwoodRedirectionClass(
        "com.android.platform.test.ravenwood.nativesubstitution.CursorWindow_host")
public class CursorWindow extends SQLiteClosable implements Parcelable {
    private static final String STATS_TAG = "CursorWindowStats";
@@ -63,48 +67,69 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
    private final CloseGuard mCloseGuard;

    // May throw CursorWindowAllocationException
    @RavenwoodRedirect
    private static native long nativeCreate(String name, int cursorWindowSize);

    // May throw CursorWindowAllocationException
    @RavenwoodRedirect
    private static native long nativeCreateFromParcel(Parcel parcel);
    @RavenwoodRedirect
    private static native void nativeDispose(long windowPtr);
    @RavenwoodRedirect
    private static native void nativeWriteToParcel(long windowPtr, Parcel parcel);

    @RavenwoodRedirect
    private static native String nativeGetName(long windowPtr);
    @RavenwoodRedirect
    private static native byte[] nativeGetBlob(long windowPtr, int row, int column);
    @RavenwoodRedirect
    private static native String nativeGetString(long windowPtr, int row, int column);
    @RavenwoodThrow
    private static native void nativeCopyStringToBuffer(long windowPtr, int row, int column,
            CharArrayBuffer buffer);
    @RavenwoodRedirect
    private static native boolean nativePutBlob(long windowPtr, byte[] value, int row, int column);
    @RavenwoodRedirect
    private static native boolean nativePutString(long windowPtr, String value,
            int row, int column);

    // Below native methods don't do unconstrained work, so are FastNative for performance

    @FastNative
    @RavenwoodThrow
    private static native void nativeClear(long windowPtr);

    @FastNative
    @RavenwoodRedirect
    private static native int nativeGetNumRows(long windowPtr);
    @FastNative
    @RavenwoodRedirect
    private static native boolean nativeSetNumColumns(long windowPtr, int columnNum);
    @FastNative
    @RavenwoodRedirect
    private static native boolean nativeAllocRow(long windowPtr);
    @FastNative
    @RavenwoodThrow
    private static native void nativeFreeLastRow(long windowPtr);

    @FastNative
    @RavenwoodRedirect
    private static native int nativeGetType(long windowPtr, int row, int column);
    @FastNative
    @RavenwoodRedirect
    private static native long nativeGetLong(long windowPtr, int row, int column);
    @FastNative
    @RavenwoodRedirect
    private static native double nativeGetDouble(long windowPtr, int row, int column);

    @FastNative
    @RavenwoodRedirect
    private static native boolean nativePutLong(long windowPtr, long value, int row, int column);
    @FastNative
    @RavenwoodRedirect
    private static native boolean nativePutDouble(long windowPtr, double value, int row, int column);
    @FastNative
    @RavenwoodThrow
    private static native boolean nativePutNull(long windowPtr, int row, int column);


+11 −5
Original line number Diff line number Diff line
@@ -19,9 +19,9 @@ package android.os;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.os.Handler;
import android.os.Looper;
import android.os.Trace;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodRedirect;
import android.ravenwood.annotation.RavenwoodRedirectionClass;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
@@ -51,8 +51,8 @@ import java.util.concurrent.locks.ReentrantLock;
 * <p>You can retrieve the MessageQueue for the current thread with
 * {@link Looper#myQueue() Looper.myQueue()}.
 */
@android.ravenwood.annotation.RavenwoodKeepWholeClass
@android.ravenwood.annotation.RavenwoodNativeSubstitutionClass(
@RavenwoodKeepWholeClass
@RavenwoodRedirectionClass(
        "com.android.platform.test.ravenwood.nativesubstitution.MessageQueue_host")
public final class MessageQueue {
    private static final String TAG = "ConcurrentMessageQueue";
@@ -345,11 +345,17 @@ public final class MessageQueue {
    // Barriers are indicated by messages with a null target whose arg1 field carries the token.
    private final AtomicInteger mNextBarrierToken = new AtomicInteger(1);

    @RavenwoodRedirect
    private static native long nativeInit();
    @RavenwoodRedirect
    private static native void nativeDestroy(long ptr);
    @RavenwoodRedirect
    private native void nativePollOnce(long ptr, int timeoutMillis); /*non-static for callbacks*/
    @RavenwoodRedirect
    private static native void nativeWake(long ptr);
    @RavenwoodRedirect
    private static native boolean nativeIsPolling(long ptr);
    @RavenwoodRedirect
    private static native void nativeSetFileDescriptorEvents(long ptr, int fd, int events);

    MessageQueue(boolean quitAllowed) {
+11 −5
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Handler;
import android.os.Process;
import android.os.Trace;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodRedirect;
import android.ravenwood.annotation.RavenwoodRedirectionClass;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
@@ -42,8 +42,8 @@ import java.util.concurrent.atomic.AtomicLong;
 * <p>You can retrieve the MessageQueue for the current thread with
 * {@link Looper#myQueue() Looper.myQueue()}.
 */
@android.ravenwood.annotation.RavenwoodKeepWholeClass
@android.ravenwood.annotation.RavenwoodNativeSubstitutionClass(
@RavenwoodKeepWholeClass
@RavenwoodRedirectionClass(
        "com.android.platform.test.ravenwood.nativesubstitution.MessageQueue_host")
public final class MessageQueue {
    private static final String TAG = "MessageQueue";
@@ -79,12 +79,18 @@ public final class MessageQueue {
    @UnsupportedAppUsage
    private int mNextBarrierToken;

    @RavenwoodRedirect
    private native static long nativeInit();
    @RavenwoodRedirect
    private native static void nativeDestroy(long ptr);
    @UnsupportedAppUsage
    @RavenwoodRedirect
    private native void nativePollOnce(long ptr, int timeoutMillis); /*non-static for callbacks*/
    @RavenwoodRedirect
    private native static void nativeWake(long ptr);
    @RavenwoodRedirect
    private native static boolean nativeIsPolling(long ptr);
    @RavenwoodRedirect
    private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);

    MessageQueue(boolean quitAllowed) {
+11 −4
Original line number Diff line number Diff line
@@ -20,8 +20,9 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Handler;
import android.os.Trace;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodRedirect;
import android.ravenwood.annotation.RavenwoodRedirectionClass;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
@@ -44,8 +45,8 @@ import java.util.concurrent.atomic.AtomicLong;
 * <p>You can retrieve the MessageQueue for the current thread with
 * {@link Looper#myQueue() Looper.myQueue()}.
 */
@android.ravenwood.annotation.RavenwoodKeepWholeClass
@android.ravenwood.annotation.RavenwoodNativeSubstitutionClass(
@RavenwoodKeepWholeClass
@RavenwoodRedirectionClass(
        "com.android.platform.test.ravenwood.nativesubstitution.MessageQueue_host")
public final class MessageQueue {
    private static final String TAG = "LockedMessageQueue";
@@ -389,12 +390,18 @@ public final class MessageQueue {
    @UnsupportedAppUsage
    private int mNextBarrierToken;

    @RavenwoodRedirect
    private native static long nativeInit();
    @RavenwoodRedirect
    private native static void nativeDestroy(long ptr);
    @UnsupportedAppUsage
    @RavenwoodRedirect
    private native void nativePollOnce(long ptr, int timeoutMillis); /*non-static for callbacks*/
    @RavenwoodRedirect
    private native static void nativeWake(long ptr);
    @RavenwoodRedirect
    private native static boolean nativeIsPolling(long ptr);
    @RavenwoodRedirect
    private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);

    MessageQueue(boolean quitAllowed) {
+44 −2
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ import android.annotation.TestApi;
import android.app.AppOpsManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodNativeSubstitutionClass;
import android.ravenwood.annotation.RavenwoodRedirect;
import android.ravenwood.annotation.RavenwoodRedirectionClass;
import android.ravenwood.annotation.RavenwoodReplace;
import android.ravenwood.annotation.RavenwoodThrow;
import android.text.TextUtils;
@@ -233,7 +234,7 @@ import java.util.function.IntFunction;
 * {@link #readSparseArray(ClassLoader, Class)}.
 */
@RavenwoodKeepWholeClass
@RavenwoodNativeSubstitutionClass(
@RavenwoodRedirectionClass(
        "com.android.platform.test.ravenwood.nativesubstitution.Parcel_host")
public final class Parcel {

@@ -387,6 +388,7 @@ public final class Parcel {
    private static final int SIZE_COMPLEX_TYPE = 1;

    @CriticalNative
    @RavenwoodRedirect
    private static native void nativeMarkSensitive(long nativePtr);
    @FastNative
    @RavenwoodThrow
@@ -395,86 +397,126 @@ public final class Parcel {
    @RavenwoodThrow
    private static native boolean nativeIsForRpc(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeDataSize(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeDataAvail(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeDataPosition(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeDataCapacity(long nativePtr);
    @FastNative
    @RavenwoodRedirect
    private static native void nativeSetDataSize(long nativePtr, int size);
    @CriticalNative
    @RavenwoodRedirect
    private static native void nativeSetDataPosition(long nativePtr, int pos);
    @FastNative
    @RavenwoodRedirect
    private static native void nativeSetDataCapacity(long nativePtr, int size);

    @CriticalNative
    @RavenwoodRedirect
    private static native boolean nativePushAllowFds(long nativePtr, boolean allowFds);
    @CriticalNative
    @RavenwoodRedirect
    private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue);

    @RavenwoodRedirect
    private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len);
    @RavenwoodRedirect
    private static native void nativeWriteBlob(long nativePtr, byte[] b, int offset, int len);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeWriteInt(long nativePtr, int val);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeWriteLong(long nativePtr, long val);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeWriteFloat(long nativePtr, float val);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeWriteDouble(long nativePtr, double val);
    @RavenwoodThrow
    private static native void nativeSignalExceptionForError(int error);
    @FastNative
    @RavenwoodRedirect
    private static native void nativeWriteString8(long nativePtr, String val);
    @FastNative
    @RavenwoodRedirect
    private static native void nativeWriteString16(long nativePtr, String val);
    @FastNative
    @RavenwoodThrow
    private static native void nativeWriteStrongBinder(long nativePtr, IBinder val);
    @FastNative
    @RavenwoodRedirect
    private static native void nativeWriteFileDescriptor(long nativePtr, FileDescriptor val);

    @RavenwoodRedirect
    private static native byte[] nativeCreateByteArray(long nativePtr);
    @RavenwoodRedirect
    private static native boolean nativeReadByteArray(long nativePtr, byte[] dest, int destLen);
    @RavenwoodRedirect
    private static native byte[] nativeReadBlob(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native int nativeReadInt(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native long nativeReadLong(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native float nativeReadFloat(long nativePtr);
    @CriticalNative
    @RavenwoodRedirect
    private static native double nativeReadDouble(long nativePtr);
    @FastNative
    @RavenwoodRedirect
    private static native String nativeReadString8(long nativePtr);
    @FastNative
    @RavenwoodRedirect
    private static native String nativeReadString16(long nativePtr);
    @FastNative
    @RavenwoodThrow
    private static native IBinder nativeReadStrongBinder(long nativePtr);
    @FastNative
    @RavenwoodRedirect
    private static native FileDescriptor nativeReadFileDescriptor(long nativePtr);

    @RavenwoodRedirect
    private static native long nativeCreate();
    @RavenwoodRedirect
    private static native void nativeFreeBuffer(long nativePtr);
    @RavenwoodRedirect
    private static native void nativeDestroy(long nativePtr);

    @RavenwoodRedirect
    private static native byte[] nativeMarshall(long nativePtr);
    @RavenwoodRedirect
    private static native void nativeUnmarshall(
            long nativePtr, byte[] data, int offset, int length);
    @RavenwoodRedirect
    private static native int nativeCompareData(long thisNativePtr, long otherNativePtr);
    @RavenwoodRedirect
    private static native boolean nativeCompareDataInRange(
            long ptrA, int offsetA, long ptrB, int offsetB, int length);
    @RavenwoodRedirect
    private static native void nativeAppendFrom(
            long thisNativePtr, long otherNativePtr, int offset, int length);
    @CriticalNative
    @RavenwoodRedirect
    private static native boolean nativeHasFileDescriptors(long nativePtr);
    @RavenwoodRedirect
    private static native boolean nativeHasFileDescriptorsInRange(
            long nativePtr, int offset, int length);

    @RavenwoodRedirect
    private static native boolean nativeHasBinders(long nativePtr);
    @RavenwoodRedirect
    private static native boolean nativeHasBindersInRange(
            long nativePtr, int offset, int length);
    @RavenwoodThrow
Loading