无法在Android棉花糖上加载本机库,但可以在棒棒糖上使用
Failed to load native library on Android Marshmallow but works on Lollipop?
我的应用程序使用本地libs(libfoo.so),它在棒棒糖上运行得很好。但由于Fatal signal 11 (SIGSEGV), code 1,
,它在棉花糖上加载库时失败。原因是什么?
我知道M带来了新的权限模型,但它似乎和这个无关,因为库只加载,什么都不做。
日志:
11-20 12:38:53.390 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ Start loading libraries
11-20 12:38:53.394 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ loading/data/user/0/name.antonsmirnov.android.libfoo/cache/sdk/libc.so, file exists=true
11-20 12:38:53.396 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ loading/data/user/0/name.antonsmirnov.android.libfoo/cache/sdk/libdl.so, file exists=true
11-20 12:38:53.397 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ loading/data/user/0/name.antonsmirnov.android.libfoo/cache/sdk/libm.so, file exists=true
11-20 12:38:53.398 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ loading/data/user/0/name.antonsmirnov.android.libfoo/cache/sdk/libstdc++.so, file exists=true
11-20 12:38:53.400 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ loading/data/user/0/name.antonsmirnov.android.libfoo/cache/sdk/libgnustl_shared.so, file exists=true
11-20 12:38:53.402 14997-15010/name.antonsmirnov.android.libfoo D/libfooIssueProject﹕ loading/data/user/0/name.antonsmirnov.android.libfoo/cache/sdk/libfoo.so, file exists=true
11-20 12:38:53.403 14997-15010/name.antonsmirnov.android.libfoo W/linker﹕ /data/data/name.antonsmirnov.android.libfoo/cache/sdk/libfoo.so: unused DT entry: type 0x1d arg 0x35ac
11-20 12:38:53.410 14997-15010/name.antonsmirnov.android.libfoo A/libc﹕ Fatal signal 11 (SIGSEGV), code 1, fault addr 0xd0 in tid 15010 (Thread-187)
11-20 12:38:53.976 243-243/? W/debuggerd﹕ type=1400 audit(0.0:68): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:53.980 243-243/? A/DEBUG﹕ *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-20 12:38:53.980 243-243/? A/DEBUG﹕ Build fingerprint: 'google/volantisg/flounder_lte:6.0/MRA58N/2289998:user/release-keys'
11-20 12:38:53.980 243-243/? A/DEBUG﹕ Revision: '0'
11-20 12:38:53.980 243-243/? A/DEBUG﹕ ABI: 'arm'
11-20 12:38:53.980 243-243/? A/DEBUG﹕ pid: 14997, tid: 15010, name: Thread-187 >>> name.antonsmirnov.android.libfoo <<<
11-20 12:38:53.980 243-243/? A/DEBUG﹕ signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xd0
11-20 12:38:53.996 243-243/? A/DEBUG﹕ r0 00000138 r1 000000dc r2 000000f8 r3 e1fafa84
11-20 12:38:53.996 243-243/? A/DEBUG﹕ r4 000000bc r5 00000000 r6 00000108 r7 000000ec
11-20 12:38:53.996 243-243/? A/DEBUG﹕ r8 f73186ec r9 0000006d sl f0c124e4 fp f73113f6
11-20 12:38:53.996 243-243/? A/DEBUG﹕ ip 00000010 sp f3fd6280 lr 00000008 pc e020d280 cpsr 20070010
11-20 12:38:53.997 243-243/? A/DEBUG﹕ backtrace:
11-20 12:38:53.997 243-243/? A/DEBUG﹕ #00 pc 01294280 /data/data/name.antonsmirnov.android.libfoo/cache/sdk/libfoo.so
11-20 12:38:53.997 243-243/? A/DEBUG﹕ #01 pc 00000004 <unknown>
11-20 12:38:53.976 243-243/? W/debuggerd﹕ type=1400 audit(0.0:69): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:53.976 243-243/? W/debuggerd﹕ type=1400 audit(0.0:70): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:53.976 243-243/? W/debuggerd﹕ type=1400 audit(0.0:71): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:53.976 243-243/? W/debuggerd﹕ type=1400 audit(0.0:72): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:53.976 243-243/? W/debuggerd﹕ type=1400 audit(0.0:73): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:53.986 243-243/? W/debuggerd﹕ type=1400 audit(0.0:74): avc: denied { search } for name="name.antonsmirnov.android.libfoo" dev="dm-2" ino=81264 scontext=u:r:debuggerd:s0 tcontext=u:object_r:app_data_file:s0:c512,c768 tclass=dir permissive=0
11-20 12:38:54.383 243-243/? A/DEBUG﹕ Tombstone written to: /data/tombstones/tombstone_05
11-20 12:38:54.383 243-243/? E/DEBUG﹕ AM write failed: Broken pipe
11-20 12:38:54.409 680-696/? I/BootReceiver﹕ Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
11-20 12:38:54.422 680-15045/? W/ActivityManager﹕ Force finishing activity name.antonsmirnov.android.libfoo/.MainActivity
11-20 12:38:54.424 680-698/? E/JavaBinder﹕ !!! FAILED BINDER TRANSACTION !!! (parcel size = 60)
11-20 12:38:54.430 680-752/? W/InputDispatcher﹕ channel 'adb9cab name.antonsmirnov.android.libfoo/name.antonsmirnov.android.libfoo.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
11-20 12:38:54.430 680-6202/? D/GraphicsStats﹕ Buffer count: 7
11-20 12:38:54.439 680-752/? E/InputDispatcher﹕ channel 'adb9cab name.antonsmirnov.android.libfoo/name.antonsmirnov.android.libfoo.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
11-20 12:38:54.447 680-752/? W/InputDispatcher﹕ channel '7b55887 Toast (server)' ~ Consumer closed input channel or an error occurred. events=0x9
11-20 12:38:54.447 680-752/? E/InputDispatcher﹕ channel '7b55887 Toast (server)' ~ Channel is unrecoverably broken and will be disposed!
11-20 12:38:54.449 252-252/? I/Zygote﹕ Process 14997 exited due to signal (11)
11-20 12:38:54.542 680-857/? I/WindowState﹕ WIN DEATH: Window{7b55887 u0 Toast}
11-20 12:38:54.542 680-857/? W/InputDispatcher﹕ Attempted to unregister already unregistered input channel '7b55887 Toast (server)'
11-20 12:38:54.553 680-1361/? I/WindowState﹕ WIN DEATH: Window{adb9cab u0 name.antonsmirnov.android.libfoo/name.antonsmirnov.android.libfoo.MainActivity}
代码:
private void loadLibrary(File PATH, String libName) {
File libFile = new File(PATH, "lib" + libName + ".so");
String libPath = libFile.getAbsolutePath();
Log.d(TAG, "loading" + libPath + ", file exists=" + libFile.exists());
System.load(libPath);
}
private void loadLibs() {
showMessage("Start loading libraries");
// don't change load order!
try {
loadLibrary(sdkFolder, "c");
loadLibrary(sdkFolder, "dl");
loadLibrary(sdkFolder, "m");
loadLibrary(sdkFolder, "stdc++");
loadLibrary(sdkFolder, "gnustl_shared");
// loadLibrary(sdkFolder, "z");
loadLibrary(sdkFolder, "foo"); // crashes here
showMessage("Libraries loaded !");
} catch (Throwable t) {
t.printStackTrace();
showMessage("Error loading library: " + t.getMessage());
}
}
PS。该库是使用最新的android NDK 10e编译的,该应用程序使用相同的库至少工作了两年。
PPS。我使用ndk中的readelf
分析了文本重定位,没有发现重定位。此外,我没有关于棒棒糖搬迁的警告,所以我认为这是另一个问题。
谷歌已经改变了对Marshmallow及以上版本的私人库的使用;这可能就是你正在经历的情况。
从Android 7.0开始,系统会阻止应用程序动态链接到非NDK库,这可能会导致应用程序崩溃。
根据该表:https://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk.当您使用私人库运行Lollipop时,您应该能够看到logcat警告。例如:
03-21 17:07:51.502 31234 31234 W linker : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120
相关文章:
- Clion显示错误,但可以使用Cmake成功构建代码
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 为什么我们不能使用整数到字符串直接转换,但可以按位到字符串?
- 为什么我不能写cout<<a==b;但可以写cout<<(a==b);
- 无法使用 Openvino 中间表示文件转发() 网络,但可以使用我正在制作 IR 的 ONNX 文件
- VSCode C/C++IntelliSense标识符未定义,但可以解析定义
- 为什么我不能在未链接的 DLL 上调用方法,但可以这样做?C++
- 我将如何通过抽象类传递虚拟方法,但可以选择不重写
- gtest - 确保方法之前没有被调用,但可以在某个方法调用之后调用
- 无法使用Ostream打印,但可以使用COUT打印
- 设置具有非constexpr函数的constexpr变量(但可以在编译时间计算)
- 为什么我无法使用CreateFile Win32 API打开文件RW,但可以使用STD ::删除将其删除
- 为什么我在使用 Qt creator 用 C 编译代码时出错,但可以使用 make 文件轻松做到这一点
- Boost 1_65_1 不能使用 OpenSSL 1.1.0g "undefined reference" 编译,但可以使用 "nm"
- C++:无法使用 regsvr32 注册我的 DLL,但可以通过 IDE 工作
- 为什么不能从元组中分配一对,但可以从一对中分配元组?
- "Too Many Files" Nexus 5/6棒棒糖上的错误
- 无法在Android棉花糖上加载本机库,但可以在棒棒糖上使用
- Android棒棒糖从本机代码c++写入SD卡