Android P Asan使用总结

这篇博客总结了在Android P上使用Address Sanitizer(Asan)进行内存错误检测的经验,包括对所有应用、单个应用、bin文件以及shared library的测试步骤,通过设置环境变量和编译选项,使得在非法指针操作时应用能够崩溃并提供堆栈信息,有助于定位内存问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考官网的指导针对use after free的场景使用asan在P上做了测试,现在总结放在这里。以后至少在user space踩内存的问题没那么怕了。

https://source.android.com/devices/tech/debug/asan?tdsourcetag=s_pctim_aiomsg

1.all app
①frameworks/base/cmds/app_process仓
Android.mk添加LOCAL_SANITIZE:=address
②system/core/rootdir仓
init.zygote(32|64).rc里面添加
setenv LD_LIBRARY_PATH /system/lib/asan:/system/lib
setenv ASAN_OPTIONS
allow_user_segv_handler=true

编译大包,执行非法指针操作应用会崩溃并打印堆栈,参考日志见asan_app.txt

2.single app
常规版本即可
①关闭selinux
setenforce 0
②设置wrap prop
setprop com.droidlogic.inputmethod.remote asanwrapper
执行非法指针操作应用会崩溃并打印堆栈,参考日志见asan_single_app.txt

3.bin
①使用CLang编译
LOCAL_CLANG:=true
②将 LOCAL_SANITIZE:=address 添加到可执行文件的编译规则中
LOCAL_SANITIZE:=address
执行非法指针操作应用会崩溃并打印堆栈,参考日志见asan_bin.txt
这边两次释放指针和内存泄漏都没有检测,free after use检测出来了。

4.shared library
①使用共享库的二进制文件也要使用asan编译
②使用asan编译共享库,并且在system(vendor)/lib/asan下面
LOCAL_SANITIZE:=address
LOCAL_MODULE_RELATIVE_PATH := asan
③设置环境变量
export LD_LIBRARY_PATH=/system/lib/asan
如果是系统服务二进制文件,可以在init.rc文件里面添加setenv LD_LIBRARY_PATH /system/lib/asan,
然后执行二进制文件即可以检测。如果要看是不是依赖asan路径下面的库,可以移除这个库看一下。
参考日志asan_sharedlib.txt

