// // Copyright (C) 2018 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. // // Common defaults to define SDK level package { default_team: "trendy_team_fwk_core_networking", default_applicable_licenses: ["Android-Apache-2.0"], } // TODO: remove this default and replace with ConnectivityNextEnableDefaults. This will need to be // done separately in each branch due to merge conflicts. // Defaults to enable/disable java targets that depend on // NetworkStackNext, which uses development APIs. "enabled" may // have a different value depending on the branch. java_defaults { name: "NetworkStackNextEnableDefaults", enabled: true, } // Common defaults for NetworkStack integration tests, root tests and coverage tests // to keep tests always running against the same target sdk version with NetworkStack. java_defaults { name: "NetworkStackReleaseTargetSdk", min_sdk_version: "30", target_sdk_version: "35", } java_defaults { name: "NetworkStackReleaseApiLevel", defaults: ["NetworkStackReleaseTargetSdk"], sdk_version: "module_current", libs: [ "framework-configinfrastructure.stubs.module_lib", "framework-connectivity.stubs.module_lib", "framework-connectivity-t.stubs.module_lib", "framework-statsd.stubs.module_lib", "framework-tethering.stubs.module_lib", "framework-wifi.stubs.module_lib", ], } // Libraries for the API shims java_defaults { name: "NetworkStackShimsDefaults", libs: [ "androidx.annotation_annotation", "networkstack-aidl-latest", ], static_libs: [ "modules-utils-build_system", ], apex_available: [ "com.android.tethering", "//apex_available:platform", // For InProcessNetworkStack ], min_sdk_version: "30", } // Common shim code. This includes the shim interface definitions themselves, and things like // ShimUtils and UnsupportedApiLevelException. Compiles against system_current because ShimUtils // needs access to all Build.VERSION_CODES.*, which by definition are only in the newest SDK. // TODO: consider moving ShimUtils into a library (or removing it in favour of SdkLevel) and compile // this target against the lowest-supported SDK (currently 30). java_library { name: "NetworkStackShimsCommon", defaults: ["NetworkStackShimsDefaults"], srcs: ["apishim/common/**/*.java"], sdk_version: "system_current", visibility: ["//visibility:private"], } // Each level of the shims (29, 30, ...) is its own java_library compiled against the corresponding // system_X SDK. this ensures that each shim can only use SDK classes that exist in its SDK level. java_library { name: "NetworkStackApi29Shims", defaults: ["NetworkStackShimsDefaults"], srcs: ["apishim/29/**/*.java"], libs: [ "NetworkStackShimsCommon", ], sdk_version: "system_29", visibility: ["//visibility:private"], } java_library { name: "NetworkStackApi30Shims", defaults: ["NetworkStackShimsDefaults"], srcs: [ "apishim/30/**/*.java", ], libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", ], sdk_version: "system_30", visibility: ["//visibility:private"], lint: { strict_updatability_linting: true, }, } java_library { name: "NetworkStackApi31Shims", defaults: ["NetworkStackShimsDefaults"], srcs: [ "apishim/31/**/*.java", ], static_libs: [ // Libs building against module API can only be linked against when building against // module API (so NetworkStackApi30Shims or NetworkStackApi29Shims can't use it, since they // use system_30 and system_29 respectively). "net-utils-framework-common", ], libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "framework-connectivity.impl", "sdk_module-lib_31_framework-wifi", ], sdk_version: "module_31", visibility: ["//visibility:private"], } java_library { name: "NetworkStackApi33Shims", defaults: ["NetworkStackShimsDefaults"], srcs: [ "apishim/33/**/*.java", ], libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "NetworkStackApi31Shims", "sdk_module-lib_33_framework-bluetooth", "framework-connectivity.impl", "framework-connectivity-t.stubs.module_lib", "framework-tethering.impl", "sdk_module-lib_33_framework-wifi", ], sdk_version: "module_33", visibility: ["//visibility:private"], } java_library { name: "NetworkStackApi34Shims", defaults: ["NetworkStackShimsDefaults"], srcs: [ "apishim/34/**/*.java", ], libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "NetworkStackApi31Shims", "NetworkStackApi33Shims", "sdk_module-lib_34_framework-bluetooth", "framework-connectivity.impl", "framework-connectivity-t.stubs.module_lib", "framework-tethering.impl", "sdk_module-lib_34_framework-wifi", ], sdk_version: "module_34", visibility: ["//visibility:private"], } // Shims for APIs being added to the current development version of Android. These APIs are not // stable and have no defined version number. These could be called 10000, but they use the next // integer so if the next SDK release happens to use that integer, we don't need to rename them. // Jarjar rules are generated based on the stable shims, which do not contain this library. As a // result, no static_lib that needs jarjar should be used here. In general, static_libs should not // be used in this library at all; instead they can be in one of the earlier, shim libraries which // are part of the stable shims and scanned when generating jarjar rules. java_library { name: "NetworkStackApi35Shims", defaults: [ "NetworkStackShimsDefaults", "ConnectivityNextEnableDefaults", ], srcs: [ "apishim/35/**/*.java", ], libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "NetworkStackApi31Shims", "NetworkStackApi33Shims", "NetworkStackApi34Shims", "framework-bluetooth.stubs.module_lib", "framework-connectivity.impl", "framework-connectivity-t.stubs.module_lib", "framework-tethering.impl", "framework-wifi.stubs.module_lib", "android.net.ipsec.ike.stubs.module_lib", ], sdk_version: "module_current", visibility: ["//visibility:private"], } // API current uses the API current shims directly. // The current (in-progress) shims are in the com.android.networkstack.apishim package and are // called directly by the networkstack code. java_library { name: "NetworkStackApiCurrentShims", defaults: [ "NetworkStackShimsDefaults", "NetworkStackReleaseApiLevel", "ConnectivityNextEnableDefaults", ], static_libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "NetworkStackApi31Shims", "NetworkStackApi33Shims", "NetworkStackApi34Shims", "NetworkStackApi35Shims", ], visibility: [ "//packages/modules/Connectivity/Tethering", "//packages/modules/Connectivity/service", "//packages/modules/Connectivity/service-t", "//packages/modules/Connectivity/tests:__subpackages__", ], } // API stable uses jarjar to rename the latest stable apishim package from // com.android.networkstack.apishim.apiXX to com.android.networkstack.apishim, which is called by // the networkstack code. java_library { name: "NetworkStackApiStableShims", defaults: [ "NetworkStackShimsDefaults", "NetworkStackReleaseApiLevel", ], static_libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "NetworkStackApi31Shims", "NetworkStackApi33Shims", "NetworkStackApi34Shims", ], jarjar_rules: "apishim/jarjar-rules-compat.txt", visibility: [ "//packages/modules/Connectivity/Tethering", "//packages/modules/Connectivity/service", "//packages/modules/Connectivity/service-t", "//packages/modules/Connectivity/tests:__subpackages__", ], } // 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: [ ":framework-networkstack-shared-srcs", ], libs: [ "error_prone_annotations", "framework-annotations-lib", "unsupportedappusage", ], static_libs: [ "androidx.annotation_annotation", "modules-utils-build_system", "modules-utils-expresslog", "modules-utils-preconditions", "modules-utils-shell-command-handler", "modules-utils-statemachine", "netd_aidl_interface-lateststable-java", "networkstack-client", "net-utils-framework-common", // See note on statsprotos when adding/updating proto build rules "datastallprotosnano", "statsprotos", "captiveportal-lib", "net-utils-device-common-ip", "net-utils-device-common-netlink", "net-utils-device-common-struct", "net-utils-device-common-struct-base", ], } // The versions of the android library containing network stack code compiled for each SDK variant. android_library { name: "NetworkStackApiCurrentLib", defaults: [ "NetworkStackReleaseApiLevel", "NetworkStackAndroidLibraryDefaults", "ConnectivityNextEnableDefaults", ], srcs: [ "src/**/*.java", ":statslog-networkstack-java-gen-current", ], static_libs: [ "NetworkStackApiCurrentShims", ], manifest: "AndroidManifestBase.xml", visibility: [ "//frameworks/base/tests/net/integration", "//packages/modules/Connectivity/Tethering/tests/integration", "//packages/modules/NetworkStack/tests/unit", "//packages/modules/NetworkStack/tests/integration", ], } android_library { name: "NetworkStackApiStableLib", defaults: [ "NetworkStackReleaseApiLevel", "NetworkStackAndroidLibraryDefaults", ], srcs: [ "src/**/*.java", ":statslog-networkstack-java-gen-stable", ], static_libs: [ "NetworkStackApiStableShims", ], manifest: "AndroidManifestBase.xml", visibility: [ "//packages/modules/Connectivity/Tethering/tests/integration", "//packages/modules/Connectivity/tests/integration", "//packages/modules/NetworkStack/tests/unit", "//packages/modules/NetworkStack/tests/integration", ], } java_library { name: "DhcpPacketLib", defaults: ["NetworkStackReleaseApiLevel"], srcs: [ "src/android/net/DhcpResults.java", "src/android/net/dhcp/Dhcp*Packet.java", ], libs: [ "androidx.annotation_annotation", "framework-annotations-lib", ], static_libs: [ "modules-utils-build", "net-utils-framework-common", "networkstack-client", "net-utils-device-common", ], // If this library is ever used outside of tests, it should not use "Dhcp*Packet", and specify // its contents explicitly. visibility: [ "//packages/modules/Connectivity/Tethering/tests/integration", "//packages/modules/Connectivity/tests/cts/net", ], } java_library { name: "ApfGeneratorLib", defaults: ["NetworkStackReleaseApiLevel"], srcs: [ "src/android/net/apf/ApfConstants.java", "src/android/net/apf/ApfCounterTracker.java", "src/android/net/apf/ApfV4Generator.java", "src/android/net/apf/ApfV4GeneratorBase.java", "src/android/net/apf/ApfV6Generator.java", "src/android/net/apf/ApfV6GeneratorBase.java", "src/android/net/apf/BaseApfGenerator.java", ], libs: [ "androidx.annotation_annotation", "framework-annotations-lib", ], static_libs: [ "net-utils-framework-common", ], visibility: [ "//packages/modules/Connectivity/tests/cts/net", ], } java_genrule { name: "NetworkStackJarJarRules", tool_files: [ // com.android.networkstack.apishim is already in the target package that is not jarjared, // so it does not matter whether ApiStable or ApiCurrent is used to generate the jarjar // rules. Use ApiStable to be based on most stable release configuration and be buildable // in all branches. ":NetworkStackApiStableLib{.jar}", "jarjar-excludes.txt", ], tools: [ "jarjar-rules-generator", ], out: ["NetworkStackJarJarRules.txt"], cmd: "$(location jarjar-rules-generator) " + "$(location :NetworkStackApiStableLib{.jar}) " + "--prefix com.android.networkstack " + "--excludes $(location jarjar-excludes.txt) " + "--output $(out)", visibility: [ "//packages/modules/NetworkStack/tests/unit", "//packages/modules/NetworkStack/tests/integration", "//packages/modules/Connectivity/tests:__subpackages__", "//packages/modules/Connectivity/Tethering/tests/integration", ], } // Common defaults for compiling the actual APK, based on the NetworkStackApiXBase android libraries java_defaults { name: "NetworkStackAppDefaults", privileged: true, jni_libs: [ "libnativehelper_compat_libc++", "libnetworkstackutilsjni", ], // Resources already included in NetworkStackBase resource_dirs: [], jarjar_rules: ":NetworkStackJarJarRules", use_embedded_native_libs: true, optimize: { ignore_warnings: false, proguard_flags_files: ["proguard.flags"], }, } // Non-updatable network stack running in the system server process for devices not using the module android_app { name: "InProcessNetworkStack", defaults: [ "NetworkStackAppDefaults", "NetworkStackReleaseApiLevel", "ConnectivityNextEnableDefaults", ], static_libs: ["NetworkStackApiCurrentLib"], certificate: "platform", manifest: "AndroidManifest_InProcess.xml", // InProcessNetworkStack is a replacement for NetworkStack overrides: [ "NetworkStack", "NetworkStackNext", ], // The InProcessNetworkStack goes together with the PlatformCaptivePortalLogin, which replaces // the default CaptivePortalLogin. required: [ "PlatformCaptivePortalLogin", ], } // Pre-merge the AndroidManifest for NetworkStackNext, so that its manifest can be merged on top android_library { name: "NetworkStackNextManifestBase", defaults: [ "NetworkStackAppDefaults", "NetworkStackReleaseApiLevel", "ConnectivityNextEnableDefaults", ], static_libs: ["NetworkStackApiCurrentLib"], manifest: "AndroidManifest.xml", } // NetworkStack build targeting the current API release, for testing on in-development SDK android_app { name: "NetworkStackNext", defaults: [ "NetworkStackAppDefaults", "NetworkStackReleaseApiLevel", "ConnectivityNextEnableDefaults", ], static_libs: ["NetworkStackNextManifestBase"], certificate: "networkstack", manifest: "AndroidManifest_Next.xml", required: [ "privapp_whitelist_com.android.networkstack", ], updatable: true, } // Updatable network stack for finalized API android_app { name: "NetworkStack", defaults: [ "NetworkStackAppDefaults", "NetworkStackReleaseApiLevel", ], static_libs: ["NetworkStackApiStableLib"], certificate: "networkstack", manifest: "AndroidManifest.xml", required: [ "privapp_whitelist_com.android.networkstack", ], updatable: true, } cc_library_shared { name: "libnetworkstackutilsjni", srcs: [ "jni/network_stack_utils_jni.cpp", ], header_libs: [ "bpf_headers", ], sdk_version: "30", min_sdk_version: "30", shared_libs: [ "liblog", "libnativehelper_compat_libc++", ], static_libs: [ "libnetjniutils", ], // 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-current", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --java $(out) --module network_stack" + " --javaPackage com.android.networkstack.metrics --javaClass NetworkStackStatsLog" + " --minApiLevel 30", out: ["com/android/networkstack/metrics/NetworkStackStatsLog.java"], } genrule { name: "statslog-networkstack-java-gen-stable", tools: ["stats-log-api-gen"], cmd: "$(location stats-log-api-gen) --java $(out) --module network_stack" + " --javaPackage com.android.networkstack.metrics --javaClass NetworkStackStatsLog" + " --minApiLevel 30", out: ["com/android/networkstack/metrics/NetworkStackStatsLog.java"], } version_code_networkstack_next = "300000000" version_code_networkstack_test = "999999999" genrule { name: "NetworkStackTestAndroidManifest", srcs: ["AndroidManifest.xml"], out: ["TestAndroidManifest.xml"], cmd: "sed -E 's/versionCode=\"[0-9]+\"/versionCode=\"" + version_code_networkstack_test + "\"/' $(in) > $(out)", visibility: ["//visibility:private"], } android_app { name: "TestNetworkStack", defaults: [ "NetworkStackAppDefaults", "NetworkStackReleaseApiLevel", ], static_libs: ["NetworkStackApiStableLib"], certificate: "networkstack", manifest: ":NetworkStackTestAndroidManifest", required: [ "privapp_whitelist_com.android.networkstack", ], } // When adding or modifying protos, the jarjar rules and possibly proguard rules need // to be updated: proto libraries may pull additional static libraries. java_library_static { name: "statsprotos", proto: { type: "lite", }, srcs: [ "src/com/android/networkstack/metrics/stats.proto", ], static_libs: [ "networkstackprotos", ], defaults: ["NetworkStackReleaseApiLevel"], }