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

Commit d724d967 authored by Jared Duke's avatar Jared Duke
Browse files

Make Vpn JNI registration lazy

The associated VpnManagerService is optional. As such, make its JNI
registration lazy, supporting build-time removal.

Bug: 404563673
Test: m + boot test
Test: atest FrameworksVpnTests
Change-Id: Ia4bda3714fe294da88d2ba3b352798de4ad4f422
parent 20ddf54e
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -152,6 +152,7 @@ import com.android.net.module.util.NetworkStackConstants;
import com.android.server.DeviceIdleInternal;
import com.android.server.LocalServices;
import com.android.server.net.BaseNetworkObserver;
import com.android.server.utils.LazyJniRegistrar;

import libcore.io.IoUtils;

@@ -468,6 +469,8 @@ public class Vpn {

    @VisibleForTesting
    public static class Dependencies {
        protected Dependencies() {}

        public boolean isCallerSystem() {
            return Binder.getCallingUid() == Process.SYSTEM_UID;
        }
@@ -593,6 +596,14 @@ public class Vpn {
        }
    }

    // A helper class to ensure JNI registration before use. This avoids native lib dependencies in
    // test-only environments that mock or partially use the base Dependencies class.
    private static final class DependenciesWithJniRegistration extends Dependencies {
        static {
            LazyJniRegistrar.registerVpn();
        }
    }

    @VisibleForTesting
    interface ValidationStatusCallback {
        void onValidationStatus(int status);
@@ -600,8 +611,8 @@ public class Vpn {

    public Vpn(Looper looper, Context context, INetworkManagementService netService, INetd netd,
            @UserIdInt int userId, VpnProfileStore vpnProfileStore) {
        this(looper, context, new Dependencies(), netService, netd, userId, vpnProfileStore,
                new SystemServices(context), new Ikev2SessionCreator());
        this(looper, context, new DependenciesWithJniRegistration(), netService, netd, userId,
                vpnProfileStore, new SystemServices(context), new Ikev2SessionCreator());
    }

    @VisibleForTesting
+3 −0
Original line number Diff line number Diff line
@@ -47,4 +47,7 @@ public final class LazyJniRegistrar {

    /** Registers native methods for VrManagerService. */
    public static native void registerVrManagerService();

    /** Registers native methods for Vpn (the JNI counterpart for VpnManagerService). */
    public static native void registerVpn();
}
+1 −1
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ cc_library_static {
        "com_android_server_devicepolicy_CryptoTestHelper.cpp",
        "com_android_server_display_DisplayControl.cpp",
        "com_android_server_display_SmallAreaDetectionController.cpp",
        "com_android_server_connectivity_Vpn.cpp",
        "com_android_server_gpu_GpuService.cpp",
        "com_android_server_HardwarePropertiesManagerService.cpp",
        "com_android_server_input_InputManagerService.cpp",
@@ -261,6 +260,7 @@ filegroup {
    srcs: [
        "com_android_server_ConsumerIrService.cpp",
        "com_android_server_app_GameManagerService.cpp",
        "com_android_server_connectivity_Vpn.cpp",
        "com_android_server_utils_LazyJniRegistrar.cpp",
        "com_android_server_vr_VrManagerService.cpp",
    ],
+6 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ namespace android {
// Forward declared per-class registration methods.
int register_android_server_ConsumerIrService(JNIEnv* env);
int register_android_server_app_GameManagerService(JNIEnv* env);
int register_android_server_connectivity_Vpn(JNIEnv* env);
int register_android_server_vr_VrManagerService(JNIEnv* env);

namespace {
@@ -38,6 +39,10 @@ void registerGameManagerService(JNIEnv* env, jclass) {
    register_android_server_app_GameManagerService(env);
}

void registerVpn(JNIEnv* env, jclass) {
    register_android_server_connectivity_Vpn(env);
}

void registerVrManagerService(JNIEnv* env, jclass) {
    register_android_server_vr_VrManagerService(env);
}
@@ -45,6 +50,7 @@ void registerVrManagerService(JNIEnv* env, jclass) {
static const JNINativeMethod sJniRegistrarMethods[] = {
        {"registerConsumerIrService", "()V", (void*)registerConsumerIrService},
        {"registerGameManagerService", "()V", (void*)registerGameManagerService},
        {"registerVpn", "()V", (void*)registerVpn},
        {"registerVrManagerService", "()V", (void*)registerVrManagerService},
};

+0 −2
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ int register_android_server_UsbHostManager(JNIEnv* env);
int register_android_server_vibrator_VibratorController(JavaVM* vm, JNIEnv* env);
int register_android_server_vibrator_VibratorManagerService(JavaVM* vm, JNIEnv* env);
int register_android_server_location_GnssLocationProvider(JNIEnv* env);
int register_android_server_connectivity_Vpn(JNIEnv* env);
int register_android_server_devicepolicy_CryptoTestHelper(JNIEnv*);
int register_android_server_tv_TvUinputBridge(JNIEnv* env);
int register_android_server_tv_TvInputHal(JNIEnv* env);
@@ -106,7 +105,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
    register_android_server_vibrator_VibratorManagerService(vm, env);
    register_android_server_SystemServer(env);
    register_android_server_location_GnssLocationProvider(env);
    register_android_server_connectivity_Vpn(env);
    register_android_server_devicepolicy_CryptoTestHelper(env);
    register_android_server_BatteryStatsService(env);
    register_android_server_tv_TvUinputBridge(env);
Loading