Merge "Utility improvements for handling V6 encap and XFRM_MIGRATE"
diff --git a/Cronet/tests/cts/OWNERS b/Cronet/tests/OWNERS
similarity index 100%
rename from Cronet/tests/cts/OWNERS
rename to Cronet/tests/OWNERS
diff --git a/Cronet/tests/common/Android.bp b/Cronet/tests/common/Android.bp
index 86fd807..5d2f6e5 100644
--- a/Cronet/tests/common/Android.bp
+++ b/Cronet/tests/common/Android.bp
@@ -38,6 +38,6 @@
jarjar_rules: ":net-http-test-jarjar-rules",
compile_multilib: "both", // Include both the 32 and 64 bit versions
jni_libs: [
- "//external/cronet:cronet_aml_components_cronet_android_cronet_tests__testing"
+ "cronet_aml_components_cronet_android_cronet_tests__testing"
],
}
diff --git a/Cronet/tests/mts/Android.bp b/Cronet/tests/mts/Android.bp
index 2b5f578..adbc384 100644
--- a/Cronet/tests/mts/Android.bp
+++ b/Cronet/tests/mts/Android.bp
@@ -36,18 +36,20 @@
android_library {
name: "NetHttpTestsLibPreJarJar",
- srcs: ["//external/cronet:cronet_aml_javatests_sources"],
+ srcs: [":cronet_aml_javatests_sources"],
sdk_version: "module_current",
min_sdk_version: "30",
static_libs: [
- "//external/cronet:cronet_testserver_utils",
+ "cronet_testserver_utils",
"androidx.test.ext.junit",
"androidx.test.rules",
"junit",
],
libs: [
"android.test.base",
- "framework-tethering-pre-jarjar",
+ // Needed for direct access to tethering's hidden apis and to avoid `symbol not found`
+ // errors on some builds.
+ "framework-tethering.impl",
],
lint: { test: true }
}
@@ -61,7 +63,7 @@
static_libs: ["NetHttpTestsLibPreJarJar"],
jarjar_rules: ":net-http-test-jarjar-rules",
jni_libs: [
- "//external/cronet:cronet_aml_components_cronet_android_cronet_tests__testing"
+ "cronet_aml_components_cronet_android_cronet_tests__testing"
],
test_suites: [
"general-tests",
diff --git a/Cronet/tests/mts/AndroidManifest.xml b/Cronet/tests/mts/AndroidManifest.xml
index 62c2060..f597134 100644
--- a/Cronet/tests/mts/AndroidManifest.xml
+++ b/Cronet/tests/mts/AndroidManifest.xml
@@ -21,7 +21,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
- <application>
+ <application android:networkSecurityConfig="@xml/network_security_config">
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/Cronet/tests/mts/res/xml/network_security_config.xml b/Cronet/tests/mts/res/xml/network_security_config.xml
new file mode 100644
index 0000000..d44c36f
--- /dev/null
+++ b/Cronet/tests/mts/res/xml/network_security_config.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2022 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.
+ -->
+
+<network-security-config>
+ <domain-config cleartextTrafficPermitted="true">
+ <!-- Used as the base URL by native test server (net::EmbeddedTestServer) -->
+ <domain includeSubdomains="true">127.0.0.1</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testIOExceptionInterruptRethrown -->
+ <domain includeSubdomains="true">localhost</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testBadIP -->
+ <domain includeSubdomains="true">0.0.0.0</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testSetUseCachesFalse -->
+ <domain includeSubdomains="true">host-cache-test-host</domain>
+ <!-- Used by CronetHttpURLConnectionTest#testBadHostname -->
+ <domain includeSubdomains="true">this-weird-host-name-does-not-exist</domain>
+ <!-- Used by CronetUrlRequestContextTest#testHostResolverRules -->
+ <domain includeSubdomains="true">some-weird-hostname</domain>
+ </domain-config>
+</network-security-config>
\ No newline at end of file
diff --git a/Cronet/tools/import/import_cronet.sh b/Cronet/tools/import/import_cronet.sh
index 6639a4c..0f04af7 100755
--- a/Cronet/tools/import/import_cronet.sh
+++ b/Cronet/tools/import/import_cronet.sh
@@ -24,6 +24,8 @@
# -n rev: The new revision to import.
# -f: Force copybara to ignore a failure to find the last imported revision.
+set -e -x
+
OPTSTRING=fl:n:
usage() {
@@ -55,7 +57,7 @@
# Arguments:
# new_rev, string
#######################################
-setup_folder_origin() {
+setup_folder_origin() (
local _new_rev=$1
mkdir -p "${COPYBARA_FOLDER_ORIGIN}"
cd "${COPYBARA_FOLDER_ORIGIN}"
@@ -83,9 +85,10 @@
cd src
# Set appropriate gclient flags to speed up syncing.
gclient sync \
- --no-history
- --shallow
-}
+ --no-history \
+ --shallow \
+ --delete_unversioned_trees
+)
#######################################
# Runs the copybara import of Chromium
diff --git a/Tethering/apex/Android.bp b/Tethering/apex/Android.bp
index ff5acf5..3f35c6b 100644
--- a/Tethering/apex/Android.bp
+++ b/Tethering/apex/Android.bp
@@ -38,6 +38,13 @@
name: "ConnectivityNextEnableDefaults",
enabled: true,
}
+java_defaults {
+ name: "NetworkStackApiShimSettingsForCurrentBranch",
+ // API shims to include in the networking modules built from the branch. Branches that disable
+ // the "next" targets must use stable shims (latest stable API level) instead of current shims
+ // (X_current API level).
+ static_libs: ["NetworkStackApiCurrentShims"],
+}
apex_defaults {
name: "ConnectivityApexDefaults",
// Tethering app to include in the AOSP apex. Branches that disable the "next" targets may use
@@ -67,7 +74,7 @@
apex_defaults {
name: "CronetInTetheringApexDefaultsEnabled",
jni_libs: [
- "//external/cronet:cronet_aml_components_cronet_android_cronet",
+ "cronet_aml_components_cronet_android_cronet",
"//external/cronet/third_party/boringssl:libcrypto",
"//external/cronet/third_party/boringssl:libssl",
],
@@ -75,7 +82,7 @@
riscv64: {
// TODO: remove this when there is a riscv64 libcronet
exclude_jni_libs: [
- "//external/cronet:cronet_aml_components_cronet_android_cronet",
+ "cronet_aml_components_cronet_android_cronet",
"//external/cronet/third_party/boringssl:libcrypto",
"//external/cronet/third_party/boringssl:libssl",
],
diff --git a/Tethering/common/TetheringLib/Android.bp b/Tethering/common/TetheringLib/Android.bp
index a3756e0..74170cb 100644
--- a/Tethering/common/TetheringLib/Android.bp
+++ b/Tethering/common/TetheringLib/Android.bp
@@ -54,6 +54,7 @@
"//packages/modules/CaptivePortalLogin/tests",
"//packages/modules/Connectivity/Tethering/tests:__subpackages__",
"//packages/modules/Connectivity/tests:__subpackages__",
+ "//packages/modules/Connectivity/Cronet/tests:__subpackages__",
"//packages/modules/IPsec/tests/iketests",
"//packages/modules/NetworkStack/tests:__subpackages__",
"//packages/modules/Wifi/service/tests/wifitests",
@@ -75,12 +76,12 @@
java_defaults {
name: "CronetJavaDefaultsEnabled",
- srcs: ["//external/cronet:cronet_aml_api_sources"],
+ srcs: [":cronet_aml_api_sources"],
libs: [
"androidx.annotation_annotation",
],
impl_only_static_libs: [
- "//external/cronet:cronet_aml_java",
+ "cronet_aml_java",
],
api_dir: "cronet_enabled/api",
}
@@ -101,8 +102,8 @@
java_defaults {
name: "CronetJavaPrejarjarDefaultsEnabled",
static_libs: [
- "//external/cronet:cronet_aml_api_java",
- "//external/cronet:cronet_aml_java"
+ "cronet_aml_api_java",
+ "cronet_aml_java"
],
}
diff --git a/framework-t/src/android/net/NetworkTemplate.java b/framework-t/src/android/net/NetworkTemplate.java
index d90bd8d..b3c70cf 100644
--- a/framework-t/src/android/net/NetworkTemplate.java
+++ b/framework-t/src/android/net/NetworkTemplate.java
@@ -47,6 +47,7 @@
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -58,7 +59,9 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Comparator;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
@@ -279,6 +282,102 @@
return new NetworkTemplate(MATCH_PROXY, null, null);
}
+ /**
+ * Template to match all metered carrier networks with the given IMSI.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateCarrierMetered(@NonNull String subscriberId) {
+ if (SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException(
+ "buildTemplateCarrierMetered is not supported on Android U devices or above");
+ }
+ return new NetworkTemplate.Builder(MATCH_CARRIER)
+ // Set.of will throw if subscriberId is null
+ .setSubscriberIds(Set.of(subscriberId))
+ .setMeteredness(METERED_YES)
+ .build();
+ }
+
+ /**
+ * Template to match cellular networks with the given IMSI, {@code ratType} and
+ * {@code metered}. Use {@link #NETWORK_TYPE_ALL} to include all network types when
+ * filtering. See {@code TelephonyManager.NETWORK_TYPE_*}.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateMobileWithRatType(@Nullable String subscriberId,
+ int ratType, int metered) {
+ if (SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException("buildTemplateMobileWithRatType is not "
+ + "supported on Android U devices or above");
+ }
+ return new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setSubscriberIds(TextUtils.isEmpty(subscriberId)
+ ? Collections.emptySet()
+ : Set.of(subscriberId))
+ .setMeteredness(metered)
+ .setRatType(ratType)
+ .build();
+ }
+
+
+ /**
+ * Template to match {@link ConnectivityManager#TYPE_WIFI} networks with the
+ * given key of the wifi network.
+ *
+ * @param wifiNetworkKey key of the wifi network. see {@link WifiInfo#getNetworkKey()}
+ * to know details about the key.
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateWifi(@NonNull String wifiNetworkKey) {
+ if (SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException("buildTemplateWifi is not "
+ + "supported on Android U devices or above");
+ }
+ return new NetworkTemplate.Builder(MATCH_WIFI)
+ // Set.of will throw if wifiNetworkKey is null
+ .setWifiNetworkKeys(Set.of(wifiNetworkKey))
+ .build();
+ }
+
+ /**
+ * Template to match all {@link ConnectivityManager#TYPE_WIFI} networks with the given
+ * key of the wifi network and IMSI.
+ *
+ * Call with {@link #WIFI_NETWORK_KEY_ALL} for {@code wifiNetworkKey} to get result regardless
+ * of key of the wifi network.
+ *
+ * @param wifiNetworkKey key of the wifi network. see {@link WifiInfo#getNetworkKey()}
+ * to know details about the key.
+ * @param subscriberId the IMSI associated to this wifi network.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate buildTemplateWifi(@Nullable String wifiNetworkKey,
+ @Nullable String subscriberId) {
+ if (SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException("buildTemplateWifi is not "
+ + "supported on Android U devices or above");
+ }
+ return new NetworkTemplate.Builder(MATCH_WIFI)
+ .setSubscriberIds(subscriberId == null
+ ? Collections.emptySet()
+ : Set.of(subscriberId))
+ .setWifiNetworkKeys(wifiNetworkKey == null
+ ? Collections.emptySet()
+ : Set.of(wifiNetworkKey))
+ .build();
+ }
+
private final int mMatchRule;
/**
@@ -830,8 +929,7 @@
* subscribers.
* <p>
* For example, given an incoming template matching B, and the currently
- * active merge set [A,B], we'd return a new template that primarily matches
- * A, but also matches B.
+ * active merge set [A,B], we'd return a new template that matches both A and B.
*
* @hide
*/
@@ -840,6 +938,49 @@
+ "Callers should have their own logic to merge template for"
+ " different IMSIs and stop calling this function.")
public static NetworkTemplate normalize(NetworkTemplate template, String[] merged) {
+ return normalizeImpl(template, Collections.singletonList(merged));
+ }
+
+ /**
+ * Examine the given template and normalize it.
+ * We pick the "lowest" merged subscriber as the primary
+ * for key purposes, and expand the template to match all other merged
+ * subscribers.
+ *
+ * There can be multiple merged subscriberIds for multi-SIM devices.
+ *
+ * <p>
+ * For example, given an incoming template matching B, and the currently
+ * active merge set [A,B], we'd return a new template that matches both A and B.
+ *
+ * @hide
+ */
+ // TODO(b/273963543): Remove this method. This can only be done after there are no more callers,
+ // including in OEM code which can access this by linking against the framework.
+ public static NetworkTemplate normalize(NetworkTemplate template, List<String[]> mergedList) {
+ if (SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException(
+ "normalize is not supported on Android U devices or above");
+ }
+ return normalizeImpl(template, mergedList);
+ }
+
+ /**
+ * Examine the given template and normalize it.
+ * We pick the "lowest" merged subscriber as the primary
+ * for key purposes, and expand the template to match all other merged
+ * subscribers.
+ *
+ * There can be multiple merged subscriberIds for multi-SIM devices.
+ *
+ * <p>
+ * For example, given an incoming template matching B, and the currently
+ * active merge set [A,B], we'd return a new template that matches both A and B.
+ *
+ * @hide
+ */
+ private static NetworkTemplate normalizeImpl(NetworkTemplate template,
+ List<String[]> mergedList) {
// Now there are several types of network which uses SubscriberId to store network
// information. For instances:
// The TYPE_WIFI with subscriberId means that it is a merged carrier wifi network.
@@ -847,18 +988,21 @@
if (CollectionUtils.isEmpty(template.mMatchSubscriberIds)) return template;
- if (CollectionUtils.contains(merged, template.mMatchSubscriberIds[0])) {
- // Requested template subscriber is part of the merge group; return
- // a template that matches all merged subscribers.
- final String[] matchWifiNetworkKeys = template.mMatchWifiNetworkKeys;
- // TODO: Use NetworkTemplate.Builder to build a template after NetworkTemplate
- // could handle incompatible subscriberIds. See b/217805241.
- return new NetworkTemplate(template.mMatchRule, merged,
- CollectionUtils.isEmpty(matchWifiNetworkKeys)
- ? new String[0] : new String[] { matchWifiNetworkKeys[0] },
- (template.mMatchRule == MATCH_MOBILE || template.mMatchRule == MATCH_CARRIER)
- ? METERED_YES : METERED_ALL,
- ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL);
+ for (String[] merged : mergedList) {
+ if (CollectionUtils.contains(merged, template.mMatchSubscriberIds[0])) {
+ // Requested template subscriber is part of the merge group; return
+ // a template that matches all merged subscribers.
+ final String[] matchWifiNetworkKeys = template.mMatchWifiNetworkKeys;
+ // TODO: Use NetworkTemplate.Builder to build a template after NetworkTemplate
+ // could handle incompatible subscriberIds. See b/217805241.
+ return new NetworkTemplate(template.mMatchRule, merged,
+ CollectionUtils.isEmpty(matchWifiNetworkKeys)
+ ? new String[0] : new String[] { matchWifiNetworkKeys[0] },
+ (template.mMatchRule == MATCH_MOBILE
+ || template.mMatchRule == MATCH_CARRIER)
+ ? METERED_YES : METERED_ALL,
+ ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL);
+ }
}
return template;
diff --git a/service/Android.bp b/service/Android.bp
index 1523af9..e1376a1 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -138,6 +138,14 @@
name: "service-connectivity-pre-jarjar",
sdk_version: "system_server_current",
min_sdk_version: "30",
+ // NetworkStackApiShimSettingsForCurrentBranch provides the latest available shims depending on
+ // the branch to "service-connectivity".
+ // There are Tethering.apk and TetheringNext.apk variants for the tethering APEX,
+ // which use NetworkStackApiStableShims and NetworkStackApiCurrentShims respectively.
+ // Note that there can be no service-connectivity-next because it would need to be configured in
+ // default_art_config.mk which doesn't support conditionals, hence this scheme of using a
+ // variable here.
+ defaults: ["NetworkStackApiShimSettingsForCurrentBranch"],
srcs: [
"src/**/*.java",
":framework-connectivity-shared-srcs",
@@ -183,7 +191,6 @@
"PlatformProperties",
"service-connectivity-protos",
"service-connectivity-stats-protos",
- "NetworkStackApiStableShims",
],
apex_available: [
"com.android.tethering",
diff --git a/service/libconnectivity/src/connectivity_native.cpp b/service/libconnectivity/src/connectivity_native.cpp
index 9545ed1..a476498 100644
--- a/service/libconnectivity/src/connectivity_native.cpp
+++ b/service/libconnectivity/src/connectivity_native.cpp
@@ -23,8 +23,8 @@
static std::shared_ptr<IConnectivityNative> getBinder() {
- static ndk::SpAIBinder sBinder = ndk::SpAIBinder(reinterpret_cast<AIBinder*>(
- AServiceManager_getService("connectivity_native")));
+ ndk::SpAIBinder sBinder = ndk::SpAIBinder(reinterpret_cast<AIBinder*>(
+ AServiceManager_checkService("connectivity_native")));
return aidl::android::net::connectivity::aidl::IConnectivityNative::fromBinder(sBinder);
}
@@ -45,21 +45,33 @@
int AConnectivityNative_blockPortForBind(in_port_t port) {
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
return getErrno(c->blockPortForBind(port));
}
int AConnectivityNative_unblockPortForBind(in_port_t port) {
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
return getErrno(c->unblockPortForBind(port));
}
int AConnectivityNative_unblockAllPortsForBind() {
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
return getErrno(c->unblockAllPortsForBind());
}
int AConnectivityNative_getPortsBlockedForBind(in_port_t *ports, size_t *count) {
std::shared_ptr<IConnectivityNative> c = getBinder();
+ if (!c) {
+ return EAGAIN;
+ }
std::vector<int32_t> actualBlockedPorts;
int err = getErrno(c->getPortsBlockedForBind(&actualBlockedPorts));
if (err) {
diff --git a/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java b/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java
index 6b7222a..7e288c6 100644
--- a/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java
+++ b/service/src/com/android/server/connectivity/AutomaticOnOffKeepaliveTracker.java
@@ -18,6 +18,7 @@
import static android.net.NetworkAgent.CMD_START_SOCKET_KEEPALIVE;
import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET;
+import static android.net.SocketKeepalive.MIN_INTERVAL_SEC;
import static android.net.SocketKeepalive.SUCCESS_PAUSED;
import static android.provider.DeviceConfig.NAMESPACE_TETHERING;
import static android.system.OsConstants.AF_INET;
@@ -88,8 +89,8 @@
public class AutomaticOnOffKeepaliveTracker {
private static final String TAG = "AutomaticOnOffKeepaliveTracker";
private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET6, AF_INET};
- private static final long DEFAULT_TCP_POLLING_INTERVAL_MS = 120_000L;
private static final long LOW_TCP_POLLING_INTERVAL_MS = 1_000L;
+ private static final int ADJUST_TCP_POLLING_DELAY_MS = 2000;
private static final String AUTOMATIC_ON_OFF_KEEPALIVE_VERSION =
"automatic_on_off_keepalive_version";
/**
@@ -178,8 +179,7 @@
private final Network mUnderpinnedNetwork;
AutomaticOnOffKeepalive(@NonNull final KeepaliveTracker.KeepaliveInfo ki,
- final boolean autoOnOff, @NonNull Context context,
- @Nullable Network underpinnedNetwork)
+ final boolean autoOnOff, @Nullable Network underpinnedNetwork)
throws InvalidSocketException {
this.mKi = Objects.requireNonNull(ki);
mCallback = ki.mCallback;
@@ -280,12 +280,14 @@
mAlarmManager = mDependencies.getAlarmManager(context);
}
- private void startTcpPollingAlarm(@NonNull final AlarmManager.OnAlarmListener listener) {
+ private void startTcpPollingAlarm(@NonNull AutomaticOnOffKeepalive ki) {
+ if (ki.mAlarmListener == null) return;
+
final long triggerAtMillis =
- SystemClock.elapsedRealtime() + getTcpPollingInterval();
+ mDependencies.getElapsedRealtime() + getTcpPollingIntervalMs(ki);
// Setup a non-wake up alarm.
mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, triggerAtMillis, null /* tag */,
- listener, mConnectivityServiceHandler);
+ ki.mAlarmListener, mConnectivityServiceHandler);
}
/**
@@ -322,7 +324,7 @@
handleMaybeResumeKeepalive(ki);
}
// TODO: listen to socket status instead of periodically check.
- startTcpPollingAlarm(ki.mAlarmListener);
+ startTcpPollingAlarm(ki);
}
/**
@@ -402,7 +404,7 @@
}
mAutomaticOnOffKeepalives.add(autoKi);
if (STATE_ALWAYS_ON != autoKi.mAutomaticOnOffState) {
- startTcpPollingAlarm(autoKi.mAlarmListener);
+ startTcpPollingAlarm(autoKi);
}
}
@@ -463,7 +465,7 @@
if (null == ki) return;
try {
final AutomaticOnOffKeepalive autoKi = new AutomaticOnOffKeepalive(ki,
- automaticOnOffKeepalives, mContext, underpinnedNetwork);
+ automaticOnOffKeepalives, underpinnedNetwork);
mConnectivityServiceHandler.obtainMessage(NetworkAgent.CMD_START_SOCKET_KEEPALIVE,
// TODO : move ConnectivityService#encodeBool to a static lib.
automaticOnOffKeepalives ? 1 : 0, 0, autoKi).sendToTarget();
@@ -493,7 +495,7 @@
if (null == ki) return;
try {
final AutomaticOnOffKeepalive autoKi = new AutomaticOnOffKeepalive(ki,
- automaticOnOffKeepalives, mContext, underpinnedNetwork);
+ automaticOnOffKeepalives, underpinnedNetwork);
mConnectivityServiceHandler.obtainMessage(NetworkAgent.CMD_START_SOCKET_KEEPALIVE,
// TODO : move ConnectivityService#encodeBool to a static lib.
automaticOnOffKeepalives ? 1 : 0, 0, autoKi).sendToTarget();
@@ -523,7 +525,7 @@
try {
final AutomaticOnOffKeepalive autoKi = new AutomaticOnOffKeepalive(ki,
false /* autoOnOff, tcp keepalives are never auto on/off */,
- mContext, null /* underpinnedNetwork, tcp keepalives do not refer to this */);
+ null /* underpinnedNetwork, tcp keepalives do not refer to this */);
mConnectivityServiceHandler.obtainMessage(CMD_START_SOCKET_KEEPALIVE, autoKi)
.sendToTarget();
} catch (InvalidSocketException e) {
@@ -677,9 +679,15 @@
}
}
- private long getTcpPollingInterval() {
+ private long getTcpPollingIntervalMs(@NonNull AutomaticOnOffKeepalive ki) {
final boolean useLowTimer = mTestLowTcpPollingTimerUntilMs > System.currentTimeMillis();
- return useLowTimer ? LOW_TCP_POLLING_INTERVAL_MS : DEFAULT_TCP_POLLING_INTERVAL_MS;
+ // Adjust the polling interval to be smaller than the keepalive delay to preserve
+ // some time for the system to restart the keepalive.
+ final int timer = ki.mKi.getKeepaliveIntervalSec() * 1000 - ADJUST_TCP_POLLING_DELAY_MS;
+ if (timer < MIN_INTERVAL_SEC) {
+ Log.wtf(TAG, "Unreasonably low keepalive delay: " + ki.mKi.getKeepaliveIntervalSec());
+ }
+ return useLowTimer ? LOW_TCP_POLLING_INTERVAL_MS : Math.max(timer, MIN_INTERVAL_SEC);
}
/**
@@ -786,5 +794,14 @@
return DeviceConfigUtils.isFeatureEnabled(mContext, NAMESPACE_TETHERING, name,
defaultEnabled);
}
+
+ /**
+ * Returns milliseconds since boot, including time spent in sleep.
+ *
+ * @return elapsed milliseconds since boot.
+ */
+ public long getElapsedRealtime() {
+ return SystemClock.elapsedRealtime();
+ }
}
}
diff --git a/service/src/com/android/server/connectivity/KeepaliveTracker.java b/service/src/com/android/server/connectivity/KeepaliveTracker.java
index 06294db..60485b3 100644
--- a/service/src/com/android/server/connectivity/KeepaliveTracker.java
+++ b/service/src/com/android/server/connectivity/KeepaliveTracker.java
@@ -264,6 +264,10 @@
return mSlot;
}
+ int getKeepaliveIntervalSec() {
+ return mInterval;
+ }
+
private int checkNetworkConnected() {
if (!mNai.networkInfo.isConnectedOrConnecting()) {
return ERROR_INVALID_NETWORK;
diff --git a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java
index 2e79182..37dc7a0 100644
--- a/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java
+++ b/tests/cts/hostside/app2/src/com/android/cts/net/hostside/app2/Common.java
@@ -99,7 +99,8 @@
}
case TYPE_COMPONENT_EXPEDITED_JOB: {
final int capabilities = activityManager.getUidProcessCapabilities(Process.myUid());
- if ((capabilities & ActivityManager.PROCESS_CAPABILITY_NETWORK) == 0) {
+ if ((capabilities
+ & ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) == 0) {
observer.onNetworkStateChecked(
INetworkStateObserver.RESULT_ERROR_UNEXPECTED_CAPABILITIES,
"Unexpected capabilities: " + capabilities);
diff --git a/tests/integration/Android.bp b/tests/integration/Android.bp
index e3d80a0..12919ae 100644
--- a/tests/integration/Android.bp
+++ b/tests/integration/Android.bp
@@ -21,7 +21,10 @@
android_test {
name: "FrameworksNetIntegrationTests",
- defaults: ["framework-connectivity-internal-test-defaults"],
+ defaults: [
+ "framework-connectivity-internal-test-defaults",
+ "NetworkStackApiShimSettingsForCurrentBranch",
+ ],
platform_apis: true,
certificate: "platform",
srcs: [
@@ -33,6 +36,13 @@
"ServiceConnectivityResources",
],
static_libs: [
+ // It does not matter if NetworkStackApiStableLib or NetworkStackApiCurrentLib is used here,
+ // since the shims for the branch are already included via
+ // NetworkStackApiShimSettingsForCurrentBranch, and will be used in priority as they are
+ // first in the classpath.
+ // If the wrong shims are used for some reason, tests that use newer APIs fail.
+ // TODO: have NetworkStackApiStableLib link dynamically against the shims to remove this
+ // order-dependent setup.
"NetworkStackApiStableLib",
"androidx.test.ext.junit",
"frameworks-net-integration-testutils",
diff --git a/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java b/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java
index 4f0b9c4..696eff4 100644
--- a/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java
+++ b/tests/unit/java/com/android/server/connectivity/AutomaticOnOffKeepaliveTrackerTest.java
@@ -28,8 +28,8 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.longThat;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -57,6 +57,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.SystemClock;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
@@ -94,6 +95,7 @@
private static final int NETID_MASK = 0xffff;
private static final int TIMEOUT_MS = 30_000;
private static final int MOCK_RESOURCE_ID = 5;
+ private static final int TEST_KEEPALIVE_INTERVAL_SEC = 10;
private AutomaticOnOffKeepaliveTracker mAOOKeepaliveTracker;
private HandlerThread mHandlerThread;
@@ -334,9 +336,13 @@
final KeepalivePacketData kpd = new NattKeepalivePacketData(srcAddress, srcPort,
dstAddress, dstPort, new byte[] {1});
final KeepaliveInfo ki = mKeepaliveTracker.new KeepaliveInfo(cb, nai, kpd,
- 10 /* interval */, KeepaliveInfo.TYPE_NATT, fd);
+ TEST_KEEPALIVE_INTERVAL_SEC, KeepaliveInfo.TYPE_NATT, fd);
mKeepaliveTracker.setReturnedKeepaliveInfo(ki);
+ // Mock elapsed real time to verify the alarm timer.
+ final long time = SystemClock.elapsedRealtime();
+ doReturn(time).when(mDependencies).getElapsedRealtime();
+
mAOOKeepaliveTracker.startNattKeepalive(nai, fd, 10 /* intervalSeconds */, cb,
srcAddress.toString(), srcPort, dstAddress.toString(), dstPort,
true /* automaticOnOffKeepalives */, underpinnedNetwork);
@@ -344,8 +350,11 @@
final ArgumentCaptor<AlarmManager.OnAlarmListener> listenerCaptor =
ArgumentCaptor.forClass(AlarmManager.OnAlarmListener.class);
- verify(mAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
- any(), listenerCaptor.capture(), eq(mTestHandler));
+ // The alarm timer should be smaller than the keepalive delay. Verify the alarm trigger time
+ // is higher than base time but smaller than the keepalive delay.
+ verify(mAlarmManager).setExact(eq(AlarmManager.ELAPSED_REALTIME),
+ longThat(t -> t > time + 1000L && t < time + TEST_KEEPALIVE_INTERVAL_SEC * 1000L),
+ any() /* tag */, listenerCaptor.capture(), eq(mTestHandler));
final AlarmManager.OnAlarmListener listener = listenerCaptor.getValue();
// For realism, the listener should be posted on the handler
diff --git a/tests/unit/java/com/android/server/connectivity/VpnTest.java b/tests/unit/java/com/android/server/connectivity/VpnTest.java
index 79987e6..dd9177ee 100644
--- a/tests/unit/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/unit/java/com/android/server/connectivity/VpnTest.java
@@ -48,6 +48,7 @@
import static com.android.net.module.util.NetworkStackConstants.IPV6_MIN_MTU;
import static com.android.server.connectivity.Vpn.AUTOMATIC_KEEPALIVE_DELAY_SECONDS;
+import static com.android.server.connectivity.Vpn.DEFAULT_LONG_LIVED_TCP_CONNS_EXPENSIVE_TIMEOUT_SEC;
import static com.android.server.connectivity.Vpn.DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT;
import static com.android.server.connectivity.Vpn.PREFERRED_IKE_PROTOCOL_AUTO;
import static com.android.server.connectivity.Vpn.PREFERRED_IKE_PROTOCOL_IPV4_UDP;
@@ -1860,6 +1861,13 @@
private PlatformVpnSnapshot verifySetupPlatformVpn(VpnProfile vpnProfile,
IkeSessionConfiguration ikeConfig, boolean mtuSupportsIpv6) throws Exception {
+ return verifySetupPlatformVpn(vpnProfile, ikeConfig, mtuSupportsIpv6,
+ false /* areLongLivedTcpConnectionsExpensive */);
+ }
+
+ private PlatformVpnSnapshot verifySetupPlatformVpn(VpnProfile vpnProfile,
+ IkeSessionConfiguration ikeConfig, boolean mtuSupportsIpv6,
+ boolean areLongLivedTcpConnectionsExpensive) throws Exception {
if (!mtuSupportsIpv6) {
doReturn(IPV6_MIN_MTU - 1).when(mTestDeps).calculateVpnMtu(any(), anyInt(), anyInt(),
anyBoolean());
@@ -1942,8 +1950,10 @@
// Check if allowBypass is set or not.
assertTrue(nacCaptor.getValue().isBypassableVpn());
- assertTrue(((VpnTransportInfo) ncCaptor.getValue().getTransportInfo()).isBypassable());
-
+ final VpnTransportInfo info = (VpnTransportInfo) ncCaptor.getValue().getTransportInfo();
+ assertTrue(info.isBypassable());
+ assertEquals(areLongLivedTcpConnectionsExpensive,
+ info.areLongLivedTcpConnectionsExpensive());
return new PlatformVpnSnapshot(vpn, nwCb, ikeCb, childCb);
}
@@ -2069,7 +2079,8 @@
final PlatformVpnSnapshot vpnSnapShot =
verifySetupPlatformVpn(profile,
createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */),
- false /* mtuSupportsIpv6 */);
+ false /* mtuSupportsIpv6 */,
+ expectedKeepalive < DEFAULT_LONG_LIVED_TCP_CONNS_EXPENSIVE_TIMEOUT_SEC);
// Simulate a new network coming up
vpnSnapShot.nwCb.onAvailable(TEST_NETWORK_2);
verify(mIkeSessionWrapper, never()).setNetwork(any(), anyInt(), anyInt(), anyInt());
@@ -2116,7 +2127,9 @@
PREFERRED_IKE_PROTOCOL_IPV4_UDP,
AUTOMATIC_KEEPALIVE_DELAY_SECONDS /* expectedKeepaliveTimer */,
ESP_IP_VERSION_AUTO /* expectedIpVersion */,
- ESP_ENCAP_TYPE_AUTO /* expectedEncapType */);
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ false /* expectedReadFromCarrierConfig*/,
+ true /* areLongLivedTcpConnectionsExpensive */);
}
@Test
@@ -2126,7 +2139,9 @@
PREFERRED_IKE_PROTOCOL_IPV4_UDP,
AUTOMATIC_KEEPALIVE_DELAY_SECONDS /* expectedKeepaliveTimer */,
ESP_IP_VERSION_AUTO /* expectedIpVersion */,
- ESP_ENCAP_TYPE_AUTO /* expectedEncapType */);
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ false /* expectedReadFromCarrierConfig*/,
+ true /* areLongLivedTcpConnectionsExpensive */);
}
@Test
@@ -2136,7 +2151,9 @@
PREFERRED_IKE_PROTOCOL_AUTO,
TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
ESP_IP_VERSION_AUTO /* expectedIpVersion */,
- ESP_ENCAP_TYPE_AUTO /* expectedEncapType */);
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
}
@Test
@@ -2150,7 +2167,9 @@
PREFERRED_IKE_PROTOCOL_IPV4_UDP,
AUTOMATIC_KEEPALIVE_DELAY_SECONDS /* expectedKeepaliveTimer */,
ESP_IP_VERSION_AUTO /* expectedIpVersion */,
- ESP_ENCAP_TYPE_AUTO /* expectedEncapType */);
+ ESP_ENCAP_TYPE_AUTO /* expectedEncapType */,
+ false /* expectedReadFromCarrierConfig*/,
+ true /* areLongLivedTcpConnectionsExpensive */);
}
@Test
@@ -2160,7 +2179,9 @@
PREFERRED_IKE_PROTOCOL_IPV4_UDP,
TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
ESP_IP_VERSION_IPV4 /* expectedIpVersion */,
- ESP_ENCAP_TYPE_UDP /* expectedEncapType */);
+ ESP_ENCAP_TYPE_UDP /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
}
@Test
@@ -2170,7 +2191,9 @@
PREFERRED_IKE_PROTOCOL_IPV6_ESP,
TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
ESP_IP_VERSION_IPV6 /* expectedIpVersion */,
- ESP_ENCAP_TYPE_NONE /* expectedEncapType */);
+ ESP_ENCAP_TYPE_NONE /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
}
@Test
@@ -2180,7 +2203,9 @@
PREFERRED_IKE_PROTOCOL_IPV6_UDP,
TEST_KEEPALIVE_TIMER /* expectedKeepaliveTimer */,
ESP_IP_VERSION_IPV6 /* expectedIpVersion */,
- ESP_ENCAP_TYPE_UDP /* expectedEncapType */);
+ ESP_ENCAP_TYPE_UDP /* expectedEncapType */,
+ true /* expectedReadFromCarrierConfig*/,
+ false /* areLongLivedTcpConnectionsExpensive */);
}
private NetworkCapabilities createTestCellNc() {
@@ -2193,7 +2218,9 @@
}
private void doTestReadCarrierConfig(NetworkCapabilities nc, int simState, int preferredIpProto,
- int expectedKeepaliveTimer, int expectedIpVersion, int expectedEncapType)
+ int expectedKeepaliveTimer, int expectedIpVersion, int expectedEncapType,
+ boolean expectedReadFromCarrierConfig,
+ boolean areLongLivedTcpConnectionsExpensive)
throws Exception {
final Ikev2VpnProfile ikeProfile =
new Ikev2VpnProfile.Builder(TEST_VPN_SERVER, TEST_VPN_IDENTITY)
@@ -2206,7 +2233,8 @@
final PlatformVpnSnapshot vpnSnapShot =
verifySetupPlatformVpn(ikeProfile.toVpnProfile(),
createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */),
- false /* mtuSupportsIpv6 */);
+ false /* mtuSupportsIpv6 */,
+ true /* areLongLivedTcpConnectionsExpensive */);
final CarrierConfigManager.CarrierConfigChangeListener listener =
getCarrierConfigListener();
@@ -2221,15 +2249,31 @@
vpnSnapShot.nwCb.onCapabilitiesChanged(TEST_NETWORK_2, nc);
verify(mIkeSessionWrapper).setNetwork(TEST_NETWORK_2,
expectedIpVersion, expectedEncapType, expectedKeepaliveTimer);
+ if (expectedReadFromCarrierConfig) {
+ final ArgumentCaptor<NetworkCapabilities> ncCaptor =
+ ArgumentCaptor.forClass(NetworkCapabilities.class);
+ verify(mMockNetworkAgent).doSendNetworkCapabilities(ncCaptor.capture());
+
+ final VpnTransportInfo info =
+ (VpnTransportInfo) ncCaptor.getValue().getTransportInfo();
+ assertEquals(areLongLivedTcpConnectionsExpensive,
+ info.areLongLivedTcpConnectionsExpensive());
+ } else {
+ verify(mMockNetworkAgent, never()).doSendNetworkCapabilities(any());
+ }
reset(mExecutor);
reset(mIkeSessionWrapper);
+ reset(mMockNetworkAgent);
// Trigger carrier config change
listener.onCarrierConfigChanged(1 /* logicalSlotIndex */, TEST_SUB_ID,
-1 /* carrierId */, -1 /* specificCarrierId */);
verify(mIkeSessionWrapper).setNetwork(TEST_NETWORK_2,
expectedIpVersion, expectedEncapType, expectedKeepaliveTimer);
+ // Expect no NetworkCapabilities change.
+ // Call to doSendNetworkCapabilities() will not be triggered.
+ verify(mMockNetworkAgent, never()).doSendNetworkCapabilities(any());
}
@Test
diff --git a/tools/gen_jarjar.py b/tools/gen_jarjar.py
index eb686ce..5129128 100755
--- a/tools/gen_jarjar.py
+++ b/tools/gen_jarjar.py
@@ -120,9 +120,11 @@
_get_toplevel_class(clazz) not in excluded_classes and
not any(r.fullmatch(clazz) for r in exclude_regexes)):
outfile.write(f'rule {clazz} {args.prefix}.@0\n')
- # Also include jarjar rules for unit tests of the class, so the package matches
- outfile.write(f'rule {clazz}Test {args.prefix}.@0\n')
- outfile.write(f'rule {clazz}Test$* {args.prefix}.@0\n')
+ # Also include jarjar rules for unit tests of the class if it's not explicitly
+ # excluded, so the package matches
+ if not any(r.fullmatch(clazz + 'Test') for r in exclude_regexes):
+ outfile.write(f'rule {clazz}Test {args.prefix}.@0\n')
+ outfile.write(f'rule {clazz}Test$* {args.prefix}.@0\n')
def _main():
diff --git a/tools/gn2bp/Android.bp.swp b/tools/gn2bp/Android.bp.swp
index 163f8b6..21482d9 100644
--- a/tools/gn2bp/Android.bp.swp
+++ b/tools/gn2bp/Android.bp.swp
@@ -14,8 +14,6 @@
//
// This file is automatically generated by gen_android_bp. Do not edit.
-soong_namespace {}
-
build = ["Android.extras.bp"]
// The actual license can be found in Android.extras.bp
@@ -23,6 +21,9 @@
default_applicable_licenses: [
"external_cronet_license",
],
+ default_visibility: [
+ ":__subpackages__",
+ ],
}
// GN: //components/cronet/android:cronet_api_java
@@ -54,6 +55,9 @@
"components/cronet/android/api/src/android/net/http/UrlRequest.java",
"components/cronet/android/api/src/android/net/http/UrlResponseInfo.java",
],
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
}
// GN: //base/allocator:buildflags
@@ -991,7 +995,6 @@
"base/allocator/dispatcher/dispatcher.cc",
"base/allocator/dispatcher/internal/dispatch_data.cc",
"base/allocator/dispatcher/reentry_guard.cc",
- "base/allocator/partition_allocator/shim/allocator_shim.cc",
"base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
"base/android/android_hardware_buffer_compat.cc",
"base/android/android_image_reader_compat.cc",
@@ -1563,6 +1566,11 @@
"-Wl,-wrap,vasprintf",
],
target: {
+ android: {
+ srcs: [
+ "base/allocator/partition_allocator/shim/allocator_shim.cc",
+ ],
+ },
android_arm: {
srcs: [
"base/android/reached_code_profiler.cc",
@@ -1602,6 +1610,11 @@
"-msse3",
],
},
+ glibc: {
+ srcs: [
+ "base/allocator/partition_allocator/shim/allocator_shim.cc",
+ ],
+ },
},
}
@@ -1662,7 +1675,6 @@
"base/allocator/dispatcher/dispatcher.cc",
"base/allocator/dispatcher/internal/dispatch_data.cc",
"base/allocator/dispatcher/reentry_guard.cc",
- "base/allocator/partition_allocator/shim/allocator_shim.cc",
"base/at_exit.cc",
"base/barrier_closure.cc",
"base/base64.cc",
@@ -2131,6 +2143,9 @@
],
target: {
android: {
+ srcs: [
+ "base/allocator/partition_allocator/shim/allocator_shim.cc",
+ ],
shared_libs: [
"libandroid",
"liblog",
@@ -2611,9 +2626,14 @@
"-Wl,-wrap,vasprintf",
],
},
+ glibc: {
+ srcs: [
+ "base/allocator/partition_allocator/shim/allocator_shim.cc",
+ "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc",
+ ],
+ },
host: {
srcs: [
- "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc",
"base/base_paths_posix.cc",
"base/debug/stack_trace_posix.cc",
"base/files/file_util_linux.cc",
@@ -6556,6 +6576,9 @@
"-Wl,-wrap,vasprintf",
],
stem: "libcronet.108.0.5359.128",
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
target: {
android_arm: {
cflags: [
@@ -8274,6 +8297,9 @@
"-Wl,-wrap,vasprintf",
],
stem: "libcronet_tests",
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
target: {
android_arm: {
cflags: [
@@ -8549,6 +8575,9 @@
"-Wl,-wrap,vasprintf",
],
stem: "libcronet_unittests_android__library",
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
target: {
android_arm: {
cflags: [
@@ -11183,6 +11212,9 @@
"-Aorg.chromium.chrome.skipGenJni",
"-Apackage_prefix=android.net.http.internal",
],
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
}
// GN: //gn:java
@@ -11460,6 +11492,9 @@
javacflags: [
"-Aorg.chromium.chrome.skipGenJni",
],
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
}
// GN: //base/android/jni_generator:jni_processor
@@ -16147,6 +16182,9 @@
"-Wl,-wrap,vasprintf",
],
stem: "libnet_unittests__library",
+ visibility: [
+ "//packages/modules/Connectivity:__subpackages__",
+ ],
target: {
android_arm: {
cflags: [
diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp
index 075ed58..0f12cf3 100755
--- a/tools/gn2bp/gen_android_bp
+++ b/tools/gn2bp/gen_android_bp
@@ -294,6 +294,12 @@
# Name of cronet api target
java_api_target_name = "//components/cronet/android:cronet_api_java"
+# Visibility set for package default
+package_default_visibility = ":__subpackages__"
+
+# Visibility set for modules used from Connectivity
+connectivity_visibility = "//packages/modules/Connectivity:__subpackages__"
+
# ----------------------------------------------------------------------------
# End of configuration.
# ----------------------------------------------------------------------------
@@ -445,6 +451,7 @@
self.target['android_arm'] = Target('android_arm')
self.target['android_arm64'] = Target('android_arm64')
self.target['host'] = Target('host')
+ self.target['glibc'] = Target('glibc')
self.stl = None
self.cpp_std = None
self.dist = dict()
@@ -478,6 +485,8 @@
self.javacflags = set()
self.c_std = None
self.default_applicable_licenses = set()
+ self.default_visibility = []
+ self.visibility = []
def to_string(self, output):
if self.comment:
@@ -536,6 +545,8 @@
self._output_field(output, 'javacflags')
self._output_field(output, 'c_std')
self._output_field(output, 'default_applicable_licenses')
+ self._output_field(output, 'default_visibility')
+ self._output_field(output, 'visibility')
if self.rtti:
self._output_field(output, 'rtti')
@@ -1725,6 +1736,7 @@
module.srcs.add(':' + create_action_module(blueprint, target, 'java_genrule', is_test_target).name)
preprocessor_module = create_java_jni_preprocessor(blueprint)
module.plugins.add(preprocessor_module.name)
+ module.visibility.append(connectivity_visibility)
blueprint.add_module(module)
return module
@@ -1740,6 +1752,7 @@
':' + create_action_module(blueprint, gn.get_target(dep), 'java_genrule', False).name
for dep in get_api_java_actions(gn)])
blueprint.add_module(source_module)
+ source_module.visibility.append(connectivity_visibility)
return source_module
def update_jni_registration_module(module, gn):
@@ -1748,6 +1761,28 @@
for source in get_non_api_java_sources(gn)
if source.endswith('.java')])
+
+def turn_off_allocator_shim_for_musl(module):
+ allocation_shim = "base/allocator/partition_allocator/shim/allocator_shim.cc"
+ allocator_shim_files = {
+ allocation_shim,
+ "base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc",
+ }
+ module.srcs -= allocator_shim_files
+ for arch in module.target.values():
+ arch.srcs -= allocator_shim_files
+ module.target['android'].srcs.add(allocation_shim)
+ if gn_utils.TESTING_SUFFIX in module.name:
+ # allocator_shim_default_dispatch_to_glibc is only added to the __testing version of base
+ # since base_base__testing is compiled for host. When compiling for host. Soong compiles
+ # using glibc or musl(experimental). We currently only support compiling for glibc.
+ module.target['glibc'].srcs.update(allocator_shim_files)
+ else:
+ # allocator_shim_default_dispatch_to_glibc does not exist in the prod version of base
+ # `base_base` since this only compiles for android and bionic is used. Bionic is the equivalent
+ # of glibc but for android.
+ module.target['glibc'].srcs.add(allocation_shim)
+
def create_blueprint_for_targets(gn, targets, test_targets):
"""Generate a blueprint for a list of GN targets."""
blueprint = Blueprint()
@@ -1794,10 +1829,14 @@
blueprint.add_module(defaults)
for target in targets:
- create_modules_from_target(blueprint, gn, target, is_test_target=False)
+ module = create_modules_from_target(blueprint, gn, target, is_test_target=False)
+ if module:
+ module.visibility.append(connectivity_visibility)
for test_target in test_targets:
- create_modules_from_target(blueprint, gn, test_target + gn_utils.TESTING_SUFFIX, is_test_target=True)
+ module = create_modules_from_target(blueprint, gn, test_target + gn_utils.TESTING_SUFFIX, is_test_target=True)
+ if module:
+ module.visibility.append(connectivity_visibility)
create_java_api_module(blueprint, gn)
java_module = create_java_module(blueprint, gn, is_test_target=False)
@@ -1807,6 +1846,8 @@
for module in blueprint.modules.values():
if 'cronet_jni_registration' in module.name:
update_jni_registration_module(module, gn)
+ if module.name in ['cronet_aml_base_base', 'cronet_aml_base_base' + gn_utils.TESTING_SUFFIX]:
+ turn_off_allocator_shim_for_musl(module)
# Merge in additional hardcoded arguments.
for module in blueprint.modules.values():
@@ -1828,11 +1869,12 @@
return blueprint
-def create_default_license_module(blueprint):
- default_license = Module("package", "", "PACKAGE")
- default_license.comment = "The actual license can be found in Android.extras.bp"
- default_license.default_applicable_licenses.add(CRONET_LICENSE_NAME)
- blueprint.add_module(default_license)
+def create_package_module(blueprint):
+ package = Module("package", "", "PACKAGE")
+ package.comment = "The actual license can be found in Android.extras.bp"
+ package.default_applicable_licenses.add(CRONET_LICENSE_NAME)
+ package.default_visibility.append(package_default_visibility)
+ blueprint.add_module(package)
def main():
parser = argparse.ArgumentParser(
@@ -1886,7 +1928,7 @@
# Add any proto groups to the blueprint.
for l_name, t_names in proto_groups.items():
create_proto_group_modules(blueprint, gn, l_name, t_names)
- create_default_license_module(blueprint)
+ create_package_module(blueprint)
output = [
"""// Copyright (C) 2022 The Android Open Source Project
//
@@ -1904,8 +1946,6 @@
//
// This file is automatically generated by %s. Do not edit.
-soong_namespace {}
-
build = ["Android.extras.bp"]
""" % (tool_name)
]