Skip to content

Commit 1361e50

Browse files
committed
desperate attempts to reduce size as much as i can
1 parent 84a9dc0 commit 1361e50

File tree

4 files changed

+15
-73
lines changed

4 files changed

+15
-73
lines changed

app/src/main/cpp/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ add_library(${CMAKE_PROJECT_NAME} SHARED
3535
# build script, prebuilt third-party libraries, or Android system libraries.
3636
target_link_libraries(${CMAKE_PROJECT_NAME}
3737
# List libraries link to the target library
38-
android
3938
log)
4039

41-
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE -Wl,-rpath=/system/lib64)
40+
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -fvisibility=hidden -Os -fno-exceptions -fwrapv -fomit-frame-pointer -fno-unroll-loops -Xclang -fmerge-functions -Oz)

app/src/main/cpp/android_linker_ns.cpp

+1-38
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,6 @@ static bool lib_loaded;
2323
bool linkernsbypass_load_status() {
2424
return lib_loaded;
2525
}
26-
27-
struct android_namespace_t *android_create_namespace(const char *name,
28-
const char *ld_library_path,
29-
const char *default_library_path,
30-
uint64_t type,
31-
const char *permitted_when_isolated_path,
32-
android_namespace_t *parent_namespace) {
33-
auto caller{__builtin_return_address(0)};
34-
return loader_android_create_namespace(name, ld_library_path, default_library_path, type,
35-
permitted_when_isolated_path, parent_namespace, caller);
36-
}
37-
3826
struct android_namespace_t *android_create_namespace_escape(const char *name,
3927
const char *ld_library_path,
4028
const char *default_library_path,
@@ -46,19 +34,6 @@ struct android_namespace_t *android_create_namespace_escape(const char *name,
4634
permitted_when_isolated_path, parent_namespace, caller);
4735
}
4836

