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
This commit is contained in:
Remi NGUYEN VAN
2021-04-02 06:38:46 +00:00
parent 764b73691d
commit 560da938dd
5 changed files with 29 additions and 111 deletions

View File

@@ -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",
],

View File

@@ -1,3 +0,0 @@
keep android.net.NetworkCapabilitiesProto
keep android.net.NetworkProto
keep android.net.NetworkRequestProto

View File

@@ -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

View File

@@ -16,34 +16,19 @@
#define LOG_TAG "NetworkUtils"
#include <vector>
#include <android/file_descriptor_jni.h>
#include <android/multinetwork.h>
#include <arpa/inet.h>
#include <linux/filter.h>
#include <linux/if_arp.h>
#include <linux/tcp.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <netinet/in.h>
#include <string.h>
#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
#include <cutils/properties.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/JNIPlatformHelp.h>
#include <nativehelper/ScopedLocalRef.h>
#include <utils/Log.h>
#include <utils/misc.h>
#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<char> 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<uint8_t> 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<jbyte*>(buf.data()));
env->SetByteArrayRegion(answer, 0, res, reinterpret_cast<jbyte*>(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<jlong>(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<jlong>(dnsNetHandle));
}
static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, jobject javaFd) {

View File

@@ -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;