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

Commit a28a59ed authored by Yan Yan's avatar Yan Yan
Browse files

Allow SystemServer to create VCN service with a service initializer

We need to use "startService" to load the service via reflection
because the followup CLs will use a build system flag to control
whether the service is in Tethering module or the platform. Using
reflection ensures that in both case the system can build

Bug: 366598445
Test: atest FrameworksVcnTests && atest CtsVcnTestCases
Flag: EXEMPT no functional change
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d6ecfc7de6ca836fa2eb92e05e5abbd3c7095cd7)

Change-Id: I165e83135c557619518257eb79a00b9ce5802c76
Merged-In: I165e83135c557619518257eb79a00b9ce5802c76
parent 60df934b
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -77,6 +77,7 @@ java_library {
        "framework-connectivity-t-pre-jarjar",
        "framework-connectivity-t-pre-jarjar",
        "framework-connectivity-b-pre-jarjar",
        "framework-connectivity-b-pre-jarjar",
        "framework-wifi.stubs.module_lib",
        "framework-wifi.stubs.module_lib",
        "keepanno-annotations",
        "modules-utils-statemachine",
        "modules-utils-statemachine",
        "unsupportedappusage",
        "unsupportedappusage",
    ],
    ],
+60 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server;

import android.content.Context;
import android.util.Log;

import com.android.tools.r8.keepanno.annotations.KeepItemKind;
import com.android.tools.r8.keepanno.annotations.UsedByReflection;

/**
 * Service initializer for VCN. This is called by system server to create a new instance of
 * VcnManagementService.
 */
// This class is reflectively invoked from SystemServer and ConnectivityServiceInitializer.
// Without this annotation, this class will be treated as unused class and be removed during build
// time.
@UsedByReflection(kind = KeepItemKind.CLASS_AND_METHODS)
public final class ConnectivityServiceInitializerB extends SystemService {
    private static final String TAG = ConnectivityServiceInitializerB.class.getSimpleName();
    private final VcnManagementService mVcnManagementService;

    public ConnectivityServiceInitializerB(Context context) {
        super(context);
        mVcnManagementService = VcnManagementService.create(context);
    }

    @Override
    public void onStart() {
        if (mVcnManagementService != null) {
            Log.i(TAG, "Registering " + Context.VCN_MANAGEMENT_SERVICE);
            publishBinderService(
                    Context.VCN_MANAGEMENT_SERVICE,
                    mVcnManagementService,
                    /* allowIsolated= */ false);
        }
    }

    @Override
    public void onBootPhase(int phase) {
        if (mVcnManagementService != null && phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
            Log.i(TAG, "Starting " + Context.VCN_MANAGEMENT_SERVICE);
            mVcnManagementService.systemReady();
        }
    }
}
+0 −4
Original line number Original line Diff line number Diff line
@@ -254,10 +254,6 @@ java_library {
        "service-permission.stubs.system_server",
        "service-permission.stubs.system_server",
        "service-rkp.stubs.system_server",
        "service-rkp.stubs.system_server",
        "service-sdksandbox.stubs.system_server",
        "service-sdksandbox.stubs.system_server",

        // TODO: b/30242953 This is for accessing IVcnManagementService and
        // can be removed VCN is in mainline
        "framework-connectivity-b-pre-jarjar",
    ],
    ],


    vintf_fragment_modules: [
    vintf_fragment_modules: [
+6 −13
Original line number Original line Diff line number Diff line
@@ -411,6 +411,8 @@ public final class SystemServer implements Dumpable {
            "/apex/com.android.tethering/javalib/service-connectivity.jar";
            "/apex/com.android.tethering/javalib/service-connectivity.jar";
    private static final String CONNECTIVITY_SERVICE_INITIALIZER_CLASS =
    private static final String CONNECTIVITY_SERVICE_INITIALIZER_CLASS =
            "com.android.server.ConnectivityServiceInitializer";
            "com.android.server.ConnectivityServiceInitializer";
    private static final String CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS =
            "com.android.server.ConnectivityServiceInitializerB";
    private static final String NETWORK_STATS_SERVICE_INITIALIZER_CLASS =
    private static final String NETWORK_STATS_SERVICE_INITIALIZER_CLASS =
            "com.android.server.NetworkStatsServiceInitializer";
            "com.android.server.NetworkStatsServiceInitializer";
    private static final String UWB_APEX_SERVICE_JAR_PATH =
    private static final String UWB_APEX_SERVICE_JAR_PATH =
@@ -1447,7 +1449,6 @@ public final class SystemServer implements Dumpable {
        IStorageManager storageManager = null;
        IStorageManager storageManager = null;
        NetworkManagementService networkManagement = null;
        NetworkManagementService networkManagement = null;
        VpnManagerService vpnManager = null;
        VpnManagerService vpnManager = null;
        VcnManagementService vcnManagement = null;
        NetworkPolicyManagerService networkPolicy = null;
        NetworkPolicyManagerService networkPolicy = null;
        WindowManagerService wm = null;
        WindowManagerService wm = null;
        NetworkTimeUpdateService networkTimeUpdater = null;
        NetworkTimeUpdateService networkTimeUpdater = null;
@@ -2145,8 +2146,10 @@ public final class SystemServer implements Dumpable {


            t.traceBegin("StartVcnManagementService");
            t.traceBegin("StartVcnManagementService");
            try {
            try {
                vcnManagement = VcnManagementService.create(context);
                // TODO: b/375213246 When VCN is in mainline module, load it from the apex path.
                ServiceManager.addService(Context.VCN_MANAGEMENT_SERVICE, vcnManagement);
                // Whether VCN will be in apex or in the platform will be gated by a build system
                // flag.
                mSystemServiceManager.startService(CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS);
            } catch (Throwable e) {
            } catch (Throwable e) {
                reportWtf("starting VCN Management Service", e);
                reportWtf("starting VCN Management Service", e);
            }
            }
@@ -3038,7 +3041,6 @@ public final class SystemServer implements Dumpable {
        final MediaRouterService mediaRouterF = mediaRouter;
        final MediaRouterService mediaRouterF = mediaRouter;
        final MmsServiceBroker mmsServiceF = mmsService;
        final MmsServiceBroker mmsServiceF = mmsService;
        final VpnManagerService vpnManagerF = vpnManager;
        final VpnManagerService vpnManagerF = vpnManager;
        final VcnManagementService vcnManagementF = vcnManagement;
        final WindowManagerService windowManagerF = wm;
        final WindowManagerService windowManagerF = wm;
        final ConnectivityManager connectivityF = (ConnectivityManager)
        final ConnectivityManager connectivityF = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
@@ -3165,15 +3167,6 @@ public final class SystemServer implements Dumpable {
                reportWtf("making VpnManagerService ready", e);
                reportWtf("making VpnManagerService ready", e);
            }
            }
            t.traceEnd();
            t.traceEnd();
            t.traceBegin("MakeVcnManagementServiceReady");
            try {
                if (vcnManagementF != null) {
                    vcnManagementF.systemReady();
                }
            } catch (Throwable e) {
                reportWtf("making VcnManagementService ready", e);
            }
            t.traceEnd();
            t.traceBegin("MakeNetworkPolicyServiceReady");
            t.traceBegin("MakeNetworkPolicyServiceReady");
            try {
            try {
                if (networkPolicyF != null) {
                if (networkPolicyF != null) {