Compile NetworkStackApiStable as system_29
Also slightly change the structure of shims so that the compat version
uses a different package (com.android.networkstack.apishim.api29),
which is jarjared to the main package name on API stable builds. On API
current builds, the shim falls back to the compat version if
Build.VERSION is older, or uses the main package otherwise.
Jarjar requires using a java_library instead of a filegroup, so the
shims build targets are converted to java_libraries.
This allows the API current build to be usable on older devices, since
it will automatically fall back to the compat APIs. When the new SDK is
finalized, the API current build can then be shipped without code
modification.
The code also looks better in IDEs as there are no package conflicts.
If there are several versions of the same shim depending on the API
level (so different implementations for different methods in
SocketUtilsShimImpl depending on the API level), having the shim extend
the previous version shim allows to add methods with compatibility
behavior without re-implementing the whole class.
Test: m NetworkStack NetworkStackApiStable
Test: flashed, WiFi working
Test: atest NetworkStackTests
Change-Id: I86f28912b80b8396d6b9b2acd2e247651ba80289
diff --git a/Android.bp b/Android.bp
index f17412d..27a1044 100644
--- a/Android.bp
+++ b/Android.bp
@@ -19,20 +19,26 @@
// (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
+// / \
+// +NetworkStackApiStableShims --> / \ <-- +NetworkStackApiCurrentShims
+// +NetworkStackApiStableLevel / \ +NetworkStackApiCurrentLevel
+// +jarjar apistub.api[latest].* / \ +module src/
+// to apistub.* / \
+// / \
+// NetworkStackApiStableDependencies \
+// / \ android libs w/ all code
+// +module src/ --> / \ (also used in unit tests)
+// / \ |
+// NetworkStackApiStableLib NetworkStackApiCurrentLib <--*
+// | |
+// | <-- +NetworkStackAppDefaults --> |
+// | (APK build params) |
+// | |
+// | <-- +NetworkStackApiStableLevel | <-- +NetworkStackApiCurrentLevel
+// | |
+// | |
+// NetworkStackApiStable NetworkStack, InProcessNetworkStack, <-- APKs
+// TestNetworkStack
// Common defaults to define SDK level
java_defaults {
@@ -43,22 +49,29 @@
java_defaults {
name: "NetworkStackApiStableLevel",
- sdk_version: "system_current", // TODO: change to system_29
+ sdk_version: "system_29",
min_sdk_version: "28",
}
-// Java libraries for the API shims
+// Filegroups for the API shims
filegroup {
name: "NetworkStackApiCurrentShims",
srcs: [
- "apishim/current/**/*.java"
+ "apishim/common/**/*.java",
+ "apishim/29/**/*.java",
+ "apishim/current/**/*.java",
+ ":net-module-utils-srcs",
],
}
+// API stable shims only include the compat package, but it is jarjared to replace the non-compat
+// package
filegroup {
name: "NetworkStackApiStableShims",
srcs: [
- "apishim/29/**/*.java"
+ "apishim/common/**/*.java",
+ "apishim/29/**/*.java",
+ ":net-module-utils-srcs",
],
}
@@ -67,7 +80,6 @@
java_defaults {
name: "NetworkStackAndroidLibraryDefaults",
srcs: [
- "src/**/*.java",
":framework-networkstack-shared-srcs",
":services-networkstack-shared-srcs",
":statslog-networkstack-java-gen",
@@ -80,25 +92,38 @@
"networkstackprotosnano",
"captiveportal-lib",
],
- manifest: "AndroidManifestBase.xml",
plugins: ["java_api_finder"],
}
// The versions of the android library containing network stack code compiled for each SDK variant
+// API current uses the sources of the API current shims directly.
+// This allows API current code to be treated identically to code in src/ (it will be moved
+// there eventually), and to use the compat shim as fallback on older devices.
android_library {
name: "NetworkStackApiCurrentLib",
defaults: ["NetworkStackApiCurrentLevel", "NetworkStackAndroidLibraryDefaults"],
- srcs: [
- ":NetworkStackApiCurrentShims",
- ],
+ srcs: [":NetworkStackApiCurrentShims", "src/**/*.java"],
+ manifest: "AndroidManifestBase.xml",
+}
+
+// For API stable, first build the dependencies using jarjar compat rules, then build the sources
+// linking with the dependencies.
+java_library {
+ name: "NetworkStackApiStableDependencies",
+ defaults: ["NetworkStackApiStableLevel", "NetworkStackAndroidLibraryDefaults"],
+ srcs: [":NetworkStackApiStableShims"],
+ jarjar_rules: "apishim/jarjar-rules-compat.txt",
}
android_library {
name: "NetworkStackApiStableLib",
- defaults: ["NetworkStackApiStableLevel", "NetworkStackAndroidLibraryDefaults"],
- srcs: [
- ":NetworkStackApiStableShims",
+ defaults: ["NetworkStackApiStableLevel"],
+ srcs: [":framework-annotations", "src/**/*.java"],
+ // API stable uses a jarjared version of the shims
+ static_libs: [
+ "NetworkStackApiStableDependencies",
],
+ manifest: "AndroidManifestBase.xml",
}
// Common defaults for compiling the actual APK, based on the NetworkStackApiXBase android libraries
diff --git a/apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/SocketUtilsShimImpl.java
similarity index 70%
rename from apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java
rename to apishim/29/com/android/networkstack/apishim/api29/SocketUtilsShimImpl.java
index 0e41e19..be12662 100644
--- a/apishim/29/com/android/networkstack/apishim/SocketUtilsShimImpl.java
+++ b/apishim/29/com/android/networkstack/apishim/api29/SocketUtilsShimImpl.java
@@ -14,18 +14,32 @@
* limitations under the License.
*/
-package com.android.networkstack.apishim;
+package com.android.networkstack.apishim.api29;
import android.net.util.SocketUtils;
import androidx.annotation.NonNull;
+import com.android.networkstack.apishim.SocketUtilsShim;
+
import java.net.SocketAddress;
/**
* Implementation of SocketUtilsShim for API 29.
*/
public class SocketUtilsShimImpl implements SocketUtilsShim {
+ protected SocketUtilsShimImpl() {}
+
+ /**
+ * Get a new instance of {@link SocketUtilsShim}.
+ *
+ * Use com.android.networkstack.apishim.SocketUtilsShim#newInstance()
+ * (non-API29 version) instead, to use the correct shims depending on build SDK.
+ */
+ public static SocketUtilsShim newInstance() {
+ return new SocketUtilsShimImpl();
+ }
+
@NonNull
@Override
public SocketAddress makePacketSocketAddress(
diff --git a/apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java b/apishim/30/com/android/networkstack/apishim/SocketUtilsShimImpl.java
similarity index 68%
rename from apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java
rename to apishim/30/com/android/networkstack/apishim/SocketUtilsShimImpl.java
index 92f8438..9516e7c 100644
--- a/apishim/current/com/android/networkstack/apishim/SocketUtilsShimImpl.java
+++ b/apishim/30/com/android/networkstack/apishim/SocketUtilsShimImpl.java
@@ -17,6 +17,7 @@
package com.android.networkstack.apishim;
import android.net.util.SocketUtils;
+import android.os.Build;
import androidx.annotation.NonNull;
@@ -25,7 +26,20 @@
/**
* Implementation of {@link SocketUtilsShim} for API 30.
*/
-public class SocketUtilsShimImpl implements SocketUtilsShim {
+public class SocketUtilsShimImpl
+ extends com.android.networkstack.apishim.api29.SocketUtilsShimImpl {
+ protected SocketUtilsShimImpl() {}
+
+ /**
+ * Get a new instance of {@link SocketUtilsShim}.
+ */
+ public static SocketUtilsShim newInstance() {
+ if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) {
+ return com.android.networkstack.apishim.api29.SocketUtilsShimImpl.newInstance();
+ }
+ return new SocketUtilsShimImpl();
+ }
+
@NonNull
@Override
public SocketAddress makePacketSocketAddress(
diff --git a/apishim/common/com/android/networkstack/apishim/ShimUtils.java b/apishim/common/com/android/networkstack/apishim/ShimUtils.java
new file mode 100644
index 0000000..e9b5305
--- /dev/null
+++ b/apishim/common/com/android/networkstack/apishim/ShimUtils.java
@@ -0,0 +1,45 @@
+/*
+ * 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.os.Build;
+
+/**
+ * Utility class for API shims.
+ */
+public final class ShimUtils {
+ /**
+ * Check whether the device release or development API level is strictly higher than the passed
+ * in level.
+ *
+ * On a development build (codename != REL), the device will have the same API level as the
+ * last stable release, even though some additional APIs may be available. In this method the
+ * device API level is considered to be higher if the device supports a stable SDK with a higher
+ * version number, or if the device supports a development version of a SDK that has a higher
+ * version number.
+ *
+ * @return True if the device supports an SDK that has or will have a higher version number,
+ * even if still in development.
+ */
+ public static boolean isReleaseOrDevelopmentApiAbove(int apiLevel) {
+ // In-development API n+1 will have SDK_INT == n and CODENAME != REL.
+ // Stable API n has SDK_INT == n and CODENAME == REL.
+ final int devApiLevel = Build.VERSION.SDK_INT
+ + ("REL".equals(Build.VERSION.CODENAME) ? 0 : 1);
+ return devApiLevel > apiLevel;
+ }
+}
diff --git a/src/com/android/networkstack/apishim/SocketUtilsShim.java b/apishim/common/com/android/networkstack/apishim/SocketUtilsShim.java
similarity index 72%
rename from src/com/android/networkstack/apishim/SocketUtilsShim.java
rename to apishim/common/com/android/networkstack/apishim/SocketUtilsShim.java
index 34b5f40..33cb5f8 100644
--- a/src/com/android/networkstack/apishim/SocketUtilsShim.java
+++ b/apishim/common/com/android/networkstack/apishim/SocketUtilsShim.java
@@ -30,18 +30,6 @@
*/
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
diff --git a/apishim/jarjar-rules-compat.txt b/apishim/jarjar-rules-compat.txt
new file mode 100644
index 0000000..3e54c12
--- /dev/null
+++ b/apishim/jarjar-rules-compat.txt
@@ -0,0 +1,7 @@
+# jarjar rules to use on API stable builds.
+# Use the latest stable apishim package as the main apishim package, to replace and avoid building
+# the unstable, non-compatibility shims.
+# Once API 30 is stable, apishim/30/com.android.networkstack.apishim should be moved to the
+# com.android.networkstack.apishim.api30 package, a new apishim/31/com.android.networkstack.apishim
+# package should be created, and this rule should reference api30.
+rule com.android.networkstack.apishim.api29.** com.android.networkstack.apishim.@1
\ No newline at end of file
diff --git a/common/moduleutils/Android.bp b/common/moduleutils/Android.bp
new file mode 100644
index 0000000..6117149
--- /dev/null
+++ b/common/moduleutils/Android.bp
@@ -0,0 +1,21 @@
+//
+// 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.
+//
+
+// Shared utility sources to be used by multiple network modules
+filegroup {
+ name: "net-module-utils-srcs",
+ srcs: ["src/**/*.java"],
+}
\ No newline at end of file
diff --git a/src/android/net/util/SharedLog.java b/common/moduleutils/src/android/net/util/SharedLog.java
similarity index 100%
rename from src/android/net/util/SharedLog.java
rename to common/moduleutils/src/android/net/util/SharedLog.java