--------- beginning of main
11-12 11:46:36.799  3009  3130 D WificondControl: Scan result ready event
11-12 11:46:36.800  3009  3030 I EthernetTracker: interfaceLinkStateChanged, iface: wlan0, up: true
11-12 11:46:36.931  3009  3019 I system_server: Background concurrent copying GC freed 17553(813KB) AllocSpace objects, 9(380KB) LOS objects, 19% free, 4MB/5MB, paused 168us total 121.166ms
11-12 11:46:37.489  3879  3879 D         : test main
11-12 11:46:37.490  3879  3879 D TEST    : test begin1
11-12 11:46:37.490  3879  3879 D TEST    : double free
11-12 11:46:37.490  3879  3879 I         : =================================================================
11-12 11:46:37.490  3879  3879 I         : 
11-12 11:46:37.491  3879  3879 I         : 
11-12 11:46:37.491  3879  3879 I         : ==3879==ERROR: AddressSanitizer: heap-use-after-free on address 0xb0400750 at pc 0xb2137eac bp 0xbee839c8 sp 0xbee839c4
11-12 11:46:37.491  3879  3879 I         : 
11-12 11:46:37.491  3879  3879 I         : 
11-12 11:46:37.492  3879  3879 I         : READ of size 4 at 0xb0400750 thread T0
11-12 11:46:37.492  3879  3879 I         : 
11-12 11:46:37.500  3879  3879 I         :     #0 0xb2137eab  (/vendor/lib/asan/libtest.so+0xeab)
11-12 11:46:37.500  3879  3879 I         : 
11-12 11:46:37.500  3879  3879 I         :     #1 0xb20d3f55  (/system/lib/libc.so+0x88f55)
11-12 11:46:37.500  3879  3879 I         : 
11-12 11:46:37.501  3879  3879 I         :     #2 0x8dfeac65  (/vendor/bin/test+0xc65)
11-12 11:46:37.501  3879  3879 I         : 
11-12 11:46:37.501  3879  3879 I chatty  : uid=0(root) identical 1 line
11-12 11:46:37.501  3879  3879 I         : 
11-12 11:46:37.501  3879  3879 I         : 0xb0400750 is located 0 bytes inside of 8-byte region [0xb0400750,0xb0400758)
11-12 11:46:37.501  3879  3879 I         : 
11-12 11:46:37.502  3879  3879 I         : freed by thread T0 here:
11-12 11:46:37.502  3879  3879 I         : 
11-12 11:46:37.502  3879  3879 I         :     #0 0xb1a33e03  (/system/lib/libclang_rt.asan-arm-android.so+0xafe03)
11-12 11:46:37.502  3879  3879 I         : 
11-12 11:46:37.503  3879  3879 I         :     #1 0xb2137e27  (/vendor/lib/asan/libtest.so+0xe27)
11-12 11:46:37.503  3879  3879 I         : 
11-12 11:46:37.503  3879  3879 I chatty  : uid=0(root) identical 1 line
11-12 11:46:37.503  3879  3879 I         : 
11-12 11:46:37.503  3879  3879 I         : previously allocated by thread T0 here:
11-12 11:46:37.503  3879  3879 I         : 
11-12 11:46:37.504  3879  3879 I         :     #0 0xb1a3414b  (/system/lib/libclang_rt.asan-arm-android.so+0xb014b)
11-12 11:46:37.504  3879  3879 I         : 
11-12 11:46:37.504  3879  3879 I         :     #1 0xb2137e1f  (/vendor/lib/asan/libtest.so+0xe1f)
11-12 11:46:37.504  3879  3879 I         : 
11-12 11:46:37.505  3879  3879 I chatty  : uid=0(root) identical 1 line
11-12 11:46:37.505  3879  3879 I         : 
11-12 11:46:37.505  3879  3879 I         : SUMMARY: AddressSanitizer: heap-use-after-free (/vendor/lib/asan/libtest.so+0xeab) 
11-12 11:46:37.505  3879  3879 I         : 
11-12 11:46:37.507  3879  3879 I         : Shadow bytes around the buggy address:
11-12 11:46:37.507  3879  3879 I         :   0xa7a00090: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a000a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a000b0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a000c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a000d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         : =>0xa7a000e0: fa fa fa fa fa fa fa fa fa fa[fd]fa fa fa 05 fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a000f0: fa fa 04 fa fa fa 04 fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a00100: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a00110: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a00120: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         :   0xa7a00130: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
11-12 11:46:37.507  3879  3879 I         : Shadow byte legend (one shadow byte represents 8 application bytes):
11-12 11:46:37.507  3879  3879 I         :   Addressable:           00
11-12 11:46:37.507  3879  3879 I         :   Partially addressable: 01 02 03 04 05 06 07 
11-12 11:46:37.507  3879  3879 I         :   Heap left redzone:       fa
11-12 11:46:37.507  3879  3879 I         :   Freed heap region:       fd
11-12 11:46:37.507  3879  3879 I         :   Stack left redzone:      f1
11-12 11:46:37.507  3879  3879 I         :   Stack mid redzone:       f2
11-12 11:46:37.507  3879  3879 I         :   Stack right redzone:     f3
11-12 11:46:37.507  3879  3879 I         :   Stack after return:      f5
11-12 11:46:37.507  3879  3879 I         :   Stack use after scope:   f8
11-12 11:46:37.507  3879  3879 I         :   Global redzone:          f9
11-12 11:46:37.507  3879  3879 I         :   Global init order:       f6
11-12 11:46:37.507  3879  3879 I         :   Poisoned by user:        f7
11-12 11:46:37.507  3879  3879 I         :   Container overflow:      fc
11-12 11:46:37.507  3879  3879 I         :   Array cookie:            ac
11-12 11:46:37.507  3879  3879 I         :   Intra object redzone:    bb
11-12 11:46:37.507  3879  3879 I         :   ASan internal:           fe
11-12 11:46:37.507  3879  3879 I         :   Left alloca redzone:     ca
11-12 11:46:37.507  3879  3879 I         :   Right alloca redzone:    cb
11-12 11:46:37.507  3879  3879 I         : 
11-12 11:46:37.508  3879  3879 I         : ==3879==ABORTING
11-12 11:46:37.508  3879  3879 I         : 
--------- beginning of crash
11-12 11:46:37.508  3879  3879 F libc    : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 3879 (test), pid 3879 (test)
11-12 11:46:37.539  3882  3882 I crash_dump32: obtaining output fd from tombstoned, type: kDebuggerdTombstone
11-12 11:46:37.540  2968  2968 I /system/bin/tombstoned: received crash request for pid 3879
11-12 11:46:37.540  3882  3882 I crash_dump32: performing dump of process 3879 (target tid = 3879)
11-12 11:46:37.543  3882  3882 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-12 11:46:37.543  3882  3882 F DEBUG   : Build fingerprint: 'Droidlogic/ampere/ampere:9/PI/20181109:userdebug/test-keys'
11-12 11:46:37.543  3882  3882 F DEBUG   : Revision: '0'
11-12 11:46:37.543  3882  3882 F DEBUG   : ABI: 'arm'
11-12 11:46:37.543  3882  3882 F DEBUG   : pid: 3879, tid: 3879, name: test  >>> vendor/bin/test <<<
11-12 11:46:37.543  3882  3882 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
11-12 11:46:37.543  3882  3882 F DEBUG   : Abort message too long: claimed length = 2209
11-12 11:46:37.543  3882  3882 F DEBUG   :     r0  00000000  r1  00000f27  r2  00000006  r3  b20e1918
11-12 11:46:37.543  3882  3882 F DEBUG   :     r4  00000f27  r5  00000f27  r6  bee82efc  r7  0000010c
11-12 11:46:37.543  3882  3882 F DEBUG   :     r8  00000001  r9  bee839c8  r10 00000000  r11 bee839a8
11-12 11:46:37.543  3882  3882 F DEBUG   :     ip  b1eb86a0  sp  bee82ee8  lr  b20700e5  pc  b2067e72
11-12 11:46:37.553  3882  3882 F DEBUG   : 
11-12 11:46:37.553  3882  3882 F DEBUG   : backtrace:
11-12 11:46:37.553  3882  3882 F DEBUG   :     #00 pc 0001ce72  /system/lib/libc.so (abort+62)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #01 pc 0002ed8c  /system/lib/libclang_rt.asan-arm-android.so (__sanitizer::Abort()+68)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #02 pc 0002c0b4  /system/lib/libclang_rt.asan-arm-android.so (__sanitizer::Die()+180)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #03 pc 000b63d4  /system/lib/libclang_rt.asan-arm-android.so (__asan::ScopedInErrorReport::~ScopedInErrorReport()+352)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #04 pc 000b58d4  /system/lib/libclang_rt.asan-arm-android.so (__asan::ReportGenericError(unsigned long, unsigned long, unsigned long, unsigned long, bool, unsigned long, unsigned int, bool)+396)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #05 pc 000b6820  /system/lib/libclang_rt.asan-arm-android.so (__asan_report_load4+52)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #06 pc 00000ea8  /vendor/lib/asan/libtest.so (doTest()+212)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #07 pc 00088f55  /system/lib/libc.so (__libc_init+48)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #08 pc 00000c63  /vendor/bin/test (_start_main+46)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #09 pc 00018037  /system/bin/linker (__dl__ZN6soinfoD1Ev+14)
11-12 11:46:37.553  3882  3882 F DEBUG   :     #10 pc 00020b3b  [stack:bee63000]
--------- beginning of system
11-12 11:46:37.581  3009  3138 W NativeCrashListener: Couldn't find ProcessRecord for pid 3879
11-12 11:46:37.581  2968  2968 E /system/bin/tombstoned: Tombstone written to: /data/tombstones/tombstone_05
11-12 11:46:37.587  3009  3029 I BootReceiver: Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
11-12 11:46:40.890  2961  2980 E storaged: getDiskStats failed with result NOT_SUPPORTED and size 0
11-12 11:46:43.052  3009  3019 I system_server: Background concurrent copying GC freed 15823(686KB) AllocSpace objects, 9(380KB) LOS objects, 19% free, 4MB/5MB, paused 272us total 121.061ms


 

