summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp152
-rw-r--r--apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java36
-rw-r--r--apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java36
-rw-r--r--src/com/android/networkstack/apishim/SocketUtilsShim.java49
-rw-r--r--tests/integration/Android.bp2
-rw-r--r--tests/unit/Android.bp2
6 files changed, 234 insertions, 43 deletions
diff --git a/Android.bp b/Android.bp
index 2e71c75..ba2e424 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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"],
}
-
diff --git a/apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java b/apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java
new file mode 100644
index 0000000..0e41e19
--- /dev/null
+++ b/apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java
@@ -0,0 +1,36 @@
+/*
+ * 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);
+ }
+}
diff --git a/apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java b/apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java
new file mode 100644
index 0000000..92f8438
--- /dev/null
+++ b/apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java
@@ -0,0 +1,36 @@
+/*
+ * 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);
+ }
+}
diff --git a/src/com/android/networkstack/apishim/SocketUtilsShim.java b/src/com/android/networkstack/apishim/SocketUtilsShim.java
new file mode 100644
index 0000000..34b5f40
--- /dev/null
+++ b/src/com/android/networkstack/apishim/SocketUtilsShim.java
@@ -0,0 +1,49 @@
+/*
+ * 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);
+}
diff --git a/tests/integration/Android.bp b/tests/integration/Android.bp
index ec16467..89b3968 100644
--- a/tests/integration/Android.bp
+++ b/tests/integration/Android.bp
@@ -24,7 +24,7 @@ android_test {
"androidx.test.rules",
"mockito-target-extended-minus-junit4",
"net-tests-utils",
- "NetworkStackBase",
+ "NetworkStackApiCurrentLib",
"testables",
],
libs: [
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 9c1c791..3081666 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -24,7 +24,7 @@ android_test {
"androidx.test.rules",
"mockito-target-extended-minus-junit4",
"net-tests-utils",
- "NetworkStackBase",
+ "NetworkStackApiCurrentLib",
"testables",
],
libs: [