Loading Android.bp +111 −41 Original line number Diff line number Diff line Loading @@ -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"], Loading @@ -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", Loading @@ -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", Loading @@ -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"], }, Loading @@ -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 Loading @@ -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"], Loading @@ -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"], } apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java 0 → 100644 +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); } } apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java 0 → 100644 +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); } } src/com/android/networkstack/apishim/SocketUtilsShim.java 0 → 100644 +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); } tests/integration/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ android_test { "androidx.test.rules", "mockito-target-extended-minus-junit4", "net-tests-utils", "NetworkStackBase", "NetworkStackApiCurrentLib", "testables", ], libs: [ Loading Loading
Android.bp +111 −41 Original line number Diff line number Diff line Loading @@ -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"], Loading @@ -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", Loading @@ -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", Loading @@ -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"], }, Loading @@ -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 Loading @@ -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"], Loading @@ -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"], }
apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java 0 → 100644 +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); } }
apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java 0 → 100644 +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); } }
src/com/android/networkstack/apishim/SocketUtilsShim.java 0 → 100644 +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); }
tests/integration/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ android_test { "androidx.test.rules", "mockito-target-extended-minus-junit4", "net-tests-utils", "NetworkStackBase", "NetworkStackApiCurrentLib", "testables", ], libs: [ Loading