《Android车载开发踩坑记:为什么adb push安装的APK找不到SO库?》

0 阅读2分钟

一、引言:在开发中真实遇到的一个踩坑的经历

  • 场景描述:
  • 通过adb push安装应用, 将应用推送到车机系统目录,运行时提示UnsatisfiedLinkError找不到对应的so包
  • 初步排查:
  • APK解压后, 发现apk里面的so文件是存在,但运行时就是找不到
  • 问题本质:
  • 说得直白点就是对应用安装流程和SO加载机制理解不足

二、Android应用安装的完整流程

  1. 上传APK到设备临时目录
  2. 包管理器解析APK信息
  3. 创建应用数据目录
  4. 提取SO文件到私有lib目录
  5. 更新系统数据库
  6. 发送安装完成广播
  7. 核心的点在于第四步,会提取apk里面的so文件,到lib目录下面, 以蓝牙应用为例:

添加图片注释,不超过 140 字(可选)

三 为什么adb push后没有lib目录?

  • 系统只在包管理器安装流程中提取SO文件
  • adb push只是文件复制,将apk推送到了对应的目录,跳过了安装器(PackageInstaller),没有执行上面的第四步。
  • System.loadLibrary方法并不能从apk文件中加载so包

四、Android SO文件加载机制 当我们调用加载so包的api时, 首先,是去查找so包的文件路径。

  1. 从应用的私有目录去查找so包

三方应用: /data/app//lib// 系统应用: /system/app//lib// 特权应用: /system/priv-app//lib//

  1. 找不到从系统目录查找so包

/system/lib/ /system/lib64/

添加图片注释,不超过 140 字(可选)

五、总结与思考

  1. 安装流程决定SO提取:只有通过包管理器安装,系统才会提取SO到lib目录
  2. 加载路径固定:动态链接器只从特定目录加载SO文件
  3. 车载场景特殊:adb push虽方便,但破坏了标准安装流程

建议 "理解系统原理,才能高效解决问题。在车载开发中,我们不仅要实现功能,更要理解Android系统的工作机制。adb push看似捷径,实则可能引入隐藏问题。掌握标准流程,才能在遇到问题时快速定位根源。"