Android原生模拟器运行ARM APP

  • INSTALL_FAILED_NO_MATCHING_ABIS
  • Android原生APP安装微信(Android 6.0)

INSTALL_FAILED_NO_MATCHING_ABIS

安装APK的时候出现这个错误,其实是当你试图安装一个具有本地库的应用程序时,它没有你的CPU架构的本地库。例如,如果您为armv7编译了一个应用程序,并试图将其安装在使用英特尔架构的仿真器上,则无法正常工作。而Android Studio提供的模拟器是X86架构的,当然也有Arm架构的模拟器,只是慢得看不到开机成功的界面!
当你需要安装的APP是自己开发的APP时,你可以在build.gradle中加入以下代码(网上找的,没试过):

splits {abi {enable truereset()include 'x86', 'armeabi-v7a'universalApk true}
}

然而当你是需要安装微信等市场上的APP时,就不行了,因为大多数的APP是ARM架构,而不是X86,所以如果需要在Android原生模拟器上运行微信等APP,则需要一个ARM 到 X86 的指令集翻译器,能把apk里的arm用的so库在运行时动态地转换成x86的指令,所有x86的Android设备里都有这个,而Intel刚好提供了这样一个东西,只不过是闭源的。

Android原生APP安装微信(Android 6.0)

先贴一堆资料:

  1. 移动测试基础 Android 模拟器 Genymotion 安装配置与 ARM 支持
  2. Android Emulator - INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native
    libraries, res=-113
  3. 如何打开Android X86对houdini的支持
  4. Android模拟器知识以及改造
  5. Github/Rprop/libhoudini
  6. Android-X86集成houdini(Arm兼容工具)

