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

Commit c2fab694 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by android-build-merger
Browse files

Merge "Add build target for NetworkStack on API 29"

am: 0a1bce4f

Change-Id: Icd75d91debda7e523c23d7351b74ab8322a2a572
parents 936d2f1e 0a1bce4f
Loading
Loading
Loading
Loading
+111 −41
Original line number Diff line number Diff line
@@ -14,6 +14,26 @@
// limitations under the License.
//

// The network stack can be compiled using system_current (non-finalized) SDK, or finalized system_X
// SDK. There is also a variant that uses system_current SDK and runs in the system process
// (InProcessNetworkStack). The following structure is used to create the build rules:
//
//                          NetworkStackAndroidLibraryDefaults <-- common defaults for android libs
//                                     /           \
//    +NetworkStackApiStableShims --> /             \ <-- +NetworkStackApiCurrentShims
//    +NetworkStackApiStableLevel    /               \    +NetworkStackApiCurrentLevel
//                                  /                 \
//           NetworkStackApiStableLib         NetworkStackApiCurrentLib <-- android libs w/ all code
//                     |                                     |             (also used in unit tests)
//                     | <--   +NetworkStackAppDefaults  --> |
//                     |          (APK build params)         |
//                     |                                     |
//                     | <-- +NetworkStackApiStableLevel     | <-- +NetworkStackApiCurrentLevel
//                     |                                     |
//                     |                                     |
//           NetworkStackApiStable          NetworkStack, InProcessNetworkStack, <-- output APKs
//                                                    TestNetworkStack

