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:
@@ -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",
|
||||
],
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
keep android.net.NetworkCapabilitiesProto
|
||||
keep android.net.NetworkProto
|
||||
keep android.net.NetworkRequestProto
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user