android so 符号表
时间: 2023-08-07 22:05:56 浏览: 369
Android系统的符号表是指在编译Android源代码时,生成的一个包含函数、变量、类等符号信息的静态库文件。这个符号表可以帮助我们在调试Android系统的过程中,快速定位到具体的函数或变量,以便于排查问题。
在Android系统中,符号表一般存放在/system/lib目录下,文件名为libc.so或libandroid_runtime.so等。我们可以使用ndk中的nm命令来查看符号表,例如:
```
$ ndk-nm -C /system/lib/libc.so | grep memcpy
00019c38 T memcpy
00019c38 T __memcpy_chk
```
这里我以查找memcpy函数为例,可以看到libc.so中有两个符号表中的memcpy函数,一个是普通的memcpy函数,另一个是带有安全检查的__memcpy_chk函数。通过这些符号信息,我们可以快速定位到具体的函数实现,从而更好地进行调试和排查问题。
相关问题
Android 打包符号表方式
Android应用程序的符号表是在编译时生成的,可以通过以下方式将符号表打包到APK中:
1. 在module的build.gradle文件中,添加以下配置:
```
android {
// ...
buildTypes {
debug {
// 打包符号表
debuggable true
// 不开启ProGuard
minifyEnabled false
// 不开启R8
useProguard false
// 指定符号表文件的输出路径
ndk {
debugSymbolPath file("$buildDir/intermediates/ndk/debugSymbol")
}
// 指定符号表的名称,必须为lib<module_name>.so.debug
ndk {
debugSymbolName "lib${moduleName}.so.debug"
}
// 指定符号表文件的输出目录
applicationVariants.all { variant ->
variant.getPackageApplication().getOutputDirectory().each { output ->
if (output.getName().endsWith('.apk')) {
output.mkdirs()
copy {
from file("$buildDir/intermediates/ndk/debugSymbol")
into file("${output.parent}/symbols/${variant.buildType.name}")
}
}
}
}
}
}
}
```
其中,debuggable设置为true表示打包符号表,minifyEnabled和useProguard设置为false表示不开启ProGuard和R8,debugSymbolPath和debugSymbolName用于指定符号表文件的输出路径和名称,applicationVariants中的代码用于将符号表文件打包到APK中。
2. 在Android Studio的Terminal中,使用以下命令打包APK:
```
./gradlew assembleDebug
```
3. 编译完成后,在APK的输出目录中可以找到生成的APK文件和符号表文件,例如:
```
app/build/outputs/apk/debug/app-debug.apk
app/build/outputs/apk/debug/symbols/debug/libapp.so.debug
```
其中,libapp.so.debug就是生成的符号表文件。
需要注意的是,符号表文件中包含敏感信息,需要妥善保管。另外,在发布正式版本时不建议打包符号表,可以通过上传ProGuard或R8的mapping文件来定位问题。
Android studio生成符号表
Android Studio可以通过NDK来生成符号表,具体步骤如下:
1. 在module的build.gradle文件中,添加以下配置:
```
android {
defaultConfig {
ndk {
// 设置需要生成符号表的ABI类型,多个类型用逗号分隔
abiFilters 'armeabi-v7a', 'arm64-v8a'
// 设置生成的符号表文件的输出路径
debugSymbolPath file("$buildDir/intermediates/ndk/debugSymbol")
}
}
}
```
其中,abiFilters指定需要生成符号表的ABI类型,debugSymbolPath指定符号表文件的输出路径。
2. 在Android Studio的Terminal中,使用以下命令生成符号表:
```
./gradlew assembleDebug --info
```
其中,assembleDebug表示编译debug版本,--info选项用于输出详细的编译信息。
3. 编译完成后,在指定的输出路径中可以找到生成的符号表文件,例如:
```
app/build/intermediates/ndk/debugSymbol/armeabi-v7a/libnative-lib.so.debug
```
其中,libnative-lib.so.debug就是生成的符号表文件。
需要注意的是,生成符号表会增加APK的大小,建议只在调试时使用。另外,符号表文件中包含敏感信息,需要妥善保管。
阅读全文