From 560da938dd8b1063faee429241e48880bcb4dbad Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Fri, 2 Apr 2021 06:38:46 +0000 Subject: [PATCH] Reduce framework-connectivity footprint Cleanup framework-connectivity to reduce its memory and storage usage: - Build libframework-connectivity-jni using standard C and removing dependencies on libc++. This saves about 100kB of storage (40+60kB on the 32+64 bit variants). - Remove dependency on protobuffer libraries, as their usage has been removed. This saves about 15kB of storage. From local measurements, the reduced code size also improves memory usage. This also removes a jarjar workaround for net-utils-device-common, as the library is no longer used either. Bug: 184111895 Test: device boots, connectivity working Change-Id: Ibfbd0fe1098293812ae24812621752a7a44f9130 --- framework/Android.bp | 59 +++---------------- framework/jarjar-rules-proto.txt | 3 - framework/jarjar-rules.txt | 9 --- framework/jni/android_net_NetworkUtils.cpp | 50 +++++++--------- framework/src/android/net/NetworkRequest.java | 19 ------ 5 files changed, 29 insertions(+), 111 deletions(-) delete mode 100644 framework/jarjar-rules-proto.txt diff --git a/framework/Android.bp b/framework/Android.bp index 74cecdd351..88c174865c 100644 --- a/framework/Android.bp +++ b/framework/Android.bp @@ -23,26 +23,6 @@ package { default_applicable_licenses: ["frameworks_base_license"], } -java_library { - name: "framework-connectivity-protos", - sdk_version: "module_current", - min_sdk_version: "30", - proto: { - type: "nano", - }, - srcs: [ - // TODO: consider moving relevant .proto files directly to the module directory - ":framework-javastream-protos", - ], - apex_available: [ - "com.android.tethering", - ], - jarjar_rules: "jarjar-rules-proto.txt", - visibility: [ - "//visibility:private", - ], -} - filegroup { name: "framework-connectivity-internal-sources", srcs: [ @@ -109,9 +89,6 @@ java_sdk_library { libs: [ "unsupportedappusage", ], - static_libs: [ - "framework-connectivity-protos", - ], jarjar_rules: "jarjar-rules.txt", permitted_packages: ["android.net"], impl_library_visibility: [ @@ -128,8 +105,9 @@ java_sdk_library { ], } -cc_defaults { - name: "libframework-connectivity-defaults", +cc_library_shared { + name: "libframework-connectivity-jni", + min_sdk_version: "30", cflags: [ "-Wall", "-Werror", @@ -140,38 +118,19 @@ cc_defaults { "-Wno-unguarded-availability", "-Wthread-safety", ], + srcs: [ + "jni/android_net_NetworkUtils.cpp", + "jni/onload.cpp", + ], shared_libs: [ + "libandroid", "liblog", "libnativehelper", ], header_libs: [ "dnsproxyd_protocol_headers", ], -} - -cc_library_static { - name: "libconnectivityframeworkutils", - defaults: ["libframework-connectivity-defaults"], - srcs: [ - "jni/android_net_NetworkUtils.cpp", - ], - shared_libs: ["libandroid_net"], - apex_available: [ - "//apex_available:platform", - "com.android.tethering", - ], -} - -cc_library_shared { - name: "libframework-connectivity-jni", - min_sdk_version: "30", - defaults: ["libframework-connectivity-defaults"], - srcs: [ - "jni/android_net_NetworkUtils.cpp", - "jni/onload.cpp", - ], - shared_libs: ["libandroid"], - stl: "libc++_static", + stl: "none", apex_available: [ "com.android.tethering", ], diff --git a/framework/jarjar-rules-proto.txt b/framework/jarjar-rules-proto.txt deleted file mode 100644 index 37b4dec1c3..0000000000 --- a/framework/jarjar-rules-proto.txt +++ /dev/null @@ -1,3 +0,0 @@ -keep android.net.NetworkCapabilitiesProto -keep android.net.NetworkProto -keep android.net.NetworkRequestProto diff --git a/framework/jarjar-rules.txt b/framework/jarjar-rules.txt index 7474c246a2..2e5848cb10 100644 --- a/framework/jarjar-rules.txt +++ b/framework/jarjar-rules.txt @@ -1,11 +1,2 @@ rule com.android.net.module.util.** android.net.connectivity.framework.util.@1 rule android.net.NetworkFactory* android.net.connectivity.framework.NetworkFactory@1 - -# TODO (b/149403767): remove the annotations from net-utils-device-common instead of here -zap android.annotation.** -zap com.android.net.module.annotation.** -zap com.android.internal.annotations.** - -rule android.net.NetworkCapabilitiesProto* android.net.connectivity.proto.NetworkCapabilitiesProto@1 -rule android.net.NetworkProto* android.net.connectivity.proto.NetworkProto@1 -rule android.net.NetworkRequestProto* android.net.connectivity.proto.NetworkRequestProto@1 diff --git a/framework/jni/android_net_NetworkUtils.cpp b/framework/jni/android_net_NetworkUtils.cpp index e8bb42df6a..9bf910b46a 100644 --- a/framework/jni/android_net_NetworkUtils.cpp +++ b/framework/jni/android_net_NetworkUtils.cpp @@ -16,34 +16,19 @@ #define LOG_TAG "NetworkUtils" -#include - #include #include -#include #include -#include #include -#include -#include -#include -#include +#include +#include #include // NETID_USE_LOCAL_NAMESERVERS -#include -#include #include -#include #include -#include #include "jni.h" -extern "C" { -int ifc_enable(const char *ifname); -int ifc_disable(const char *ifname); -} - #define NETUTILS_PKG_NAME "android/net/NetworkUtils" namespace android { @@ -52,6 +37,9 @@ constexpr int MAXPACKETSIZE = 8 * 1024; // FrameworkListener limits the size of commands to 4096 bytes. constexpr int MAXCMDSIZE = 4096; +static volatile jclass class_Network = 0; +static volatile jmethodID method_fromNetworkHandle = 0; + static inline jclass FindClassOrDie(JNIEnv* env, const char* class_name) { jclass clazz = env->FindClass(class_name); LOG_ALWAYS_FATAL_IF(clazz == NULL, "Unable to find class %s", class_name); @@ -138,11 +126,11 @@ static jobject android_net_utils_resNetworkQuery(JNIEnv *env, jobject thiz, jlon // Only allow dname which could be simply formatted to UTF8. // In native layer, res_mkquery would re-format the input char array to packet. - std::vector queryname(byteCountUTF8 + 1, 0); + char queryname[byteCountUTF8 + 1]; + memset(queryname, 0, (byteCountUTF8 + 1) * sizeof(char)); - env->GetStringUTFRegion(dname, 0, javaCharsCount, queryname.data()); - - int fd = android_res_nquery(netHandle, queryname.data(), ns_class, ns_type, flags); + env->GetStringUTFRegion(dname, 0, javaCharsCount, queryname); + int fd = android_res_nquery(netHandle, queryname, ns_class, ns_type, flags); if (fd < 0) { jniThrowErrnoException(env, "resNetworkQuery", -fd); @@ -170,9 +158,9 @@ static jobject android_net_utils_resNetworkSend(JNIEnv *env, jobject thiz, jlong static jobject android_net_utils_resNetworkResult(JNIEnv *env, jobject thiz, jobject javaFd) { int fd = AFileDescriptor_getFD(env, javaFd); int rcode; - std::vector buf(MAXPACKETSIZE, 0); + uint8_t buf[MAXPACKETSIZE] = {0}; - int res = android_res_nresult(fd, &rcode, buf.data(), MAXPACKETSIZE); + int res = android_res_nresult(fd, &rcode, buf, MAXPACKETSIZE); jniSetFileDescriptorOfFD(env, javaFd, -1); if (res < 0) { jniThrowErrnoException(env, "resNetworkResult", -res); @@ -184,8 +172,7 @@ static jobject android_net_utils_resNetworkResult(JNIEnv *env, jobject thiz, job jniThrowErrnoException(env, "resNetworkResult", ENOMEM); return nullptr; } else { - env->SetByteArrayRegion(answer, 0, res, - reinterpret_cast(buf.data())); + env->SetByteArrayRegion(answer, 0, res, reinterpret_cast(buf)); } jclass class_DnsResponse = env->FindClass("android/net/DnsResolver$DnsResponse"); @@ -207,11 +194,14 @@ static jobject android_net_utils_getDnsNetwork(JNIEnv *env, jobject thiz) { return nullptr; } - static jclass class_Network = MakeGlobalRefOrDie( - env, FindClassOrDie(env, "android/net/Network")); - static jmethodID method = env->GetStaticMethodID(class_Network, "fromNetworkHandle", - "(J)Landroid/net/Network;"); - return env->CallStaticObjectMethod(class_Network, method, static_cast(dnsNetHandle)); + if (method_fromNetworkHandle == 0) { + // This may be called multiple times concurrently but that is fine + class_Network = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/net/Network")); + method_fromNetworkHandle = env->GetStaticMethodID(class_Network, "fromNetworkHandle", + "(J)Landroid/net/Network;"); + } + return env->CallStaticObjectMethod(class_Network, method_fromNetworkHandle, + static_cast(dnsNetHandle)); } static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, jobject javaFd) { diff --git a/framework/src/android/net/NetworkRequest.java b/framework/src/android/net/NetworkRequest.java index 5313f08fff..88cbf5c5ea 100644 --- a/framework/src/android/net/NetworkRequest.java +++ b/framework/src/android/net/NetworkRequest.java @@ -655,25 +655,6 @@ public class NetworkRequest implements Parcelable { ", " + networkCapabilities.toString() + " ]"; } - private int typeToProtoEnum(Type t) { - switch (t) { - case NONE: - return NetworkRequestProto.TYPE_NONE; - case LISTEN: - return NetworkRequestProto.TYPE_LISTEN; - case TRACK_DEFAULT: - return NetworkRequestProto.TYPE_TRACK_DEFAULT; - case REQUEST: - return NetworkRequestProto.TYPE_REQUEST; - case BACKGROUND_REQUEST: - return NetworkRequestProto.TYPE_BACKGROUND_REQUEST; - case TRACK_SYSTEM_DEFAULT: - return NetworkRequestProto.TYPE_TRACK_SYSTEM_DEFAULT; - default: - return NetworkRequestProto.TYPE_UNKNOWN; - } - } - public boolean equals(@Nullable Object obj) { if (obj instanceof NetworkRequest == false) return false; NetworkRequest that = (NetworkRequest)obj;