精华内容
下载资源
问答
  • Android虚拟手机快速启动

    千次阅读 2015-07-12 18:20:23
    Android虚拟手机快速启动

            通过开启BIOS的“Intel Virtual Technology”(Intel虚拟化技术)功能实现Android虚拟手机快速启动的例子不胜枚举,但大多操作性不强,不太明了,今天在T440p机器上配了一次,现将步骤总结一下:

            1、检查自己计算机是不是Intel CPU并且支持“Intel Virtual Technology”,如果不是Intel CPU或者是Intel CPU但不支持“Intel Virtual Technology”,则本篇博客就不用往下看了大笑

            2、重启计算机,进入其BIOS,然后将“Intel Virtual Technology”功能开启。说明:由于不同计算机的Intel型号不同,所以设置项在BIOS的位置也不一样,具体可以根据Intel CPU的型号在网上百度;

            3、下载haxm安装包,解压并安装haxm。下载地址:http://download.csdn.net/download/wangshuxuncom/8892697

            4、下载适合Android API 层级的Intel x86 Atom System Image,下载地址(请使用迅雷下载):

            system-images/android-10:http://dl-ssl.google.com/android/repository/sys-img/x86/sysimg_x86-10_r02.zip
            system-images/android-15:https://dl-ssl.google.com/android/repository/sys-img/x86/sysimg_x86-15_r01.zip
            system-images/android-16:https://dl-ssl.google.com/android/repository/sys-img/x86/sysimg_x86-16_r01.zip
            system-images/android-17:http://dl-ssl.google.com/android/repository/sys-img/x86/sysimg_x86-17_r01.zip
            system-images/android-18:http://dl-ssl.google.com/android/repository/sys-img/x86/sysimg_x86-18_r01.zip
            system-images/android-19:http://dl-ssl.google.com/android/repository/sys-img/x86/sysimg_x86-19_r02.zip
            system-images/android-20/android-wear:https://dl-ssl.google.com/android/repository/sys-img/android-wear/sysimg_wear_x86-20_r01.zip
            system-images/android-L:https://dl-ssl.google.com/android/repository/sys-img/android/sysimg_x86-L_r01.zip
            system-images/android-L/android-tv:https://dl-ssl.google.com/android/repository/sys-img/android-tv/sysimg_tv_x86-L_r01.zip

            将下载下来的压缩文件解压,然后拷贝到sdk文件夹中名为“system-images/android-Android API 层级”的目录下。

            5、重启Android版Eclipse开发工具,在新建或修改Android虚拟机时进行如下配置: a、CPU/ABI处选择“Intel Atom( X86)”;b、Emulation Options处勾选Use Host GPU。如下图所示:


            呵呵呵,好了,启动一下这时的Android虚拟机吧,它的启动速度和真机有一比大笑

    展开全文
  • android虚拟手机云之一:总述

    千次阅读 2018-03-07 17:56:53
    我也记一下强哥的介绍,加上我自己的理解,理清下整个虚拟手机云项目。下面是给我自己的笔记。希望以后在改到android框架的时候能有一点帮助。 这个项目对Android 6.0系统有几个重大的修改: 支持应用多开 支持...

    年前福哥离开了,今天和强哥交接了下代码。强哥从头介绍了下项目,挺伤感的。我也记一下强哥的介绍,加上我自己的理解,理清下整个虚拟手机云项目。下面是给我自己的笔记。希望以后在改到android框架的时候能有一点帮助。

    这个项目对Android 6.0系统有几个重大的修改:

    Android之外的修改,深度修改网易的ATX框架,开源在-> wuyisheng/ATX

    这个是总述,整理好了再更新细节吧~

    展开全文
  • android虚拟手机云之三:文件沙盒

    千次阅读 2018-03-07 18:05:21
    到了android 8,App就算不用外部sdcard也可以放一堆东西,通过FileProvider也可以提供跨应用的数据。但是正如大家诟病的,许多APP还是会申请sdcard的读写权限。 我们在测试的过程中,发现某些安全库,会写死一些边...

    总贴 在这里。

    支持文件系统隔离

    我们管这个叫做文件沙盒。其实android的沙盒是不彻底的,因为sdcard下的路径全部APP共享。 到了android 8,App就算不用外部sdcard也可以放一堆东西,通过FileProvider也可以提供跨应用的数据。但是正如大家诟病的,许多APP还是会申请sdcard的读写权限。
    我们在测试的过程中,发现某些安全库,会写死一些边边角角的可读写的地方,去放东西,这个很恶心。

    哦,说句题外话,android系统的东西都是放在/data/data下的,许多奇奇的目录都是符号连接,rm -rf /data/data/* 就可以达到出厂设置的效果。

    ok,我们的方案是怎么做的呢,有几个点:

    • 要根据上文的instance_no,来新建文件目录
    • 在zygote初始化的时候动态mount新建的目录,设置这个目录可读写
    • 在kernel中,如果是多开进程的文件访问,都给截获,重新映射到这个mount的目录

    instance_no部分上一篇博客说了,mount部分是这样做的:
    在zygote的 pid_t pid = fork() pid != 0之后

    if (access (abs_path, F_OK) < 0) {
        ALOGW ("Zg: Target path %s for %s does not exist: err=%d, skip it.", abs_path, source_path, errno);
        continue;
    }
    
    if (TEMP_FAILURE_RETRY (mount (source_path, abs_path, NULL, MS_BIND, NULL)) < 0) {
        ALOGE ("Zg: Failed to mount %s to %s: err=%d", source_path, abs_path, errno);
        closedir (app_root);
        RuntimeAbort (env);
    }

    值得一提的是,zygote fork进程之后,通过设置

    SetCapabilities(env, permittedCapabilities, effectiveCapabilities);

    把linux上的权限给阉割了,这也是为什么su 要在另外一个进程执行的原因(因为zygote 建出来的进程就没有任何权限)

    kernel部分,主要是修改syscall部分。就是把open、access等系统调调的时候,获取标识位,看看是不是hook过的,如果是的话,就映射下读取路径。这样的话,/data/data 下的文件路径就被映射到我们上面mount的路径中去了。

    kernel/fs/open.c

    #ifdef CONFIG_INTERCEPT_FILE_SYSCALLS
        /* Lionfore for ML. Sep 11th, 2017 */
        if (this_process_should_be_intercepted ()) {
            xd_access_syscall_req_t req;
            xd_access_syscall_res_t rsp;
    
            res = __filename_absolute_path (dfd, filename, lookup_flags, req.path);
            if (res < 0)
                goto __trace_syscall; /* Lionfore for ML. Sep 15th, 2017 */
    
            req.hdr.type = XD_ACCESS_SYSCALL_REQ;
            req.hdr.len = sizeof req;
            req.hdr.pid = current->pid;
            req.hdr.app_tag = get_process_inst_no (current);
            req.mode = mode;
            req.uid = __kuid_val (current_cred ()->euid);
            req.gid = __kgid_val (current_cred ()->egid);
            rsp.hdr.len = sizeof rsp;
            res = intercept_syscall (&req.hdr, &rsp.hdr);
            if (res < 0)
                goto __trace_syscall; /* Lionfore for ML. Sep 15th, 2017 */
    
            if (rsp.hdr.err < 0) {
                res = rsp.hdr.err;
                goto __trace_syscall; /* Lionfore for ML. Sep 15th, 2017 */
            }
        }
    #endif

    需要注意的是 readlink 这个系统调用也要改,代码在

    kernel/fs/namei.c

    关于软连接和硬连接的介绍,看这里

    小结一下。上面介绍了通过zygotekernel的系统调用的修改。在打开新应用的时候动态创建目录,动态映射目录,做到了文件系统隔离的效果。

    其实在android8之后,规范的写android,机会可以不用用到外部存储,所以应用里面的简单沙盒其实是够用的。

    不够用的时候,可能是出于 唯一标识 && 安全 方面的考量。

    • 比如我在每个碎片话的系统(mi,huawei、魅族)在一些边边角角可读可写的目录,用户不会清理到的地方,放一点自定义文件,存着key,然后全家桶都用这个key来作为用户标识。
    • 如果在两个不同的账号下同时读到同一个key,那就是多开了:)
    展开全文
  • android虚拟手机云之二:应用多开

    千次阅读 2018-03-07 18:00:51
    this_is_android_user_app () /* System app also needs to be considered. Aug 21st, 2017 */) { setCallingInstNo (tr.sender_inst_no); /* Set our inst_no to the sender 's one. -- Lionfore for ML. Jul ...

    总贴 在这里。

    支持应用多开

    应用多开我们有找到几种解决办法。
    - 修改包名
    - 拓展ActivityStack
    - 拓展Intent

    修改包名

    这是最简单的一种实现,因为包名在系统里面是一个唯一值,所以在安装的时候,做下手脚,就可以多开许许多多个。

    存在的问题是:
    1,改包名应用会有感知
    2,无法解决资源的隔离问题

    发现MuMu模拟器就是这样多开的,就是修改下包名,然后把资源都复制一遍,当作一个新的应用来起。但是他们,覆盖安装没处理好,只是升级了母包,没升级子包,

    拓展ActivityStack

    这个是在修改多个应用在前台的时候强哥发现的,就是6.0已经有支持多开。后面提到多个应用在前台的细节在详细描述。

    拓展Intent

    我们知道,在打开应用的时候都是通过intent去调用的,在应用内部打开也是,所以在ActivityManagerServer中,拓展一下Intent,传多一个维度的参数,就可以实现多开。我们用的是这个方法。后面的网络隔离,端口隔离,文件隔离也都是基于这个修改的。这个要在zygote中做处理。
    zygote代码在: framework/base/core/jni/com_android_internal_os_Zygote

    重点的修改自然是在ActivityManagerServer.java中,这里不展开讲。和市面上的应用多开hook的原理基本是一样的。(弄懂了四大组件就可以了的 )但是不同的是,这个是直接修改系统代码的,不用hook。

    还是展开一点点吧 :)

    final ProcessRecord startProcessLocked(String processName, int inst_no /* Lionfore for ML. */,
            ApplicationInfo info, boolean knownToBeDead, int intentFlags,
            String hostingType, ComponentName hostingName, boolean allowWhileBooting,
            boolean isolated, boolean keepIfLarge) {
        return startProcessLocked(processName, inst_no, info, knownToBeDead, intentFlags, hostingType,
                hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
                null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
                null /* crashHandler */);
    }

    有个技巧,可以在proc中打开一个节点,然后当前进程中的所有函数都可以获取这个instance_no

    /* Split it out to a separate function. Lionfore for ML, Jul 28th, 2017 */
    static __inline__ int __set_process_inst_no (int inst_no)
    {
        int fd;
        ssize_t err;
    
        fd = open ("/proc/self/instance_no", O_WRONLY);
        if (fd < 0)
            return -1;
    
        err = write (fd, &inst_no, sizeof (int));
        if (err != sizeof (int)) {
            int e = errno;
            close (fd);
            errno = e;
            return -1;
        }
    
        close (fd);
        return 0;
    }

    说个细节点吧,binder的修改。主要是在/framework/native/libs/binder/IPCThreadState.cpp 做一点修改:

    status_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,
        int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
    {
        ...
        tr.sender_inst_no = get_calling_inst_no (); /* Lionfore for ML. Jul 8th, 2017 */
        ...
    }
    
    ...
    
    status_t IPCThreadState::executeCommand(int32_t cmd)
    {
        ...
        switch ((uint32_t)cmd) {
            ...
            case BR_TRANSACTION:
            ...
                /* Lionfore for ML. Jul 28th, 2017 */
            if (!this_is_android_user_app () /* System app also needs to be considered. Aug 21st, 2017 */) {
                setCallingInstNo (tr.sender_inst_no); /* Set our inst_no to the sender's one. -- Lionfore for ML. Jul 8th, 2017 */
                setCallingProcessAndroidFlags (tr.sender_android_flags); /* Set our android_flags to the sender's one. -- Lionfore for ML. Jul 28th, 2017 */
            }
            ...
        }
    }
    
    ...
    int IPCThreadState::setCallingInstNo (int inst_no)
    {
        int fd;
        ssize_t err;
    
        fd = open ("/proc/thread-self/calling_inst_no", O_WRONLY);
        if (fd < 0)
            return -errno;
    
        err = write (fd, &inst_no, sizeof (int));
        if (err != sizeof (int))
            err = (ssize_t)(-errno);
    
        close (fd);
        return (int)err;
    }

    就是把多出来的这个维度记一下,传过去。为什么要这样做呢?
    因为binder很多时候会调用到系统的进程,根据我们上面的描述,系统进程里面是没有这个instance_no的。所以

    1,是为了找到对应的App实例进行回调。
    2,为了设定每个instance_no下的那一堆APP不会混。

    这样改完一轮之后,在修改下am start packgae_name的指令就可以了。这个在framework/base/cmds/am/...Am.java 就是过滤下参数,然后构造intent而已。

    展开全文
  • 在eclipse打开的android虚拟手机,打开FileExplorer,下面是空的没有data、mnt、system三个文件 Explorer,下面是空的没有data、mnt、system三个文件" title="在eclipse打开的android虚拟手机,打开File Explorer,...
  • 总贴 在这里。 支持多个应用在前台 先说下背景吧,很多App都有是否在前台的检测,前后台...改动的时候,涉及到Android的窗口管理机制,但是最本质的改动还是在ActivityStack.java中 frameworks/base/services/...
  • function init_xd_netns() { tmpfs_dir="/var/run/netns" mkdir -m 777 -p $tmpfs_dir && chmod 0777 /var/run && mount -t tmpfs -o size=10M,mode=0777 tmpfs $tmpfs_dir }
  • 详情vmos下载,安卓虚拟器在,支持模块支持...vmos下载app功能是独立的虚拟手机系统,不受真机系统限制,能满足开发和测试的需求,不用担心病毒和系统崩溃的风险。自带root权限,支持XP框架和谷歌套件,满足极客手机...
  • 尤其对于安卓手机来说,自从系统进入4.0时代,越来越多的安卓手机开始使用虚拟按键设计,同时按键由原来的四大天王改为现在的返回键、Home键和菜单键。谷歌以及使用安卓系统的手机厂商为什么把实体按键改为虚拟键呢...
  • 主要为大家详细介绍了Android实现手机游戏隐藏虚拟按键,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了Android隐藏手机底部虚拟按键的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • android 隐藏手机底部虚拟按键

    万次阅读 2018-03-30 08:38:22
    今天,简单讲讲android如何隐藏手机下面的虚拟按键。 其实,自己在做界面适配时,老是发现了华为手机存在适配的问题,主要就是华为手机有一个底部的虚拟按键占用了界面的部分空间,所以在网上搜索了如何隐藏...
  • 虚拟光驱以其读取速度快、换盘方便、管理容易得到了广大用户的青睐。但是虚拟光驱软件众多,每个软件都各有千秋。 虚拟光驱有很多一般光驱无法达到的功能,例如运行时不用光盘,即使没用光驱也可以,同时执行多张...
  • 主要为大家详细介绍了Android实现隐藏手机底部虚拟按键,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 前言:现在很多安卓手机都取消了实体键或者触摸键,那么,代替这些按键的就是手机虚拟按键了,比如GN、N4等手机都有虚拟按键,你是不是觉得这些虚拟按键很有趣呢?其实,谷歌在发布安卓4.0的时候,就为系统自身...
  • Android 手机虚拟按键高度计算
  • Android部分机型没有物理按键,只有虚拟按键,Activity全屏方法如下: 1、在这句 setContentView(R.layout.activity_main); 之前添加 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_...
  • Android 隐藏手机底部虚拟按键

    万次阅读 2017-03-08 11:00:54
    现在的手机比较流行底部带虚拟按键,比如华为、nexus,一般情况下对开发一个APP没啥影响,但是不一般情况下就会有影响的,比如全屏录像功能, 用简单的方法直接获取camera支持的手机屏幕分辨率然后用SurfaceView...
  • 关于屏内虚拟按键设计的好坏,一直都存在很大的争议。围绕着屏内虚拟按键,支持者与反对者之间进行了长期的争论,至今仍未分出胜负。然而,当多功能前置指纹按键开始普及的时候,屏内虚拟按键似乎正在逐步走向边缘化...
  • 有许多使用安卓的小伙伴说自己内存一直是不够用,其实我们通过设置它的虚拟内存来解决,下面是学习啦小编为大家介绍安卓手机设置增加虚拟内存的方法,欢迎大家阅读。安卓手机设置增加虚拟内存的方法1这里只讲解一个最...
  • 安卓如何增加虚拟内存?一般情况下,系统占用手机运行内存(RAM)太多,导致剩余RAM太少,从而造成设备在运行过程中不够流畅。...怎么给安卓手机增加虚拟内存?首先.SD卡的速度要达到C4第二.手机内核支...
  • 手机游戏实现Android隐藏虚拟按键

    千次阅读 2016-11-03 11:44:07
    手机游戏实现Android隐藏虚拟按键游戏的加载过程中,初始化检查更新,然后进入到游戏画面,实际上是android的2个view的切换。其中MainActivity中,在onCreate()方法中添加如下函数并且复写一个方法就可以了。@...
  • 两款手机都是1080*1920的分辨率,一个手机又导航栏,一个手机没有,请问怎么适配

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,045
精华内容 19,218
关键字:

安卓虚拟手机