本篇文章主要参考:https://blog.imlk.top/,反复查看这位大佬的文章之后,最后成功运行微信,感谢大佬指路。

  1. 改build.prop里的ro.product.cpu.abilist和ro.product.cpu.abilist32为x86,armeabi-v7a,armeabi,骗过包安装器,让它能把微信装上(参考第4篇文章)

  2. 改default.prop里的ro.dalvik.vm.native.bridge=0为ro.dalvik.vm.native.bridge=libhoudini.so,开启系统内的NativeBridge(参考第4篇文章)

    这里必须说一下,这个default.prop不在system.img里面,在ramdisk.img里面,ramdisk.img是只读的,只在启动的时候读一次到内存里。所以对default.prop的修改重启后会丢失,唯一的办法是手动编辑一个ramdisk.img,然后用emulator的-ramdisk选项指定修改后的ramdisk.img文件
    emulator的参数可以到官网去查看

    编辑的方法也不难,搜索cpio 就知道要怎么编辑了。
    用gunzip解压它,再用cpio解包到一个目录里
    在这目录里找到default.prop进行修改

    在封ramdisk.img的时候,不要用cpio打包,可能会有问题导致开机不了(尝试了一次,真的开不了机),用mkbootfs ./你之前解包到的目录 (可以从这下载mkbootfs https://github.com/shenyuanv/mkboot-tools )最后的ramdisk-new.img就是修改过的ramdisk.img了,在启动avd时用emulator的-ramdisk选项指定它即可。

  3. 第3篇文章里面设置里那个叫Enable native
    bridge的选项我一直没有找到,它说效果只是persist.sys.nativebridge从0改成了1,保险起见,我在build.prop里加了persist.sys.nativebridge=1(我尝试了一下,发现并没什么用)

  4. 执行enable_nativebridge
    这几篇文章里都提到了enable_nativebridge这个东西,但是我找了一番,我的AVD里面没有这个脚本,只要从网易的木木模拟器中提取出来。不过还好,在万能的github上面找到了一段enable_nativebridge,大概读一读能发现,恰好是Android7用的,而且考虑了各种情况,甚至还可以在线下载文件(显然访问不了,不过有办法解决的),链接地址:https://gist.github.com/41a5d8ba498ceecca28e9d1069a32ede

代码如下:

#!/system/bin/shPATH=/system/bin:/system/xbinhoudini_bin=0
dest_dir=/system/lib$1/arm$1
binfmt_misc_dir=/proc/sys/fs/binfmt_miscif [ -z "$1" ]; thenif [ "`uname -m`" = "x86_64" ]; thenv=7_yurl=http://goo.gl/SBU3iselsev=7_xurl=http://goo.gl/0IJs40fi
elsev=7_zurl=http://goo.gl/FDrxVN
fiif [ -s /system/lib$1/libhoudini.so ]; thenlog -pi -thoudini "found /system/lib$1/libhoudini.so"
elif [ -e /system/etc/houdini$v.sfs ]; thenmount /system/etc/houdini$v.sfs $dest_dir
elseif mountpoint -q $dest_dir; thenkill -9 `fuser -m $dest_dir`umount -f $dest_dirfimkdir -p /data/armcd /data/armwhile ! mount houdini$v.sfs $dest_dir; dowhile [ "$(getprop net.dns1)" = "" ]; dosleep 10donewget $url -cO houdini$v.sfs && continuerm -f houdini$v.sfssleep 30done
fi[ -s /system/lib$1/libhoudini.so ] || mount --bind $dest_dir/libhoudini.so /system/lib$1/libhoudini.so# this is to add the supported binary formats via binfmt_miscif [ ! -e $binfmt_misc_dir/register ]; thenmount -t binfmt_misc none $binfmt_misc_dir
ficd $binfmt_misc_dir
if [ -e register ]; then[ -e /system/bin/houdini$1 ] && dest_dir=/system/bin# register Houdini for arm binariesif [ -z "$1" ]; thenecho ':arm_exe:M::\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x28::'"$dest_dir/houdini:P" > registerecho ':arm_dyn:M::\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x28::'"$dest_dir/houdini:P" > registerelseecho ':arm64_exe:M::\\x7f\\x45\\x4c\\x46\\x02\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\xb7::'"$dest_dir/houdini64:P" > registerecho ':arm64_dyn:M::\\x7f\\x45\\x4c\\x46\\x02\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\xb7::'"$dest_dir/houdini64:P" > registerfiif [ -e arm${1}_exe ]; thenhoudini_bin=1fi
elselog -pe -thoudini "No binfmt_misc support"
fiif [ $houdini_bin -eq 0 ]; thenlog -pe -thoudini "houdini$1 enabling failed!"
elselog -pi -thoudini "houdini$1 enabled"
fi[ "$(getprop ro.zygote)" = "zygote64_32" -a -z "$1" ] && exec $0 64exit 0

如果有兴趣进行尝试的小伙伴,可以把 log -pi -thoudini 改成echo 方便查看运行结果。

熟悉linux的小伙伴一眼就知道这是Shell。
它的作用只是下载houdini.sfs文件并挂载到so库到/system/lib/arm下,过程中挂在等等出问题的可以是文件不存在等等问题,不行就自己建立一个文件夹。
我在尝试运行这个脚本的时候发现网络有问题,而且貌似没有wget等工具
不过在github上还发现了一个仓库: https://github.com/Rprop/libhoudini,这里面各个版本的sfs文件都有,阅读脚本发现,可以手动下载这个文件然后放到/system/etc/,然后更改脚本自行挂载。

X 是X86,Y Z是X86_64,Z不清楚AArch64是啥!

还有个办法就是直接将所需要的so库直接push到模拟器中。
Andorid原生模拟器的默认端口为5555,可以用adb connect 127.0.0.1:5555 进行连接

当你push到系统文件夹的时候,如果提示 Read Only的话,你可以remount一下。
如果remount也不行,那就先 adb disable-verity,在重启应该就行了。

 adb disable-verityadb rebootadb remount

总结步骤:

  1. 修改build.prop

    ro.product.cpu.abilist=x86,armeabi-v7a,armeabi
    ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi添加可执行 ro.enable.native.bridge.exec=1 ```
    
  2. push所需要的.so文件到/system/lib下:具体是arm 文件夹 以及libhoudini.so

  3. 修改ramdisk.img中的default.prop文件

     # ro.dalvik.vm.native.bridge=0ro.dalvik.vm.native.bridge=libhoudini.so
    

然后就完事儿了!!!!!!最后附上结果图:


当这个持续很久的时候,基本上有戏!

终于安装成功


真香

Android原生模拟器运行ARM APP相关推荐

  1. Weex 起步:项目初始化和模拟器运行 Native APP

    最近开在始做一个移动端的项目,使用的技术栈是 React 相关的技术栈,完成之后,页面放到其他手机客户端里面展示.项目初期可能只是放在其他手机客户端里面展示,后面会考虑做成独立手机客户端,所以预先熟悉 ...

  2. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)

    源:介绍一款比Android原生模拟器还要快的模拟器Genymotion

  3. air android 后台运行,AIR Android:使用模拟器运行程序

    安装和运行程序 生成apk包后,对开发者来说还有一个重要的环节,那就是把程序放在设备上运行起来.这一节我们将分别在模拟器和真机上运行FlipIt游戏,看看效果如何. 使用模拟器运行程序(1) 使用An ...

  4. 【android】解决android SDK 模拟器 运行缓慢

    一,原因分析        由于大量程序安装在内存里,导致模拟器运行缓慢. 二,解决方案         方案一:          1,卸载掉不用的程序(按照手机中的卸载方法)         方案 ...

  5. Android Studio模拟器运行出现VT-x提示,无法打开模拟器的解决办法

    之前公司的台式机在打开Android Studio自带的模拟器的时候出现了一个问题:vt-x is disabled in BIOS,为此我还专门到网上查询了一下,原来是系统BIOS中支持模拟器运行的 ...

  6. Android Studio模拟器运行无反应

    当Android Studio模拟器点击运行无反应 报以下错误: Emulator: PANIC: Cannot find AVD system path. Please define ANDROID ...

  7. android oo模拟器,运行在Android模拟器

    我试图运行在2.3.1模拟器我的第一个Hello World应用程序,但我得到了以下错误消息第一个应用程序:"该应用程序的Hello World(过程com.helloworld)已意外停止 ...

  8. Android Studio模拟器运行卡、慢优化教程

    Android Studio的自带模拟器算是比较不错的模拟器了,但其最致命的缺点是极其大的占用资源以及卡顿,有时基本上卡的不能自理.而且不止Android studio的AVD模拟器,AS本身也是非常 ...

  9. 【Android原生开发】艺术圈APP

    项目地址 项目地址github 一个是NodeJS写的服务器(本地),一个是Android端APP 项目背景 艺术来源于生活.以艺术与文化为主体,开发一款APP,主要实现以下五个模块.分别为博物馆模块 ...

  10. 解决关于android studio模拟器运行卡死问题

    第一步:右键删除当前使用的模拟器 第二步:重新下载一个模拟器 第三步:运行 react-native start react-native run-android

最新文章

  1. mysql查看数据库命令
  2. python引用类 魔法方法_Python 学习笔记 -- 类的魔法方法
  3. dealloc 的水,很深?
  4. 5个令人震惊的统计数据证明日志不足
  5. wxpython wx listctrl_wxPython - ListCtrl列表排序
  6. html5 自制播放器
  7. 萌新的Python练习菜鸟100例(十六)输出指定格式的日期。
  8. seckill配置补发
  9. Ubuntu16.04系统下FastDFS+Nginx安装配置
  10. 吉他演奏中的速度与节拍
  11. 静态变量和静态方法编程训练—信用卡消费记录
  12. 【办公应用软件】万彩办公大师丨PDF页面修剪帮助文档
  13. Linux学习整理-网络防火墙iptables-实践篇1
  14. JSON Editor 中文文档
  15. lt;html xmlns=http://www.w3.org/1999/xhtmlgt;
  16. 良知、职业道德及其他
  17. pythonelectron桌面开发案例_Web桌面应用框架1:Electron与WEB桌面应用程序开发及其它...
  18. QT 语言学习 day07 ui 界面 三种样式的按钮开关的制作!
  19. Biological Psychiatry:vmPFC在情绪、决策、社会认知和精神疾病中扮演多重角色
  20. 委内瑞拉将向OPEC推出Petro币用于国际石油交易

热门文章

  1. php框架thinkphp教程,thinkPHP5.0框架安装教程详解
  2. php文件档结构图,ecshop文件结构名称详细版
  3. 使用经典的基本播放命令和 MML 创建 MIDI 文件
  4. 今天不了技术,谈情怀,推荐一篇 寒窑赋
  5. 新猿木子李:0基础学python培训教程 Python操作Redis
  6. 记大三第一学期10-1出游宜昌
  7. 二进制转8421bcd码_码制 || BCD码 || 格雷码 || 奇偶校验码 || 字母数字码 || 数电
  8. 微信小程序首页加载的优化
  9. 《月满西楼》——李清照
  10. csapp bomb lab (《深入理解计算机系统》lab2)