Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]

项目场景:

在自己用androidkiller 回编译一个app,然后用adb 命令安装出现了该错误。这个问题说不能提取原生库。


原因分析:

谷歌在Android6.0以后引进extractNativeLibs

android:extractNativeLibs:
Whether or not the package installer extracts native libraries from the APK to the filesystem. If set to false, then your native libraries must be page aligned and stored uncompressed in the APK. No code changes are required as the linker loads the libraries directly from the APK at runtime.

就是说我们如果在androidmanifest里的application属性中添加 android:extractNativeLibs="false"

的话,我们的so文件也就是原生库必须要进行对齐,并且没有在apk包里压缩,到时候链接器在运行的时候,就可以直接从apk加载so库,不需要先将其解压到另外一个文件。这个属性默认为true。

两种做法的优缺点:

- 设为true的话,gradle在打包时会对工程中的so库进行压缩,使得生成apk包的体积会减小。我   们的包安装程序在安装该apk时,如果发现该apk包含so库,就会将其解压提取出来放到某个目录下。到时候使用就直接调用那个目录的so文件。这样就会使得apk文件体积小,安装apk文件时间长,并且占用空间变大,在解压目录下有so文件,在apk里还有没解压的so文件。

- 设为false的话,apk文件体积会变大,安装apk文件时间变小。

问题回顾:

报错的信息是不能提取原生库,所以一般都是由于该属性值的缘故。


解决方案:

方案1:网上搜的很多教程都是去把androidmanifest里application里的 android:extractNativeLibs="false"去掉,然后再进行打包安装,这个方案对我的错误无效,因为我的在Androidmanifest里没有这个属性,也就是默认值true。

方案2:

如果原因是由于apktool在回编译apk包的时候并不会进行内存对齐,我们可以对打包好的apk包进行一次内存对齐,使用zipalign工具(apksigner只能再签名后对齐,jarsigner就只能在签名前对齐),命令对齐 infile.apk 并将其保存为 outfile.apk,请运行以下命令:

zipalign -p -f -v 4 infile.apk outfile.apk

如需确认 existing.apk 的对齐方式,请运行以下命令:

zipalign -c -v 4 existing.apk

就可以成功安装了。

参考链接:

https://developer.android.google.cn/studio/command-line/zipalign

https://testerhome.com/topics/18463

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值