DlIteratePhdrEnhance是一个Android中用于增加原生dl_iterate_phdr()
方法的库。
- 使用c语言实现。
- 支持和统一从Android 4.0-15所有版本的
dl_iterate_phdr()
能力。 dl_iterate_phdr()
统一返回pathname。dl_iterate_phdr()
调用前都加上锁。dl_iterate_phdr()
回调的当前进程dlpi_name,都改为system/bin/app_process(64)
完整路径。dl_iterate_phdrd()
的回调中都将包含Linker本身。
https://juejin.cn/post/7469439971366338612
你可以参考示例。
//settings.gradle.kts
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url = URI("https://jitpack.io") }
}
}
//build.gradle.kts
android{
buildFeatures {
//1、声明可以进行原生依赖,具体参考https://developer.android.com/build/native-dependencies
prefab = true
}
}
dependencies {
//2、依赖最新版本
implementation("com.github.835127729:DlIteratePhdrEnhance:1.0.0")
}
...
find_package(dl_iterate_phdr_enhance REQUIRED CONFIG)
...
target_link_libraries(${CMAKE_PROJECT_NAME}
# List libraries link to the target library
dl_iterate_phdr_enhance::dl_iterate_phdr_enhance
)
如果你是在一个 SDK 工程里使用 DlIteratePhdrEnhance,你可能需要避免把libdl_iterate_phdr_enhance.so
打包到你的 AAR 里,以免 app 工程打包时遇到重复的 libdl_iterate_phdr_enhance.so
文件。
android {
packagingOptions {
excludes += listOf(
"**/libmaps_visitor.so",
"**/libdl_iterate_phdr_enhance.so",
)
}
}
另一方面, 如果你是在一个 APP 工程里使用 DlIteratePhdrEnhance,你可以需要增加一些选项,用来处理重复的 libdl_iterate_phdr_enhance.so
文件引起的冲突。
android {
packagingOptions {
pickFirsts += listOf(
"**/libmaps_visitor.so",
"**/libdl_iterate_phdr_enhance.so",
)
}
}
#include "dl_iterate_phdr_enhance.h"
dl_iterate_phdr_enhance([](struct dl_phdr_info *info, size_t size, void *data) {
LOGD(TAG, "info->dlpi_name: %s", info->dlpi_name);
LOGD(TAG, "info->dlpi_phdr: %p", info->dlpi_phdr);
LOGD(TAG, "info->dlpi_phnum: %d", info->dlpi_phnum);
return 0;
}, nullptr);
MapsVisitor 使用 MIT 许可证 授权。