<think>我们正在讨论Android Native服务的开发、编译和调试方法。根据用户提供的引用,我们可以总结出以下几个关键点: 1. **编译**:使用NDK进行Native代码的编译,生成可执行文件或共享库。 2. **调试**: - 使用`ndk-stack`工具分析崩溃日志(引用[3]) - 查看`/data/tombstones`目录下的崩溃日志(引用[4]) - 使用GDB或LLDB进行调试(引用[1][2]) - 在IDE(如Android Studio)中调试Native代码(引用[2]) 由于用户的问题是关于Android Native服务的开发,我们通常指的是运行在Android系统上的C/C++服务(如通过init进程启动的守护进程或通过binder提供服务的native服务)。下面将分步骤介绍。 ### 一、开发环境搭建 1. **安装NDK和CMake**: - 在Android Studio中安装NDK和CMake工具。 - 或下载NDK独立版本并配置环境变量。 2. **创建项目**: - 对于独立的Native服务(不依赖Java),可以创建一个纯C/C++项目。 - 使用`Android.mk`或`CMakeLists.txt`构建。 ### 二、编写Native服务 以创建一个简单的守护进程为例: **main.cpp**: ```cpp #include <unistd.h> #include <stdio.h> #include <android/log.h> #define TAG "MyNativeService" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__) int main() { LOGI("MyNativeService started"); while (true) { // 模拟工作 sleep(5); LOGI("Service is running..."); } return 0; } ``` ### 三、编译配置(使用CMake) **CMakeLists.txt**: ```cmake cmake_minimum_required(VERSION 3.4.1) add_executable(my_native_service main.cpp) target_link_libraries(my_native_service android log) ``` ### 四、编译 使用NDK的cmake进行编译: ```bash $NDK_HOME/build/cmake/android.toolchain.cmake mkdir build && cd build cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-26 .. make ``` ### 五、部署与运行 1. **推送可执行文件到设备**: ```bash adb push my_native_service /data/local/tmp adb shell chmod +x /data/local/tmp/my_native_service ``` 2. **运行**: ```bash adb shell /data/local/tmp/my_native_service ``` ### 六、调试方法 #### 1. 日志调试 使用`__android_log_print`输出日志,通过`logcat`查看: ```bash adb logcat | grep "MyNativeService" ``` #### 2. 使用`ndk-stack`分析崩溃 - 如果程序崩溃,获取`logcat`输出到文件: ```bash adb logcat > log.txt ``` - 使用`ndk-stack`解析: ```bash ndk-stack -sym /path/to/your/project/build -dump log.txt ``` #### 3. 使用GDB/LLDB调试 - **步骤1**:在编译时包含调试信息(在CMake中设置`-DCMAKE_BUILD_TYPE=Debug`) - **步骤2**:在设备上启动gdbserver: ```bash adb push $NDK_HOME/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp adb shell /data/local/tmp/gdbserver :5039 /data/local/tmp/my_native_service ``` - **步骤3**:在主机上使用gdb连接: ```bash $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++ --gdb (gdb) target remote :5039 ``` #### 4. 分析tombstone文件(引用[4]) 当Native程序崩溃时,系统会在`/data/tombstones`目录下生成崩溃日志(需要root权限): ```bash adb root adb pull /data/tombstones/tombstone_01 ``` 使用`addr2line`或`ndk-stack`分析: ```bash $NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line -e my_native_service <崩溃地址> ``` #### 5. Android Studio调试 - 创建`Native`项目或导入现有项目。 - 配置调试器:`Run -> Edit Configurations -> Debugger`选择`Native`。 - 设置断点并调试。 ### 七、高级调试技巧 1. **内存检测**: - 使用AddressSanitizer(ASan)检测内存错误: ```cmake set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") ``` - 在设备上运行前,推送ASan运行时库。 2. **性能分析**: - 使用`simpleperf`进行CPU性能分析: ```bash adb shell simpleperf record -p <pid> -o /data/local/tmp/perf.data adb pull /data/local/tmp/perf.data simpleperf report ``` ### 八、开发注意事项 1. **权限问题**:Native服务通常需要root权限或特定selinux策略。 2. **稳定性**:确保处理所有可能的错误,避免崩溃。 3. **资源释放**:防止内存泄漏(可定期用Valgrind检查,但Android支持有限)。 ### 九、相关问题 §§相关问题§§ 1. 如何为Android Native服务配置selinux策略? 2. 如何使用AddressSanitizer(ASan)调试Android Native内存问题? 3. 如何将Native服务集成到Android系统镜像中? 4. Native服务如何通过binder与其他进程通信? 5. 如何分析Android Native服务的性能瓶颈?</think>### Android Native 服务开发、编译与调试指南 #### 一、开发环境搭建 1. **工具链安装**: - 安装最新版 [Android NDK](https://developer.android.com/ndk)(至少r25+) - 配置环境变量: ```bash export ANDROID_NDK_HOME=/path/to/ndk export PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin ``` 2. **项目结构**: ``` MyNativeService/ ├── jni/ │ ├── Android.mk # Makefile │ ├── Application.mk │ ├── service.cpp # Native服务源码 │ └── binder/ # Binder接口定义 ├── res/ └── AndroidManifest.xml ``` #### 二、Native服务开发(C++) **service.cpp 示例**: ```cpp #include <binder/IBinder.h> #include <binder/IInterface.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> class MyNativeService : public BBinder { public: status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override { switch(code) { case COMMAND_1: // 业务逻辑处理 reply->writeInt32(processCommand(data)); return NO_ERROR; default: return BBinder::onTransact(code, data, reply, flags); } } private: int32_t processCommand(const Parcel& data) { int32_t val = data.readInt32(); return val * 2; // 示例处理 } }; int main() { // 注册服务 sp<IServiceManager> sm = defaultServiceManager(); sm->addService(String16("com.example.MyNativeService"), new MyNativeService()); // 启动线程池 ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; } ``` #### 三、编译配置 1. **Android.mk**: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyNativeService LOCAL_SRC_FILES := service.cpp LOCAL_SHARED_LIBRARIES := libbinder libutils liblog LOCAL_CFLAGS := -Wall -Werror LOCAL_INIT_RC := myservice.rc # 添加init启动脚本 include $(BUILD_EXECUTABLE) ``` 2. **Application.mk**: ```makefile APP_ABI := arm64-v8a armeabi-v7a APP_PLATFORM := android-24 APP_CPPFLAGS := -std=c++17 -fexceptions ``` #### 四、编译与部署 1. **编译命令**: ```bash $ cd jni && ndk-build NDK_PROJECT_PATH=.. APP_BUILD_SCRIPT=Android.mk ``` 2. **部署到设备**: ```bash $ adb push libs/arm64-v8a/MyNativeService /system/bin $ adb push myservice.rc /system/etc/init ``` 3. **Init启动脚本**(myservice.rc): ```rc service myservice /system/bin/MyNativeService class main user root group root oneshot ``` #### 五、调试方法 1. **日志调试**: ```cpp #include <android/log.h> #define LOG_TAG "MyNativeService" #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) // 使用示例 ALOGE("Received command: %d", command); ``` 2. **Crash分析(tombstones)**: ```bash # 1. 获取崩溃日志 $ adb pull /data/tombstones/tombstone_05 # 2. 使用addr2line定位 $ aarch64-linux-android-addr2line -e MyNativeService -fC <崩溃地址> ``` 3. **GDB调试**: ```bash # 启动gdbserver $ adb shell gdbserver :5039 /system/bin/MyNativeService # 本地连接 $ $NDK/prebuilt/linux-x86_64/bin/gdb (gdb) target remote :5039 (gdb) b service.cpp:25 # 设置断点 ``` 4. **Android Studio调试**: - 创建`Native`调试配置 - 指定可执行文件路径 - 配置符号路径(包含编译生成的.so/.dbg文件) 5. **AddressSanitizer内存检测**: ```makefile # 在Android.mk中添加 LOCAL_CFLAGS += -fsanitize=address -fno-omit-frame-pointer LOCAL_LDFLAGS += -fsanitize=address ``` #### 六、Binder接口调试 1. **接口测试**: ```java IBinder binder = ServiceManager.getService("com.example.MyNativeService"); IMyService service = IMyService.Stub.asInterface(binder); int result = service.executeCommand(42); ``` 2. **Binder调用跟踪**: ```bash $ adb shell su root cat /sys/kernel/debug/binder/transactions $ adb shell service list # 查看所有注册服务 ``` #### 七、性能优化技巧 1. **CPU Profiling**: ```bash $ adb shell simpleperf record -p <pid> --duration 10 $ adb pull /data/local/perf.data $ ndk/simpleperf/report.py -g ``` 2. **内存检测**: ```bash $ adb shell am dumpheap <pid> /data/local/tmp/heapdump $ adb pull /data/local/tmp/heapdump $ $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-symbolizer -e MyNativeService < heapdump ``` #### 八、常见问题解决 1. **SELinux权限问题**: ```te # myservice.te type myservice, domain; type myservice_exec, exec_type, file_type; init_daemon_domain(myservice) allow myservice binder_service:service_manager add; ``` 2. **Binder通信失败**: - 检查服务注册名称是否匹配 - 验证客户端/服务端接口版本一致性 - 使用`dumpsys binder transactions`查看事务状态 3. **Native崩溃无日志**: - 确保编译时包含调试符号(`APP_DEBUG := true`) - 检查`/proc/sys/kernel/core_pattern`配置 - 使用`NDK_DEBUG=1`编译
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值