diff options
-rw-r--r-- | Android.bp | 152 | ||||
-rw-r--r-- | apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java | 36 | ||||
-rw-r--r-- | apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java | 36 | ||||
-rw-r--r-- | src/com/android/networkstack/apishim/SocketUtilsShim.java | 49 | ||||
-rw-r--r-- | tests/integration/Android.bp | 2 | ||||
-rw-r--r-- | tests/unit/Android.bp | 2 |
6 files changed, 234 insertions, 43 deletions
@@ -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: [ |