android模拟器_android模拟器报错 - CSDN
  • 安卓开发模拟器

    2020-07-30 23:31:57
    Genymotion是一套完整的工具,它提供了Android虚拟环境。
  • Android判断模拟器还是真机的方法

    万次阅读 多人点赞 2017-12-20 10:59:23
    Android检测模拟器还是真机。

    作为一个App,我们在做推广的同时,肯定会担心刷量的问题。一般常见的刷量手段就是通过安卓模拟器进行刷量。

    那就会想到,怎么判断一个设备是模拟器还是真机。

    先吐槽一下,百度上搜出来的都是什么垃圾答案。各种抄袭来的代码,连原理都没讲清楚,或者代码功能都没有实现的,都一篇篇的文章发表在哪里。浪费了我不知道多少时间,真的,我快恶心的不行了。可以吗?能不能有点职业操守,抄代码自己用也就算了,你还当自己的文章发表了,你发表能用也就算了。功能还都是BUG。有没有素质啊。时间很贵的。

    下面我把我研究的成果,当然有部分是参考别人的代码提供给大家。

    先说思路。

    1.那些说用IMei的,Mac值,Device_Id,以及Telephony_Service中的运营商,国家的,什么乱七八糟不靠谱的。首先都是错误的思路。

    你们还以为现在的模拟器是Studio上的模拟器吗?求你们写代码之前,先研究一下模拟器的功能。夜神,逍遥,这些模拟器上面明明白白的写着,修改IMEI码,修改设备信息,修改运营商,手机号码等等等等。你和我说通过判断这些信息的默认值。

    2.那些不靠谱的去除了,我们该如何去判断呢?

    那就要判断一下是不是有什么硬件设备是模拟器上没有的呢?很容易想到的就是蓝牙功能。我们通过获取系统服务获取到蓝牙,判断蓝牙是否存在,然后发现模拟器也有蓝牙。不要慌,获取一下蓝牙的名称发现null。好了。再看看真机的效果。这就出来了。

    /**
     * 判断蓝牙是否有效来判断是否为模拟器
     *
     * @return true 为模拟器
     */
    public boolean notHasBlueTooth() {
        BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
        if (ba == null) {
            return true;
        } else {
            // 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
            String name = ba.getName();
            if (TextUtils.isEmpty(name)) {
                return true;
            } else {
                return false;
            }
        }
    }

    我在做的时候就考虑,一个蓝牙是否足够!废话,当然不够啦。那还有什么呢?瞬间想到了传感器。温度,重力,光,还有其他一堆。经过测试发现,模拟器上也有很多传感器,同时有部分传感器没有。而在真机上,同样也有部分手机没有温度,压力等传感器。经过一个个的测试选择。我选择了光传感器。

    /**
     * 判断是否存在光传感器来判断是否为模拟器
     * 部分真机也不存在温度和压力传感器。其余传感器模拟器也存在。
     * @return true 为模拟器
     */
    public static Boolean notHasLightSensorManager(Context context) {
        SensorManager sensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
        Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //光
        if (null == sensor8) {
            return true;
        } else {
            return false;
        }
    }

    既然模拟器都能模拟手机,那是不是模拟器出来的所有设备信息是不是有什么特征呢?通过打印一堆的Device参数。经过网上的参考。就是下面这个代码了。

    /**
     * 根据部分特征参数设备信息来判断是否为模拟器
     *
     * @return true 为模拟器
     */
    public static boolean isFeatures() {
        return Build.FINGERPRINT.startsWith("generic")
                || Build.FINGERPRINT.toLowerCase().contains("vbox")
                || Build.FINGERPRINT.toLowerCase().contains("test-keys")
                || Build.MODEL.contains("google_sdk")
                || Build.MODEL.contains("Emulator")
                || Build.MODEL.contains("Android SDK built for x86")
                || Build.MANUFACTURER.contains("Genymotion")
                || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
                || "google_sdk".equals(Build.PRODUCT);
    }

    好了,和设备硬件相关的就差不多这几个方法了。那其他方法呢?那模拟器基本上都是运行在电脑上的,电脑的架构是X86。手机正常的是arm的。那是不是可以通过获取CPU来判断呢?基本上就是intel和amd两种吧?

    public static String readCpuInfo() {
        String result = "";
        try {
            String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
            ProcessBuilder cmd = new ProcessBuilder(args);
    
            Process process = cmd.start();
            StringBuffer sb = new StringBuffer();
            String readLine = "";
            BufferedReader responseReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
            while ((readLine = responseReader.readLine()) != null) {
                sb.append(readLine);
            }
            responseReader.close();
            result = sb.toString().toLowerCase();
        } catch (IOException ex) {
        }
        return result;
    }
    
    /**
     * 判断cpu是否为电脑来判断 模拟器
     *
     * @return true 为模拟器
     */
    public static boolean checkIsNotRealPhone() {
        String cpuInfo = readCpuInfo();
        if ((cpuInfo.contains("intel") || cpuInfo.contains("amd"))) {
            return true;
        }
        return false;
    }

    好了,通过以上方法,你可以过滤一大堆的模拟器了。

    当然我这些方法只是比较基础了。我在百度谷歌的时候当然也有部分大神的思路。

    下面推荐一个通过 (匹配Qemu的一些特征文件以及属性) 来判断。这个我也不会。也没看懂。如果有需要的自己去查看吧。

    https://github.com/happylishang/CacheEmulatorChecker


    !!!!!!重要说明!!!!!!!!

    经过N台设备测试以及N款模拟器测试。

    1.逍遥模拟器竟然可以无视蓝牙检测。所以蓝牙的方法已经失效。

    2.还是这个逍遥模拟器,又TMD设备特征参数也已经失效了。

    3.所以经过多方测试发现,通过硬件信息去判断模拟器的方法已经失效了。现在唯一比较靠谱的应该就剩这个CPU的检测以及这个光传感器了吧?

    4.如果有某位同学测试发现有模拟器可以过CPU检测以及光传感器的麻烦说一下。

    5.测试的时候又发现了一个情况。如果你的项目里面加载了so。那就别用CPU检测了,那当然就是ARM的架构了。到了这里,那就只有光传感器了。

    如果觉得不放心。那就请同学认真学习下面这篇文章中的关键点。

    https://github.com/happylishang/CacheEmulatorChecker

    我们最后的方案也是通过学习这个文章的思想,然后再自己拓展。

    在Windows和Mac上测试不同的模拟器,检测出模拟器的有1.逍遥模拟器 2. 蓝叠模拟器 3. 夜神模拟器 4. 靠谱助手 5. 天天模拟器 6. 海马模拟器

    通过这几款模拟器的检测,应该能说明这个方案比较可靠。



    展开全文
  • Android Studio 模拟器的选择和安装

    万次阅读 2017-11-05 20:55:57
    Android Studio 模拟器的选择和安装 一、Android Studio 的 AVD 设置 Android Studio 程序可以在真机上调试运行,Android Studio 也提供了模拟器来调试运行,这时需要配置 AVD 来选择你调试程序的模拟环境。 ...

    一、Android Studio 自带的AVD模拟器

    Android Studio 程序可以在真机上调试运行,Android Studio 也提供了模拟器来调试运行,这时需要配置 AVD 来选择你调试程序的模拟环境。
    1. 在 Intel CPU 的主机上启用 HAXM
    在 Intel CPU 的主机上,为了加速AVD模拟器的运行速度,需要启用 HAXM 。如果在没有启用 HAXM 时就运行程序,调用AVD模拟器时会报如下错误:

    emulator: ERROR: x86 emulation currently requires hardware acceleration!
    Please ensure Intel HAXM is properly installed and usable.
    CPU acceleration status: HAX kernel module is not installed!

    出现此警告的原因是AVD模拟器调用X86架构的安卓虚拟机需要使用到Intel HAXM 引擎,而本机尚未进行安装导致。
    此时,应该先进入 BIOS 启用 Virtualization Technology 选项。然后从 https://software.intel.com/en-us/android/articles/intel-hardware-accelerated-execution-manager/ 下载,也可以直接在 Android Studio 的 SDK 中下载,再安装即可。


    2. 对于非 Intel CPU 的主机
    对于非 Intel CPU 的主机或不能安装 HAXM 的主机(像我的云主机),则只能选择 arm 模拟器 或 选择其它第三方的模拟器 (像Genymotion)。
    arm 模拟器的设置如下,不过一般情况下, arm 模拟器速度很慢 (像我的云主机启动它需要个吧小时),所以,应该尽量选用Genymotion等虚拟机。

    3. 设置
    如果以上配置无误,就可以运行程序试试。如果出现类似如下面的警告:
    emulator: WARNING: Requested RAM size of 1536MB is too large for your environment, and is reduced to 1152MB.
    emulator: device fd:596
    HAXM is not working and emulator runs in emulation mode
    emulator: The memory needed by this AVD exceeds the max specified in your HAXM configuration.
    emulator: AVD RAM size = 1152 MB
    emulator: HAXM max RAM size = 1024 MB
    emulator: You might want to adjust your AVD RAM size and/or HAXM configuration to run in fast virt mode.
    Cannot set up guest memory ‘pc.ram’: Invalid argument
    警告提示模拟器RAM过大,需要在 AVD 中将模拟器的RAM改为512~1024,这样模拟器才能正常启动。

     

    二、android studio外挂Genymotion模拟器

    Genymotion虚拟机可以模拟Galaxy、SAMSUNG、SONY、HTC等主流手机,运行速度快,是现在广受欢迎的虚拟机。Genymotion依赖 VirtualBox 加载手机虚拟机。
    1. 安装 VirtualBox
    https://www.virtualbox.org/wiki/Downloads
    下载 VirtualBox ,再安装,过程从略。
    2. 安装 Genymotion
    https://www.genymotion.com/download/ 下载 Genymotion ,下载是要用邮箱注册账号后才能下载。
    官网提供了两个版本,带有VirtualBox的Genymotion整合包和不带VirtualBox的Genymotion安装包,可以根据需要下载相应版本安装。安装过程从略。
    3. 下载 .ova 虚拟设备
    启动 Genymotion,添加对应手机的 Virtual device ,如下图。


    不过如果因为墙的阻挡,也许会下载出错。如果Genymotion添加 Virtual device 时出现如下的错误:

    Failed to deploy virtual device.
    Unable to create virtual device:
    Connection timeout occurred.

    那就只好手工下载 Virtual device 的离线.ova文件了。
    方法一:下载官方离线.ova文件
    即使刚才下载失败了,但是它已经在 “C:\Users\用户主目录\AppData\Local\Genymobile\genymotion.log” 文件里保留了官方.ova文件的地址,打开该文件,找到类似 “http://files2.genymotion.com/dists/6.0.0/ova/genymotion_vbox86p_6.0_160114_090449.ova” 的路径,即您想要下载的.ova镜像文件URL;复制到浏览器或用第三方下载工具下载该文件。
    方法二:贴吧下载
    有些网友下载了一些.ova文件,大家可以在网上搜搜,也可以到百度贴吧里找找。像下面的地址里就有一些:
    链接: http://pan.baidu.com/s/1jHfuJNg 密码: 222g
    4. 安装下载的.ova 离线文件
    下载好后拷贝到 “C:\Users\用户主目录\AppData\Local\Genymobile\Genymotion\ova” 文件夹下。
    然后打开 VirtualBox -> 管理 -> 导入虚拟电脑 (快捷键:Ctrl+I ) -> 选择下载好的 .ova 文件 -> 下一步 -> 导入 。导入完成之后就OK了。这时候打开Genymotion就看到可以使用了。
    5. 将Genymotion加入 Android Studio
    如下图,在 Android Studio 的 Setting 中加入 Genymotion 的插件即可。




    6. 运行 Genymotion
    现在可以点击 Android Studio 上的 Genymotion 图标来运行虚拟机,如果此时出现如下错误说明需要重装或升级显卡驱动。
    make sure that your video card supports OpenGL 2.0 and update the drivers.

    五、运行
    正常运行后,可以通过虚拟机的
    Settings -> Language & input -> Language -> 中文(简体) 将虚拟手机中文化。


    然后,可以在虚拟机里调试程序了。


     

    三、真机模拟器

    对于我这刚入门的菜鸟来说,我在配置Android的开发环境中,遇到的问题实在是太多了,都快花费我一个星期的时间了,在这期间出了翻墙下载SDK之外,其他的世间都在搞Android virtual device出现的问题,由于本人的能力有限以及电脑配置的不给力,Android virtual device中出现的问题始终都没有得到解决,后来看了网上很多人都在说使用Google自带的Android virtual device来进行调试运行时会比较慢,性能也不是很好,然后使用真机模拟的话速度是比较快的,效果也不错。那么接下来我要讲的就是如何在Android studio中使用真机进行调试以及在这过程中遇到的一个问题


    首先,你要先创建好一个项目




    接着在工具栏中找到APP这个按钮,选择Edit Configurations




    在弹出的对话框中,找到“ Deployment Target Options” 并选择“ USB Device ”,然后点击确定



    以上配置完之后,我们就可以进行调试了,在工具栏中找到绿色的三角符号按钮(或者按快捷键Shift+F10)运行项目



    启动run后,软件开始生成apk安装包,并自动安装到手机上,第一次执行的话会慢一些,往后就快了。然后我们识别出来的设备可以再Android Monitor这一栏中看到



    安卓手机也自动安装好app并自动执行





    在以上的操作过程中,出现了一个问题,在Android Monitor这栏中,没有识别出我们的手机设备,显示No Connected Devices



    出现以上的原因是电脑中的驱动没有安装好,Android studio不能识别出我们的设备,然而解决方法很简单,我们只需要这我们的电脑中安装一个豌豆荚就可以了,这个应用可以帮我们直接搞定设备驱动安装的问题。



    真机调试参考自:http://jingyan.baidu.com/article/fea4511a75d627f7ba912540.html


    展开全文
  • Android模拟器

    千次阅读 2019-07-21 15:50:45
    ” 使用Android模拟器开发和调试应用肯定比使用真机方便。但相比XCODE的IOS模拟器,Android SDK自带的AVD实在不争气,不过一些第三方的模拟器却表现不俗! 1、Android SDK自带的AVD模拟器 12年我开始接触Android...

    “工欲善其事,必先利其器。” 使用Android模拟器开发和调试应用肯定比使用真机方便。但相比XCODEIOS模拟器,Android SDK自带的AVD实在不争气,不过一些第三方的模拟器却表现不俗!

    1、Android SDK自带的AVD模拟器

    12年我开始接触Android开发时候,手头上甚至连一部低端的Android手机都没有,那时候用的是Android SDK自带的AVD模拟器,相信任何Android开发者都对这货深恶痛绝。一直以来,Android开发都有以下的毛病:

    • AVD模拟器奇卡无比;

    • 使用USB数据线链接手机经常无法设别设备,adb容易抽风;

    • Log日志输出不全;

    一直以来都想找一款能够顺畅运行APP的Android模拟器,以下就介绍几款比较给力的。

    2、Genymotion

    Genymotion是一款顺畅和容易(fast and easy-to-use)使用的Android模拟器,可以用来运行和调试你的APP。Genymotion 来自于AndroVM 这个开源项目,基于 x86 和 VirtualBox,支持 OpenGL 加速,可以用于 Mac/Win/Linux。最近发布了新版,支持了 Android2.3/4.3,新增了拖拽安装 apk,移除了 Google 市场(后面提供解决方案)。另外增加了功能更丰富的付费版,个人可以继续使用免费版。

    特点

    1. 超级流畅;

    2. 支持拖拽安装APK;

    3. 有多种Android系统版本和设备类型供选择;

    4. 能模拟手机的旋转、充电情况、GPS数据等物理数据;

    此外,Genymotion还提供了EclipseIntellij Idea(Android Studio)的插件,方便你从IDE启动模拟器,不过目前插件的功能也仅仅是用于启动模拟器。

    当然Genymotion也不是万能的,它也有一些不足之处。

    Genymotion无法启动

    Window版本的GenymotionVirtualBox的链接经常出问题,Genymotion经常无法启动,并提示VirtualBox引擎出错,关于Genymotion安装以及启动过程中出现的问题,你可以参考官方的帮助文档

    Genymotion无法安装Google Play

    前面说过,新版 Genymotion 移除了 Google 市场。实际上,对 ARM library 的支持也一并移除了:

    Both the “Google apps” and the “ARM library support” features are removed.

    有的APP用到了ARM的SO库,安装这些 App 时,会报「INSTALL_FAILED_CPU_ABI_INCOMPATIBLE」错误,比如微信。xda 论坛给出了一个解决方案,经验证确实好用。
    安装 GApps(含 Google 市场)和 ARM Translation(提供 ARM 支持)的步骤:

    1. 下载 ARM Translation Installer v1.1

    2. 下载对应系统的 GApps

    3. 安装第 1步下载到的文件(直接把 zip 文件拖进虚拟机,不要解压),安装完关闭虚拟机再打开;

    4. 安装第 2 步下载到的文件(步骤同上);

    这样,Google Play 和其他 Google App 都有了,再安装微信等应用也不会报错了。(但是此方法并不是对所有的APP都管用, Genymotion对使用了ARM的SO库的APP的支持确实不好,希望以后能改进)。

    3、电脑上也可以玩Android游戏的BlueStacks

    Android 第一個第三方的模拟器就是 Bluestacks,网络上也有許多介绍文章。最大优势是占用资源小,安装包用量大约是 182 MB 左右,同样有 Windows / Mac 版、内置Google Play 商店。

    如何使用

    首先,xp用户需先安装Windows Installer 4.5.NET Framework 2.0 SP2,否则会提示出错,我们这里也提供了下载,如果电脑上已经安装过这些软件可以跳过此步。然后到官网下载最新的安装包并安装。

    不足之处

    Bluestacks相比Genymotion,不容易出现无法启动的问题,也支持ARM Library,但不足之处也是明显的:

    1. 流畅度不如Genymotion

    2. 没有多种Android系统以及设备型号供选择;

    3. 最致命的,Bluestacks是为了游戏而不是为了开发而设计的,所以无法竖屏,不适合开发 ;

    4、最适合开发的Android模拟器Droid4X

    正如官网所介绍的,海马玩模拟器(Droid4X)是迄今为止在性能,兼容性和操控体验方面最好的安卓模拟器。通过Droid4X,用户可以在PC上享受百万移动应用和游戏带来的全新体验。

    海马玩模拟器在Android内核和图形渲染方面取得了突破性的成果,在同等PC硬件配置下,整体性能超出其他同类产品50%以上。海马玩模拟器美解决了ARM程序在X86架构下的运行问题,兼容市面现有99%以上的应用和游戏。

    Droid4X模拟器是利用VirtualBox为基础,支持滑动按键,自带ROOT权限, 启动速度快等等。相信很多朋友使用传统安卓模拟器都会遇到各种各样的问题导致使用体验差。而这款海马玩安卓模拟器(DROID4X)不仅支持双显卡的电脑 同时系统内自带资源库,让你完完全全感受原生安卓的独特魅力。使用海马玩安卓模拟器(DROID4X)能让你轻轻松松使用电脑的安卓客户端。

    特点

    1. 速度流畅,稍微不如Genymotion,但是比BlueStacks好很多;

    2. 支持横竖屏切换,支持摇动以及GPS数据模拟;

    3. 支持ARM Library,能够运行Google Play等Genymotion无法运行的APP;

    4. 支持手柄控制;

    5. 未来支持在IOS运行,也就是可以用IPHONE运行Android应用了,想想就怕;

    如何使用

    1. 下载并安装 VirtualBox;

    2. 下载并安装Droid4X

    不足之处

    Droid4X可以说得上没什么可以挑剔的地方,非要说的话,就是流畅度稍微不如Genymotion,UI不如Genymotion“接地气”,更像是为了游戏而设计的。此外,也不想Genymotion那样有众多Android系统版本可以选择,不过这些都是无关紧要的功能,毕竟我们不会用一个模拟器去作覆盖测试,是不?

    总结

    从使用经验上来看,Droid4X确实是一款值得每个Android开发汪使用的模拟器,试想一下,每次完成Coding,轻轻按一下Shift+F10,或者使用“重大事件决策按钮”,如下图,

    展开全文
  • Android模拟器知识以及改造

    千次阅读 2018-03-12 09:48:40
     提供了一个Android模拟器,运行流畅度可以类比真机,可以正常运行市面上的大部分应用,比如应用宝,手机管家等。在功能性测试的场景下,比真机节约成本,维护更方便。 2. 原生安卓模拟器的缺点?说Android模拟器...

    1. 我们做了个什么东西?

       提供了一个Android模拟器,运行流畅度可以类比真机,可以正常运行市面上的大部分应用,比如应用宝,手机管家等。在功能性测试的场景下,比真机节约成本,维护更方便。

     

    2. 原生安卓模拟器的缺点?

    Android模拟器慢其实是指早期Google提供的只能用于在Arm架构上运行的Android镜像在模拟器上运行慢。与此对照的是,iOS模拟器运行非常流畅。其实,iOS提供的叫 Simulator(模拟器),Android提供的叫Emulator(仿真器)。

    事实上 iOS Simulator 仅仅是 API 级别的模拟,并不是完整的运行了一个系统,可以说 iOS Simulator 就是一个特殊的软件,通过一定的 IPC 机制实现的一个高度模拟 iOS Mac app。可以作为验证的是,iOS Simulator上只是能够运行在x86环境下编译的非签名程序(Developer Account),并不能安装发布到App Store上的只提供了针对ARM指令集的签名程序。

    Android Emulator,是提供了虚拟机。从硬件(主要指 CPU 架构)到软件(完整 Linux 内核和 ROM)在原理上完全拟真。

    对于ARM 版的Android镜像在Emulator上运行,需要Emulator模拟出一个arm的处理器,可以想象,系统本来是针对ARM指令集的,所有的指令都需要虚拟机模拟出来的arm处理器执来执行,效率必然打了很大折扣,所以就慢了。

    后来,Google提供了x86版本的Android镜像,这时候就不用模拟异构处理器了,也就不用去做动态指令集翻译的活了,借助KVMlinux内核模块,属于硬件虚拟化技术,负责借助于硬件VT加速特性实现虚拟机的CPU虚拟化,内存虚拟化等),运行速度就大大加快了,在主机性能良好的情况下,Emulator流程程度甚至比真机还要好。但是,实际使用的话,会发现市面上大部分应用是安装不进去的。

    因为习惯上都叫Android模拟器,所以后面描述里的Emulator、模拟器、仿真器不再区分,都是指Android Emulator。   

     

    2.  模拟器的启动流程?

    AS提供了AVD Manager可以可视化的管理模拟器的创建创建和启动。

    创建过程里需要指定使用的Android镜像(分arm版和x86版),选择arm版时AS会提示选择x86版本能提高10倍的性能。还可以设定分辨率、数据分区大小等。这些设定会创建一个config.ini的配置文件和设定大小的userdata.imgsdcard.imgconfig.ini里配置了系统镜像的路径system.img.

    查看下载的镜像文件夹,除了system.img, 还有一个很重要的文件ramdisk.img, ramdisk是根文件系统,包含一些对于启动android很重要的文件,比如内核启动完后加载的第一个进程init、一些重要的配置文件等,总之它控制着整个android的启动。根据 init.rc, init.ranchu.rc来初始化并装载系统库、程序等直到开机完成。system.img会挂载到/system目录下。userdata.img是用来存放用户数据的,会被挂载到/data目录下,实际在虚拟机运行时,生成使用的是userdata-qemu.img,可读写。当在模拟器上安装和运行应用时,就是在/data目录下复制和产生了文件,所以设定的userdata.img不能太小,userdata.img大小可以直接认为等同真机的ROM大小。

     

     

     

    创建avd界面

     

     

    生成的avd目录

     

    Avdconfig.ini文件内容

    得到avd之后可以通过命令行的方式启动:

    emulator -avd AVD_NAME -verbose, verbose查看日志。

     

        通过日志可以看出内部调用的是qemu-system-i386

        查看emulator/qemu目录可以看到这里有qemu-system-armel等多个文件,分别对应不同的架构,调用哪个取决于AVD里设置的target-arch, 我们创建的模拟器target-archx86, 所以调用的就是qemu-system-i386

    TMOS中使用的avd是通过脚本的方式生成这些文件来实现创建的。需要注意的是,一个AVD代表一个模拟器实例,只能启动一次。

     

    4. Android Emulator是怎么实现的?

        通过前面的emulator启动过程日志可以看出,emulator命令后负责启动虚拟机的是qemu-system-i386。实际上Android Emulator就是基于QEMU改写的,Virtual Box也是在QEMU基础上改写的。Android EmulatorQEMU基础上增加了telephonygps等。

        QEMULinux上著名的开源模拟器,能够模拟出不同架构的处理器、硬盘和网卡等。效率上,当模拟的是同构处理器时,借助于KVM能够达到接近主机的性能。Qemu里已经集成了kvm, ubuntu上直接安装qemu-kvmKVM依赖于硬件的虚拟化支持,所以需要在BIOS上开启VT

    KVM (Kernel-based Virtual Machine) is a FreeBSD and Linux kernel module that allows a user space program access to the hardware virtualization features of various processors, with which QEMU is able to offer virtualization for x86, PowerPC, and S/390 guests. When the target architecture is the same as the host architecture, QEMU can make use of KVM particular features, such as acceleration.

    5. 怎么实现在x86模拟器上运行只提供了arm 库文件的应用?

        Java虚拟机屏蔽了底层处理器的差异,所以对于只有Java代码的apk来说可以充分享受x86模拟器带来的流畅运行速度。

    但是很多APK使用了JNI,调用了C语言编写的模块,虽然使用Google提供的NDK工具可以非常方便的生成分别针对x86/arm/MIPS等架构的的库文件,但大部分应用只提供了针对ARM编译的so库,这样的apkx86的处理器上就无法运行了。

    安装应用时,PMS会检查ro.product.cpu.abilistro.product.cpu.abilist32的值,x86镜像里这两个值都是x86,表明本系统只有执行x86指令集的能力,这样如果APK里只有针对ARM指令集的动态库,那安装就无法通过,提示ABI不支持。把这两个属性值改为x86,armeabi-v7a,armeabi 标识本系统能支持这些指令集,就能骗过PMS,使应用正常安装。但应用此时并不能运行。

    为了解决Atom x86处理器上运行Android系统的问题,Intel提供了一个叫做houdini的模块,提供了动态转换指令集的能力,使得x86 Android系统能够执行针对arm指令集的so库文件。Android5.0后在系统层面提供了NativeBridge,支持接入这样的转换器,所以5.0后要把houdini模块添加到系统里是比较简单的。但Houdini是闭源的,不对外提供使用文档。需要的二进制文件可以从x86 Android官网获取或者从Genymotion获取。集成方法也可以参照这两个实现进行。

    系统默认启动是不开启NativeBridge能力的,打开需要把ramdisk.img里的ro.dalvik.vm.native.bridge=0注释。系统启动后,又会读取ro.dalvik.vm.native.bridge的值,默认为0,表示不开启,改为为libhoudini.so, 则会使用libhoudi.so提供的能力进行动态指令集的转换。

     

    6. 怎么增加Wifi连接?

    原始SDK里的Android镜像启动后是以mobile的方式联网的,无法打开WiFi联网。系统里已经包含了正常开启Wifi需要的Framework部分,但缺少硬件的模拟、HAL的支持以及相关的库和可执行文件。

     

    (外源)

    qemu 命令支持增加虚拟网卡参数,模拟出硬件层支持。

    增加HAL层的libhardware_legacy.so提供对硬件的操作。

        通过wpa_supplicant-ieth1 -Dwired -c/data/misc/wifi/wpa_supplicant.conf 命令来启动守护进程wpa_supplicant, 提供了wpa_server, 配置文件wpa_supplicant.conf提供wifi热点.                          wpa_cli命令则实现连接热点。具体实现由libwpa_client.so提供。

    默认系统启动时是不连接WiFi的,可以通过adb shell svc wifi enable连接到wifisvc命令内部是通过调用WifiManager.enable实现的。启动过程中,观察logcat,可以看到wpa_supplicant服务的启动。

     

    7. 怎么实现远程观看界面?

    qemu提供了VNC Server的实现,可以通过-qemu -vnc :2打开。然后可以用任何实现了VNC协议的客户端连接到虚拟机上,实现远程控制。

    VNC (Virtual Network Computing)虚拟网络计算机的缩写 VNC是把被控制端的屏幕做成图像,经过压缩后传送到控制端,控制端的控制信息(如鼠标信息)传送到被控制端后进入消息队列。这样就实现了远程控制服务端机器的能力。

    VNC采用RFB通信协议,RFB ("remote 帧缓存 ") 是一个远程图形用户的简单协议,通过TCP/IP 协议簇连接。VNC控制端和被控制端在连接时会协商彼此支持的编码方式,编码方式已经发展出了很多种,有压缩率高的但编解码算法复杂,有压缩率低一些但编解码算法相对简单的,根据网络情况和客户端计算能力选择合适的。通常的编码方式是当原始的满屏被发送后,只发送变化的方块区域。分块算法和图像压缩技术随不同编码方式变化。目前采用的noVNC是用的Tight编码方式,按照相关测评数据[2],这是一个压缩率高比较节省带宽的编码方式。注:算法实现可以在aosp/6.0/system/external/libvncserver找到,或者在qemu2.4/ui/vnc-enc-xxx.c

     "Hextile" is an encoding that was designed for fast networks, while "Tight" is better suited for low-bandwidth connections. From the other side, "Tight" decoder in the TightVNC Java viewer seems to be more efficient than "Hextile" decoder so it may be ok for fast networks too. "ZRLE" encoding is similar to "Tight", but it does not support JPEG compression and compression levels.

     

    8. 怎么给每台模拟器赋予一个imei?

    部分应用通过判断IMEI是否是0来甄别模拟器,阻止在模拟器上运行。

     

    Qemu/android_qemu/telephony/modem.cCGSN处定义了IMEI的值,所以模拟器里显示的IMEI的值是0000000000。要修改这里获取IMEI的方法

     

     

    9. Root的处理

     App里通过su获得root权限代码:

     

    需要注意的是,真机adb shell进去的默认是shell用户,模拟器里adb shell进去默认的就是root用户了,可以进行高权限的行为。模拟器镜像里也内置了su, 可以在shell里通过su命令切换shell/root用户,但是原始的su只可以由uidAID_ROOTAID_SHELL的进程调用,所以这些只是可以在PC端通过adb来使用。 第三方apk里是没法通过上面的java代码去切换到root用户的。

        这就需要替换掉原始的su文件,突破进程校验的限制。这里借助了supersu提供的文件进行处理。用supersu提供的su文件替换原始的/system/bin/su,安装supersua.apk来进行权限管理。

        基本原理是将apk层传入的本应放在shell进程中执行的命令,放到daemonsu 创建的进程sush中执行。其中daemonsu 为开机时启动的守护进程(init进程启动,userroot)

         这个过程最重要的为:apksudaemonsusushsupersu.apk 之间的通信。

         通信过程大概为:

         1、三方进程调用susu 通过socket daemonsu 通信,

         2daemonsu 创建sush

         3sush 通过 am 启动 superuser apk ,让用户选择是否授予其root权限。

         4supersu.apk 通过socket 告知 sush 用户选择的结果

         5sush 根据 apk 传过来的结果,选择继续执行或中断执行

     

    其他:

    1. 有时候会看到goldfish这个名词,按照文档说明,goldfish是专门为了模拟器运行的虚拟硬件平台的名字,早期只提供了模拟arm架构的处理器,现在已经有了x86MIPS的。

    'goldfish' is the name of a family of similar virtual hardware platforms, that

    mostly differ in the virtual CPU they support. 'goldfish' started as an

    ARM-specific platform, but has now been ported to x86 and MIPS virtual CPUs.

     

    参考:

    1.C语言编译详解

    http://www.cnblogs.com/CarpenterLee/p/5994681.html

    2.VNC

    http://www.tightvnc.com/archive/compare.html

    http://www.docin.com/p-1446032132.html

    3.android emulator源码

    https://android.googlesource.com/platform/external/qemu/+/master/docs/DEVELOPMENT.TXT

    4.Houdini

    http://blog.csdn.net/roland_sun/article/details/50132175

     

    展开全文
  • Android判断是模拟器还是真机

    千次阅读 2020-06-01 17:06:30
    接到了一个需求,要求判断是当前是模拟器还是真机,还给了一张图,吃鸡都能做到,所以我们也一定能做到。(似曾相似的一句话:微信都能做,为什么我们不能做?) 记得多年以前研究过这个,模拟器的各种参数都可以改...
  • Android studio 三大模拟器比较

    万次阅读 热门讨论 2018-05-11 15:31:15
    自己不对比试试真是不知道卡死了)2.genymotion模拟器-----(缺点:安装有点小麻烦)下载地址:https://www.genymotion.com/download/有免费版本和收费版本,选择免费的就好啦傻瓜式安装,安装完后开始在Android ...
  • android10开发——使用adb进入模拟器开启桌面模式 由于开发只有最新的android10才支持原生的桌面模式,公司又没有pixel手机,所以这里只能通过模拟器开启android10桌面模式,相关内容比较少,特此记录如下。 打开...
  • Android原生模拟器运行ARM APP

    千次阅读 2019-10-23 19:01:13
    Google原生模拟器运行ARM APPINSTALL_FAILED_NO_MATCHING_ABISGoogle原生APP安装微信(Android 6.0) INSTALL_FAILED_NO_MATCHING_ABIS 安装APK的时候出现这个错误,其实是当你试图安装一个具有本地库的应用程序时,...
  • android 模拟器介绍

    2020-07-11 11:23:26
    Android模拟器开发和调试应用比使用真机方便,而且可以修改模拟器源码,android 源码,随心所欲地模拟自己想要的设备,随心所欲地修改android 源码,甚至是更底层的linux 源码。 目录 模拟器源码下载 编译 ...
  • Linux (Ubuntu) 下的Android模拟器:Genymotion

    万次阅读 多人点赞 2015-11-19 11:11:51
    据说这是一款十分好用的Android模拟器,之前没玩过Android模拟器,这就是自己第一次使用。Downloads:https://www.genymotion.com/ 麻烦的是需要现注册才能下载。有收费版,也有免费版,点击buy genymotion,页面往...
  • Android 模拟器不能上网的解决

    千次阅读 2019-02-01 14:17:50
    自己的 电脑可以上网,而android 模拟器不能上网,是因为电脑的DNS与模拟器的DNS不同,可以打开cmd使用ipconfig/all命令查看自己电脑的DNS。因为电脑跟模拟器的DNS不同,会导致不在一个网段,因此模拟器不能上网。 ...
  • Appium搭建五:安装Android模拟器

    千次阅读 2018-11-21 13:54:05
     这里不仅详细介绍了安装Android模拟器的整个过程,而且细致到每一步的安装内容和目的是什么,更好的理解Android模拟器可能需要用到的插件、环境等等。  第三节 安装Android 模拟器  我这里以Android 4.4.2...
  • 设置Android模拟器上网的方法

    千次阅读 2018-06-04 14:53:28
    很多网友也问到为啥自己在家的PC机可以上网,而运行在PC机上面的android模拟器却不能上网呢?是因为家里的PC机的DNS一般为:192.168.1.1,这个只是一般而言,不是绝对,这个得自己使用ipconfig /all命令检查下;而...
  • 告诉大家一个好消息,Google 最近发布了新版 Android 模拟器,将类似冷启动和暖启动的模式引入到模拟器中,号称重启模拟器的时间降低到 6 秒内。我也在第一时间升级体验过,竟然能快至 1 秒启动,简直不要太给力! ...
  • 比真机还快的Android模拟器——Genymotion

    万次阅读 多人点赞 2014-10-15 10:53:27
    比真机还快的Android模拟器——Genymotion 本文引言: 还在为开个程序等半个小时,跑个程序等半天而苦恼不已么?在本节中给大家介绍一款比真机还快的模拟器-Genvmotion 笔者作为一名没收入的大学狗,不像一些在公司工作...
  • Android模拟器尺寸随意改

    千次阅读 2015-01-07 14:58:14
    那么今天大家可以通过对Android模拟器尺寸的大小修改方法进一步对模拟器有一个深入的了解。   Android模拟器提供了4个标准的skin供我们使用,分别对应HVGA(横屏/竖屏)和QVGA(横屏/竖屏),我们只要在启动模拟器...
  • android 模拟器实现发短信

    千次阅读 2019-03-07 15:32:53
    内容介绍:创建两个Android模拟器,通过一个与另一个进行短信交流。模拟器界面包括两个输入框和一个按钮。在第一个框中输入电话号码,第二个框中输入短信内容,点击按钮发送短信。本文代码在Eclipse中调式完成。 ...
  • 如何在Android模拟器上访问本地的Web应用? 例如,在你的开发机器上启动一个Tomcat服务,接着打开电脑上的浏览器,默认情况下输入http://localhost:8080/就能够访问到Tomcat的主页面;那么,如果我们想在Android...
  • Android 模拟器指令(全)

    千次阅读 2012-06-09 19:36:13
    Android模拟器ndroid SDK自带一个移动设备模拟器 — 它是一个可以运行在你电脑上的虚拟设备. Android模 拟器可以让你不需使用物理设备即可预览、开发和测试Android应用程序. Android模拟器能够模拟除了接听和...
1 2 3 4 5 ... 20
收藏数 114,247
精华内容 45,698
关键字:

android模拟器