49-
android_get_exported_namespace_t android_get_exported_namespace;
50-
51-
android_link_namespaces_all_libs_t android_link_namespaces_all_libs;
52-
53-
android_link_namespaces_t android_link_namespaces;
54-
55-
bool linkernsbypass_link_namespace_to_default_all_libs(android_namespace_t *to) {
56-
// Creating a shared namespace with the default parent will give a copy of the default namespace that we can actually access
57-
// This is needed since there is no way to access a direct handle to the default namespace as it's not exported
58-
static auto defaultNs{android_create_namespace_escape("default_copy", nullptr, nullptr, ANDROID_NAMESPACE_TYPE_SHARED, nullptr, nullptr)};
59-
return android_link_namespaces_all_libs(to, defaultNs);
60-
}
61-
6237
void *linkernsbypass_namespace_dlopen(const char *filename, int flags, android_namespace_t *ns) {
6338
android_dlextinfo extInfo{
6439
.flags = ANDROID_DLEXT_USE_NAMESPACE,
@@ -95,7 +70,7 @@ __attribute__((constructor)) static void resolve_linker_symbols() {
9570
};
9671
static_assert(sizeof(BranchLinked) == 4, "BranchLinked is wrong size");
9772

98-
// Some devices ship with --X mapping for exexecutables so work around that
73+
// Some devices ship with --X mapping for executables so work around that
9974
mprotect(align_ptr(reinterpret_cast<void *>(&dlopen)), getpagesize(), PROT_WRITE | PROT_READ | PROT_EXEC);
10075

10176
// dlopen is just a wrapper for __loader_dlopen that passes the return address as the third arg hence we can just walk it to find __loader_dlopen
@@ -114,14 +89,6 @@ __attribute__((constructor)) static void resolve_linker_symbols() {
11489
if (!ldHandle)
11590
return;
11691

117-
android_link_namespaces_all_libs = reinterpret_cast<android_link_namespaces_all_libs_t>(dlsym(ldHandle, "__loader_android_link_namespaces_all_libs"));
118-
if (!android_link_namespaces_all_libs)
119-
return;
120-
121-
android_link_namespaces = reinterpret_cast<android_link_namespaces_t>(dlsym(ldHandle, "__loader_android_link_namespaces"));
122-
if (!android_link_namespaces)
123-
return;
124-
12592
auto libdlAndroidHandle{loader_dlopen("libdl_android.so", RTLD_LAZY, reinterpret_cast<void *>(&dlopen))};
12693
if (!libdlAndroidHandle)
12794
return;
@@ -130,10 +97,6 @@ __attribute__((constructor)) static void resolve_linker_symbols() {
13097
if (!loader_android_create_namespace)
13198
return;
13299

133-
android_get_exported_namespace = reinterpret_cast<android_get_exported_namespace_t>(dlsym(libdlAndroidHandle, "__loader_android_get_exported_namespace"));
134-
if (!android_get_exported_namespace)
135-
return;
136-
137100
// Lib is now safe to use
138101
lib_loaded = true;
139102
}

app/src/main/cpp/android_linker_ns.h

-30
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@ extern "C" {
1111

1212
// https://cs.android.com/android/platform/superproject/+/0a492a4685377d41fef2b12e9af4ebfa6feef9c2:art/libnativeloader/include/nativeloader/dlext_namespaces.h;l=25;bpv=1;bpt=1
1313
enum {
14-
ANDROID_NAMESPACE_TYPE_REGULAR = 0,
15-
ANDROID_NAMESPACE_TYPE_ISOLATED = 1,
1614
ANDROID_NAMESPACE_TYPE_SHARED = 2,
17-
ANDROID_NAMESPACE_TYPE_EXEMPT_LIST_ENABLED = 0x08000000,
18-
ANDROID_NAMESPACE_TYPE_ALSO_USED_AS_ANONYMOUS = 0x10000000,
19-
ANDROID_NAMESPACE_TYPE_SHARED_ISOLATED = ANDROID_NAMESPACE_TYPE_SHARED | ANDROID_NAMESPACE_TYPE_ISOLATED,
2015
};
2116

2217
/**
@@ -26,38 +21,13 @@ enum {
2621
*/
2722
bool linkernsbypass_load_status();
2823

29-
// https://cs.android.com/android/platform/superproject/+/0a492a4685377d41fef2b12e9af4ebfa6feef9c2:art/libnativeloader/include/nativeloader/dlext_namespaces.h;l=86;bpv=1;bpt=1
30-
struct android_namespace_t *android_create_namespace(const char *name,
31-
const char *ld_library_path,
32-
const char *default_library_path,
33-
uint64_t type,
34-
const char *permitted_when_isolated_path,
35-
struct android_namespace_t *parent_namespace);
36-
3724
struct android_namespace_t *android_create_namespace_escape(const char *name,
3825
const char *ld_library_path,
3926
const char *default_library_path,
4027
uint64_t type,
4128
const char *permitted_when_isolated_path,
4229
struct android_namespace_t *parent_namespace);
4330

44-
// https://cs.android.com/android/platform/superproject/+/dcb01ef31026b3b8aeb72dada3370af63fe66bbd:bionic/linker/linker.cpp;l=3554
45-
typedef struct android_namespace_t *(*android_get_exported_namespace_t)(const char *);
46-
extern android_get_exported_namespace_t android_get_exported_namespace;
47-
48-
// https://cs.android.com/android/platform/superproject/+/dcb01ef31026b3b8aeb72dada3370af63fe66bbd:bionic/linker/linker.cpp;l=2499
49-
typedef bool (*android_link_namespaces_all_libs_t)(struct android_namespace_t *, struct android_namespace_t *);
50-
extern android_link_namespaces_all_libs_t android_link_namespaces_all_libs;
51-
52-
// https://cs.android.com/android/platform/superproject/+/dcb01ef31026b3b8aeb72dada3370af63fe66bbd:bionic/linker/linker.cpp;l=2473
53-
typedef bool (*android_link_namespaces_t)(struct android_namespace_t *, struct android_namespace_t *, const char *);
54-
extern android_link_namespaces_t android_link_namespaces;
55-
56-
/**
57-
* @brief Like android_link_namespaces_all_libs but links from the default namespace
58-
*/
59-
bool linkernsbypass_link_namespace_to_default_all_libs(struct android_namespace_t *to);
60-
6131
/**
6232
* @brief Loads a library into a namespace
6333
* @note IMPORTANT: If `filename` is compiled with the '-z global' linker flag and RTLD_GLOBAL is supplied in `flags` the library will be added to the namespace's LD_PRELOAD list

app/src/main/cpp/gramophone.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extern "C" {
99
}
1010
#include <aaudio/AAudio.h>
1111

12+
static bool init_done = false;
1213
static void* handle = nullptr;
1314
static void* handle2 = nullptr;
1415
typedef uint32_t(*ZNK7android10AudioTrack16getHalSampleRateEv_t)(void*);
@@ -21,6 +22,8 @@ typedef aaudio_format_t(*AAudioConvert_androidToAAudioDataFormat_t)(audio_format
2122
static AAudioConvert_androidToAAudioDataFormat_t AAudioConvert_androidToAAudioDataFormat = nullptr;
2223

2324
bool initLib() {
25+
if (init_done)
26+
return true;
2427
if (android_get_device_api_level() < 28) {
2528
if (!handle) {
2629
handle = dlopen("libaudioclient.so", RTLD_GLOBAL);
@@ -38,29 +41,36 @@ bool initLib() {
3841
return false;
3942
}
4043
}
44+
init_done = true;
4145
return true;
4246
}
4347
if (!linkernsbypass_load_status()) {
4448
__android_log_print(ANDROID_LOG_ERROR, "AudioTrackHalInfo(JNI)", "linker namespace bypass init failed");
4549
return false;
4650
}
47-
static auto defaultNs{android_create_namespace_escape("default_copy", nullptr, nullptr, ANDROID_NAMESPACE_TYPE_SHARED, nullptr, nullptr)};
51+
android_namespace_t* ns = nullptr;
4852
if (!handle) {
49-
handle = linkernsbypass_namespace_dlopen("libaudioclient.so", RTLD_GLOBAL, defaultNs);
53+
ns = android_create_namespace_escape("default_copy", nullptr, nullptr,
54+
ANDROID_NAMESPACE_TYPE_SHARED, nullptr, nullptr);
55+
handle = linkernsbypass_namespace_dlopen("libaudioclient.so", RTLD_GLOBAL, ns);
5056
if (handle == nullptr) {
5157
__android_log_print(ANDROID_LOG_ERROR, "AudioTrackHalInfo(JNI)",
5258
"dlopen returned nullptr for libaudioclient.so: %s", dlerror());
5359
return false;
5460
}
5561
}
5662
if (!handle2) {
57-
handle2 = linkernsbypass_namespace_dlopen("libaaudio.so", RTLD_GLOBAL, defaultNs);
63+
if (!ns)
64+
ns = android_create_namespace_escape("default_copy", nullptr,
65+
nullptr, ANDROID_NAMESPACE_TYPE_SHARED, nullptr, nullptr);
66+
handle2 = linkernsbypass_namespace_dlopen("libaaudio.so", RTLD_GLOBAL, ns);
5867
if (handle2 == nullptr) {
5968
__android_log_print(ANDROID_LOG_ERROR, "AudioTrackHalInfo(JNI)",
6069
"dlopen returned nullptr for libaaudio.so: %s", dlerror());
6170
return false;
6271
}
6372
}
73+
init_done = true;
6474
return true;
6575
}
6676

0 commit comments

Comments
 (0)