java_library {
    name: "captiveportal-lib",
    srcs: ["common/**/*.java"],
@@ -23,16 +43,38 @@ java_library {
    sdk_version: "system_current",
}

// Common defaults to define SDK level
java_defaults {
    name: "NetworkStackCommon",
    name: "NetworkStackApiCurrentLevel",
    sdk_version: "system_current",
    min_sdk_version: "28",
}

// Library including the network stack, used to compile both variants of the network stack
android_library {
    name: "NetworkStackBase",
    defaults: ["NetworkStackCommon"],
java_defaults {
    name: "NetworkStackApiStableLevel",
    sdk_version: "system_current", // TODO: change to system_29
    min_sdk_version: "28",
}

// Java libraries for the API shims
filegroup {
    name: "NetworkStackApiCurrentShims",
    srcs: [
        "apishim/current/**/*.java"
    ],
}

filegroup {
    name: "NetworkStackApiStableShims",
    srcs: [
        "apishim/29/**/*.java"
    ],
}

// Common defaults for android libraries containing network stack code, used to compile variants of
// the network stack in the system process and in the network_stack process
java_defaults {
    name: "NetworkStackAndroidLibraryDefaults",
    srcs: [
        "src/**/*.java",
        ":framework-networkstack-shared-srcs",
@@ -51,43 +93,27 @@ android_library {
    manifest: "AndroidManifestBase.xml",
}

cc_library_shared {
    name: "libnetworkstackutilsjni",
// The versions of the android library containing network stack code compiled for each SDK variant
android_library {
    name: "NetworkStackApiCurrentLib",
    defaults: ["NetworkStackApiCurrentLevel", "NetworkStackAndroidLibraryDefaults"],
    srcs: [
        "jni/network_stack_utils_jni.cpp"
    ],
    sdk_version: "current",
    shared_libs: [
        "liblog",
        "libnativehelper_compat_libc++",
        ":NetworkStackApiCurrentShims",
    ],
}

    // We cannot use plain "libc++" here to link libc++ dynamically because it results in:
    //   java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
    // even if "libc++" is added into jni_libs below. Adding "libc++_shared" into jni_libs doesn't
    // build because soong complains of:
    //   module NetworkStack missing dependencies: libc++_shared
    //
    // So, link libc++ statically. This means that we also need to ensure that all the C++ libraries
    // we depend on do not dynamically link libc++. This is currently the case, because liblog is
    // C-only and libnativehelper_compat_libc also uses stl: "c++_static".
    //
    // TODO: find a better solution for this in R.
    stl: "c++_static",
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-unused-parameter",
android_library {
    name: "NetworkStackApiStableLib",
    defaults: ["NetworkStackApiStableLevel", "NetworkStackAndroidLibraryDefaults"],
    srcs: [
        ":NetworkStackApiStableShims",
    ],
}

// Common defaults for compiling the actual APK, based on the NetworkStackApiXBase android libraries
java_defaults {
    name: "NetworkStackAppCommon",
    defaults: ["NetworkStackCommon"],
    name: "NetworkStackAppDefaults",
    privileged: true,
    static_libs: [
        "NetworkStackBase",
    ],
    jni_libs: [
        "libnativehelper_compat_libc++",
        "libnetworkstackutilsjni",
@@ -95,6 +121,7 @@ java_defaults {
    // Resources already included in NetworkStackBase
    resource_dirs: [],
    jarjar_rules: "jarjar-rules-shared.txt",
    use_embedded_native_libs: true,
    optimize: {
        proguard_flags_files: ["proguard.flags"],
    },
@@ -103,7 +130,8 @@ java_defaults {
// Non-updatable network stack running in the system server process for devices not using the module
android_app {
    name: "InProcessNetworkStack",
    defaults: ["NetworkStackAppCommon"],
    defaults: [ "NetworkStackAppDefaults", "NetworkStackApiCurrentLevel"],
    static_libs: ["NetworkStackApiCurrentLib"],
    certificate: "platform",
    manifest: "AndroidManifest_InProcess.xml",
    // InProcessNetworkStack is a replacement for NetworkStack
@@ -117,20 +145,63 @@ android_app {
// Updatable network stack packaged as an application
android_app {
    name: "NetworkStack",
    defaults: ["NetworkStackAppCommon"],
    defaults: ["NetworkStackAppDefaults", "NetworkStackApiCurrentLevel"],
    static_libs: ["NetworkStackApiCurrentLib"],
    certificate: "networkstack",
    manifest: "AndroidManifest.xml",
    // The permission configuration *must* be included to ensure security of the device
    required: ["NetworkPermissionConfig"],
}

// Updatable network stack for finalized API
android_app {
    name: "NetworkStackApiStable",
    defaults: ["NetworkStackAppDefaults", "NetworkStackApiStableLevel"],
    static_libs: ["NetworkStackApiStableLib"],
    certificate: "networkstack",
    manifest: "AndroidManifest.xml",
    use_embedded_native_libs: true,
    // The permission configuration *must* be included to ensure security of the device
    required: ["NetworkPermissionConfig"],
}

// Android library to derive test APKs for integration tests
android_library {
    name: "TestNetworkStackLib",
    defaults: ["NetworkStackAppCommon"],
    defaults: ["NetworkStackAppDefaults", "NetworkStackApiCurrentLevel"],
    static_libs: ["NetworkStackApiCurrentLib"],
    manifest: "AndroidManifest.xml",
}

cc_library_shared {
    name: "libnetworkstackutilsjni",
    srcs: [
        "jni/network_stack_utils_jni.cpp"
    ],
    sdk_version: "current",
    shared_libs: [
        "liblog",
        "libnativehelper_compat_libc++",
    ],

    // We cannot use plain "libc++" here to link libc++ dynamically because it results in:
    //   java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
    // even if "libc++" is added into jni_libs below. Adding "libc++_shared" into jni_libs doesn't
    // build because soong complains of:
    //   module NetworkStack missing dependencies: libc++_shared
    //
    // So, link libc++ statically. This means that we also need to ensure that all the C++ libraries
    // we depend on do not dynamically link libc++. This is currently the case, because liblog is
    // C-only and libnativehelper_compat_libc also uses stl: "c++_static".
    //
    // TODO: find a better solution for this in R.
    stl: "c++_static",
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-unused-parameter",
    ],
}

genrule {
    name: "statslog-networkstack-java-gen",
    tools: ["stats-log-api-gen"],
@@ -148,11 +219,10 @@ genrule {

android_app {
    name: "TestNetworkStack",
    defaults: ["NetworkStackAppCommon"],
    defaults: ["NetworkStackAppDefaults", "NetworkStackApiCurrentLevel"],
    static_libs: ["NetworkStackApiCurrentLib"],
    certificate: "networkstack",
    manifest: ":NetworkStackTestAndroidManifest",
    use_embedded_native_libs: true,
    // The permission configuration *must* be included to ensure security of the device
    required: ["NetworkPermissionConfig"],
}
+36 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.networkstack.apishim;

import android.net.util.SocketUtils;

import androidx.annotation.NonNull;

import java.net.SocketAddress;

/**
 * Implementation of SocketUtilsShim for API 29.
 */
public class SocketUtilsShimImpl implements SocketUtilsShim {
    @NonNull
    @Override
    public SocketAddress makePacketSocketAddress(
            int protocol, int ifIndex, @NonNull byte[] hwAddr) {
        // Not available for API <= 29: fallback to older behavior.
        return SocketUtils.makePacketSocketAddress(ifIndex, hwAddr);
    }
}
+36 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.networkstack.apishim;

import android.net.util.SocketUtils;

import androidx.annotation.NonNull;

import java.net.SocketAddress;

/**
 * Implementation of {@link SocketUtilsShim} for API 30.
 */
public class SocketUtilsShimImpl implements SocketUtilsShim {
    @NonNull
    @Override
    public SocketAddress makePacketSocketAddress(
            int protocol, int ifIndex, @NonNull byte[] hwAddr) {
        // TODO: use new API (which takes protocol, ifIndex, hwAddr) once implemented
        return SocketUtils.makePacketSocketAddress(ifIndex, hwAddr);
    }
}
+49 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.networkstack.apishim;

import androidx.annotation.NonNull;

import java.net.SocketAddress;

/**
 * Interface used to access API methods in {@link android.net.util.SocketUtils}, with appropriate
 * fallbacks if the methods are not yet part of the released API.
 *
 * <p>This interface makes it easier for callers to use SocketUtilsShimImpl, as it's more obvious
 * what methods must be implemented on each API level, and it abstracts from callers the need to
 * reference classes that have different implementations (which also does not work well with IDEs).
 */
public interface SocketUtilsShim {
    /**
     * Create a new instance of SocketUtilsShim.
     */
    @NonNull
    static SocketUtilsShim newInstance() {
        // TODO: when the R API is finalized, rename the API 29 shim to SocketUtilsCompat, and
        // return it here instead of SocketUtilsShimImpl for devices with Build.VERSION <= 29.
        // For now, the switch between implementations is done at build time (swapping the java file
        // with another), since production modules should not be built with a non-finalized API.
        return new SocketUtilsShimImpl();
    }

    /**
     * @see android.net.util.SocketUtils#makePacketSocketAddress(int, int, byte[])
     */
    @NonNull
    SocketAddress makePacketSocketAddress(int protocol, int ifIndex, @NonNull byte[] hwAddr);
}
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ android_test {
        "androidx.test.rules",
        "mockito-target-extended-minus-junit4",
        "net-tests-utils",
        "NetworkStackBase",
        "NetworkStackApiCurrentLib",
        "testables",
    ],
    libs: [
Loading