【Android】System分区应用自带库与原生库同名问题分析

System分区应用自带库与原生库同名问题分析

问题背景

某系统应用发生必现崩溃问题。崩溃log如下

bash 复制代码
0*-** **:**:**.** 66666 66666 E ***** aar error:: java.lang.UnsatisfiedLinkError: dlopen failed: cannot 
locate symbol "_TTT_TTT_TTT" 
referenced by "/system/app/LINDUO/lib/arm64/liblinduo.so"... 
0*-** **:**:**.** 66666 66666 E offline_da aar error:: at java.lang.Runtime.loadLibrary0(Runtime.java) 
  • 根据Log提示,动态库依赖时找不到_TTT_TTT_TTT这个符号。检索liblinduo.so依赖的动态库。发现,_TTT_TTT_TTT这个符号,在应用自带的libA.so这个库中。
bash 复制代码
nm -D linA.so | grep _TTT_TTT_TTT

相关知识点

动态库加载优先级

  1. 应用私有目录
  2. 自定义注入路径
  3. 系统目录
  • Android 7.0+强制/system分区的应用使用AOSP原生库,即使应用自带同名库也会被忽略。可以理解为,Aosp的原生库比如libA.so是Aosp自身依赖的。如果系统应用自带了libA.so,那么system分区的应用,就会忽略这个库。因为,不能让应用自带的库把系统的原生库替换了。

解决System分区应用自带库与原生库同名问题

  1. 把应用挪到/vendor分区,或者作为后装应用(可以的话),利用Android命名空间机制隔离(参考Asop官网原生库的命名空间
  2. 重命名应用自带的动态库,把动态库改成其他名字。
  3. 使用和系统版本统一的动态库。
  4. 应用使用静态库,静态依赖。
相关推荐
Libraeking3 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位4 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1236 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs6 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob6 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔6 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9966 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly8 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首9 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-194311 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed