安卓link.cpp中将自己so文件加入白名单
时间: 2023-07-25 21:07:14 浏览: 86
Link.cpp
在安卓系统中,为了保证应用程序的安全性,系统会限制应用程序的行为,特别是对于一些敏感操作,例如加载动态链接库(so文件)的操作。
为了允许应用程序加载自己的so文件,需要将自己的so文件加入到系统的白名单中。具体步骤如下:
1. 在应用程序的Android.mk中指定so库的名称和路径,例如:
```
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := lib/mylib.so
```
2. 在应用程序的AndroidManifest.xml中添加以下权限:
```
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```
3. 在应用程序中调用以下代码:
```
#include <unistd.h>
#include <sys/auxv.h>
const char *kLdPaths[] = {
"/system/lib",
"/system/vendor/lib",
"/system/vendor/lib64",
NULL
};
void AddMySoToLdLibraryPath() {
char ldpaths[1024];
size_t size = 0;
// 获取当前的LD_LIBRARY_PATH环境变量
const char* ld_library_path = getenv("LD_LIBRARY_PATH");
// 拼接新的LD_LIBRARY_PATH环境变量,将自己的so库路径加入
for (size_t i = 0; kLdPaths[i]; ++i) {
size += snprintf(ldpaths + size, sizeof(ldpaths) - size,
"%s%s", kLdPaths[i], ":");
}
size += snprintf(ldpaths + size, sizeof(ldpaths) - size,
"%s/lib/", getenv("ANDROID_ROOT"));
if (ld_library_path != nullptr) {
size += snprintf(ldpaths + size, sizeof(ldpaths) - size,
":%s", ld_library_path);
}
// 设置LD_LIBRARY_PATH环境变量
setenv("LD_LIBRARY_PATH", ldpaths, 1);
// 加载自己的so库
void* handle = dlopen("libmylib.so", RTLD_NOW | RTLD_GLOBAL);
// 恢复原来的LD_LIBRARY_PATH环境变量
setenv("LD_LIBRARY_PATH", ld_library_path ? ld_library_path : "", 1);
}
```
在应用程序启动时调用AddMySoToLdLibraryPath()函数即可将自己的so文件加入到系统的白名单中。
阅读全文