android 4.0.3 rom虚拟机如何关机?

您所在的位置: &
深入解析Android关机
深入解析Android关机
最后关机一定是在Linux kernel完成,说到底层其实就是Linux。所有的调用是为了停掉运行Android的虚拟机Dalvik和Dalvik与Kernel交互用的Server,至于关机按钮怎么用,就是改改系统调用的事情。
Android&关机顺序
当我们长按电源按钮时,手机里究竟发了什么?
什么又是关机顺序?
Android的关机顺序与Linux桌面系统有何不同?
如何更改关机菜单?
当我们说起Android的关机顺序时,许多诸如此类的问题便会涌进我们的脑袋。&不过,在继续阅读之前,建议您首先能对开机顺序有一个了解。
Android是基于Linux内核的开源操作系统。尽管x86(x86&是一系列计算机微处理器指令集及其架构的统称,这种架构基于Intel&8086&CPU)是大多数Linux系统所采用的处理器架构,然而绝大多数Android系统却运行于ARM架构之上(ARM,又称Advanced&RISC&Machine,其前身为Acorn&RISC&Machine),除了来自。这种移动设备使用了Atom&1.&6Ghz&x86处理器。&但不论哪种架构,Android的关机顺序都区别于Linux的桌面系统,如Ubuntu、Fedora等。&本文主要介绍Android的关机顺序,&如果想更多地了解Linux桌面系统的关机顺序,请参考。
下图详细阐释了Android的关机顺序。
第一步:&按住电源按钮半秒钟(500ms)。
第二步:&之后,PhoneWindowManager.java&将捕获长按电源按钮这一事件并调用&interceptKeyBeforeQueueing&方法。
下面是处理长按电源键事件的代码片段
&@Override&public&int&interceptKeyBeforeQueueing(KeyEvent&event,&int&policyFlags,&boolean&isScreenOn)&{&....&....&....&case&KeyEvent.KEYCODE_POWER:&{&&&&&&result&&=&~ACTION_PASS_TO_USER;&&&&&&&&if&(down)&{&&&&&&&&&&if&(isScreenOn&&&&!mPowerKeyTriggered&&&&&&&&&&&&&&&&&&&(event.getFlags()&&&KeyEvent.FLAG_FALLBACK)&==&0)&{&&&&&&&&&&&&&&&&&&&&mPowerKeyTriggered&=&true;&&&&&&&&&&&&&&&&&&&&mPowerKeyTime&=&event.getDownTime();&&&&&&&&&&&&&&&&&&&&interceptScreenshotChord();&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&ITelephony&telephonyService&=&getTelephonyService();&&&&&&&&&&&&&&&&&boolean&hungUp&=&false;&&&&&&&&&&&&&&&&if&(telephonyService&!=&null)&{&&&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&if&(telephonyService.isRinging())&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&telephonyService.silenceRinger();&&&&&&&&&&&&&&&&&&&&&&&&}&else&if&((mIncallPowerBehavior&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP)&!=&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&telephonyService.isOffhook())&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&hungUp&=&telephonyService.endCall();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&}&catch&(RemoteException&ex)&{&&&&&&&&&&&&&&&&&&&&&&&&&Log.w(TAG,&&ITelephony&threw&RemoteException&,&ex);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&interceptPowerKeyDown(!isScreenOn&||&hungUp&&&&&&&&&&&&&&&&&&&&&&&&||&mVolumeDownKeyTriggered&||&mVolumeUpKeyTriggered);&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&mPowerKeyTriggered&=&false;&&&&&&&&&&&&&&&&cancelPendingScreenshotChordAction();&&&&&&&&&&&&&&&&if&(interceptPowerKeyUp(canceled&||&mPendingPowerKeyUpCanceled))&{&&&&&&&&&&&&&&&&&&&&result&=&(result&&&~ACTION_WAKE_UP)&|&ACTION_GO_TO_SLEEP;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&mPendingPowerKeyUpCanceled&=&false;&&&&&&&&&&&&}&&&&&&&&&&&break;&&&&&&&}&....&....&....&}&
上面的代码包含了对多种情形下对长按电源键时间的处理,例如静默来电响铃、屏幕截图以及关闭电源等。&系统将根据电源键被按住的时间长短以及相关按键的使用情况来决定如何恰当地处理当前的用户操作。&当电源键被按下且没有截屏操作触发时interceptPowerKeyDown&将被调用,这时其他的按键响应(其他按键响应指&interceptKeyBeforeQueueing&中其他cases)将不会被触发。
下面的代码展示了&interceptPowerKeyDown&函数内容,&函数将注册一个回调函数,在500毫秒超时事件(ViewConfiguration#getGlobalActionKeyTimeout())触发时启动&mPowerLongPress&线程。
private&void&interceptPowerKeyDown(boolean&handled)&{&&&mPowerKeyHandled&=&&&&if&(!handled)&{&&&&&&&&mHandler.postDelayed(mPowerLongPress,&ViewConfiguration.getGlobalActionKeyTimeout());&&&}&}&
mPowerLongPress&线程的实现如下:
private&final&Runnable&mPowerLongPress&=&new&Runnable()&{&&&&&&&&&@Override&&&&&&&&&public&void&run()&{&&&&&&&&&&&&&&&&&&&&&&&&&&if&(mLongPressOnPowerBehavior&&&0)&{&&&&&&&&&&&&&&&&&mLongPressOnPowerBehavior&=&mContext.getResources().getInteger(&&&&&&&&&&&&&&&&&&&&&&&&&com.android.internal.R.integer.config_longPressOnPowerBehavior);&&&&&&&&&&&&&}&&&&&&&&&&&&&int&resolvedBehavior&=&mLongPressOnPowerB&&&&&&&&&&&&&if&(FactoryTest.isLongPressOnPowerOffEnabled())&{&&&&&&&&&&&&&&&&&resolvedBehavior&=&LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;&&&&&&&&&&&&&}&&&&&&&&&&&&&&&switch&(resolvedBehavior)&{&&&&&&&&&&&&&case&LONG_PRESS_POWER_NOTHING:&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&case&LONG_PRESS_POWER_GLOBAL_ACTIONS:&&&&&&&&&&&&&&&&&mPowerKeyHandled&=&true;&&&&&&&&&&&&&&&&&if&(!performHapticFeedbackLw(null,&HapticFeedbackConstants.LONG_PRESS,&false))&{&&&&&&&&&&&&&&&&&&&&&performAuditoryFeedbackForAccessibilityIfNeed();&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);&&&&&&&&&&&&&&&&&showGlobalActionsDialog();&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&case&LONG_PRESS_POWER_SHUT_OFF:&&&&&&&&&&&&&case&LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:&&&&&&&&&&&&&&&&&mPowerKeyHandled&=&true;&&&&&&&&&&&&&&&&&performHapticFeedbackLw(null,&HapticFeedbackConstants.LONG_PRESS,&false);&&&&&&&&&&&&&&&&&sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);&&&&&&&&&&&&&&&&&mWindowManagerFuncs.shutdown(resolvedBehavior&==&LONG_PRESS_POWER_SHUT_OFF);&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&}&&&&&&&&&}&&&&&};&
第三步:&由上面代码的Switch分支可知,当程序进去Long_Press_Power_Global_Options时控制将移交给&GlobalActions&类,&该模块则负责显示关机选项的对话框,这些选项在各Android发行版(各OEM厂商定制的Android系统,&不同的手机型号和不同版本的Android系统)中不尽相同,通常包括关闭电源、飞行模式和屏幕截图。也可能包括其他一些选项按键。GlobalActions&类实现了一个showdialog方法,该方法将根据当前系统支持的菜单内容来创建这个对话框。
void&showGlobalActionsDialog()&{&&&&&if&(mGlobalActions&==&null)&{&&&&&&&&&mGlobalActions&=&new&GlobalActions(mContext,&mWindowManagerFuncs);&&&&&}&&&&&final&boolean&keyguardShowing&=&keyguardIsShowingTq();&&&&&mGlobalActions.showDialog(keyguardShowing,&isDeviceProvisioned());&&&&&if&(keyguardShowing)&{&&&&&&&&&&&&&&&&&&&mKeyguardMediator.userActivity();&&&&&}&}&
第四步:&若用户选择&关闭电源&,则对系统的控制将交回给&PhoneWindowManager,&然后由PhoneWindowManager&启动关闭流程。
第五步:&整个关机过程起始于ShutdownThread模块中的shutdowninner方法。该方法首先创建一个确认对话框给用户,&用户可以选择确认关机或是取消关机操作。&如果用户选择确认,则系统将真正进入关机流程。
第六步:&如上所述,当用户点击确认按钮后beginShutdownSequence方法将被调用以启动关机顺序。
private&static&void&beginShutdownSequence(Context&context)&{&&&&&&&&&synchronized&(sIsStartedGuard)&{&&&&&&&&&&&&&if&(sIsStarted)&{&&&&&&&&&&&&&&&&&Log.d(TAG,&&Shutdown&sequence&already&running,&returning.&);&&&&&&&&&&&&&&&&&return;&&&&&&&&&&&&&}&&&&&&&&&&&&&sIsStarted&=&true;&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&ProgressDialog&pd&=&new&ProgressDialog(context);&&&&&&&&&pd.setTitle(context.getText(com.android.internal.R.string.power_off));&&&&&&&&&pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));&&&&&&&&&pd.setIndeterminate(true);&&&&&&&&&pd.setCancelable(false);&&pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);&&&&&&&&&pd.show();&&&&&&&&&sInstance.mContext&=&&&&&&&&&&sInstance.mPowerManager&=&(PowerManager)context.getSystemService(Context.POWER_SERVICE);&&&&&&&&&&&&&&&&&&sInstance.mCpuWakeLock&=&null;&&&&&&&&&try&{&&&&&&&&&&&&&sInstance.mCpuWakeLock&=&sInstance.mPowerManager.newWakeLock(&&&&&&&&&&&&&&&&&&&&&PowerManager.PARTIAL_WAKE_LOCK,&TAG&+&&-cpu&);&&&&&&&&&&&&&sInstance.mCpuWakeLock.setReferenceCounted(false);&&&&&&&&&&&&&sInstance.mCpuWakeLock.acquire();&&&&&&&&&}&catch&(SecurityException&e)&{&&&&&&&&&&&&&Log.w(TAG,&&No&permission&to&acquire&wake&lock&,&e);&&&&&&&&&&&&&sInstance.mCpuWakeLock&=&null;&&&&&&&&&}&&&&&&&&&&&&&&&&&&sInstance.mScreenWakeLock&=&null;&&&&&&&&&if&(sInstance.mPowerManager.isScreenOn())&{&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&sInstance.mScreenWakeLock&=&sInstance.mPowerManager.newWakeLock(&&&&&&&&&&&&&&&&&&&&&&&&&PowerManager.FULL_WAKE_LOCK,&TAG&+&&-screen&);&&&&&&&&&&&&&&&&sInstance.mScreenWakeLock.setReferenceCounted(false);&&&&&&&&&&&&&&&&&sInstance.mScreenWakeLock.acquire();&&&&&&&&&&&&&}&catch&(SecurityException&e)&{&&&&&&&&&&&&&&&&&Log.w(TAG,&&No&permission&to&acquire&wake&lock&,&e);&&&&&&&&&&&&&&&&&sInstance.mScreenWakeLock&=&null;&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&&&&&&&&sInstance.mHandler&=&new&Handler()&{&&&&&&&&&};&&&&&&&&&sInstance.start();&&&&&}&
运行函数,启动实际的关机流程
public&void&run()&{&&&&&&&&&BroadcastReceiver&br&=&new&BroadcastReceiver()&{&&&&&&&&&&&&&@Override&public&void&onReceive(Context&context,&Intent&intent)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&actionDone();&&&&&&&&&&&&&}&&&&&&&&&};&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&String&reason&=&(mReboot&?&&1&&:&&0&)&+&(mRebootReason&!=&null&?&mRebootReason&:&&&);&&&&&&&&&&&&&SystemProperties.set(SHUTDOWN_ACTION_PROPERTY,&reason);&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&if&(mRebootSafeMode)&{&&&&&&&&&&&&&SystemProperties.set(REBOOT_SAFEMODE_PROPERTY,&&1&);&&&&&&&&&}&&&&&&&&&&&Log.i(TAG,&&Sending&shutdown&broadcast...&);&&&&&&&&&&&&&&&&&&&&mActionDone&=&false;&&&&&&&&&Intent&intent&=&new&Intent(Intent.ACTION_SHUTDOWN);&&&&&&&&&intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);&&&&&&&&&mContext.sendOrderedBroadcastAsUser(intent,&&&&&&&&&&&&&&&&&UserHandle.ALL,&null,&br,&mHandler,&0,&null,&null);&&&&&&&&&&&final&long&endTime&=&SystemClock.elapsedRealtime()&+&MAX_BROADCAST_TIME;&&&&&&&&&synchronized&(mActionDoneSync)&{&&&&&&&&&&&&&while&(!mActionDone)&{&&&&&&&&&&&&&&&&&long&delay&=&endTime&-&SystemClock.elapsedRealtime();&&&&&&&&&&&&&&&&&if&(delay&&=&0)&{&&&&&&&&&&&&&&&&&&&&&Log.w(TAG,&&Shutdown&broadcast&timed&out&);&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&mActionDoneSync.wait(delay);&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&Log.i(TAG,&&Shutting&down&activity&manager...&);&&&&&&&&&&&final&IActivityManager&am&=&&&&&&&&&&&&&ActivityManagerNative.asInterface(ServiceManager.checkService(&activity&));&&&&&&&&&if&(am&!=&null)&{&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&am.shutdown(MAX_BROADCAST_TIME);&&&&&&&&&&&&&}&catch&(RemoteException&e)&{&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&shutdownRadios(MAX_RADIO_WAIT_TIME);&&&&&&&&&&&&&&&&&&&&IMountShutdownObserver&observer&=&new&IMountShutdownObserver.Stub()&{&&&&&&&&&&&&&public&void&onShutDownComplete(int&statusCode)&throws&RemoteException&{&&&&&&&&&&&&&&&&&Log.w(TAG,&&Result&code&&&+&statusCode&+&&&from&MountService.shutdown&);&&&&&&&&&&&&&&&&&actionDone();&&&&&&&&&&&&&}&&&&&&&&&};&&&&&&&&&&&Log.i(TAG,&&Shutting&down&MountService&);&&&&&&&&&&&&&&&&&&&&mActionDone&=&false;&&&&&&&&&final&long&endShutTime&=&SystemClock.elapsedRealtime()&+&MAX_SHUTDOWN_WAIT_TIME;&&&&&&&&&synchronized&(mActionDoneSync)&{&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&final&IMountService&mount&=&IMountService.Stub.asInterface(&&&&&&&&&&&&&&&&&&&&&&&&&ServiceManager.checkService(&mount&));&&&&&&&&&&&&&&&&&if&(mount&!=&null)&{&&&&&&&&&&&&&&&&&&&&&mount.shutdown(observer);&&&&&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&&Log.w(TAG,&&MountService&unavailable&for&shutdown&);&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&&&&Log.e(TAG,&&Exception&during&MountService&shutdown&,&e);&&&&&&&&&&&&&}&&&&&&&&&&&&&while&(!mActionDone)&{&&&&&&&&&&&&&&&&&long&delay&=&endShutTime&-&SystemClock.elapsedRealtime();&&&&&&&&&&&&&&&&&if&(delay&&=&0)&{&&&&&&&&&&&&&&&&&&&&&Log.w(TAG,&&Shutdown&wait&timed&out&);&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&mActionDoneSync.wait(delay);&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&}&&&&&&&&&}&&&&&&&&&&&rebootOrShutdown(mReboot,&mRebootReason);&&&&&}&
第七步:&当rebootOrShutdown方法被调用时,系统控制权首先转至底层函数&nativeShutdown(在com_android_server_power_PowerManagerService。cpp中定义)&并最终调用android_reboot函数(定义于android_reboot.c中)来完成整个关机顺序
static&void&nativeShutdown(JNIEnv&*env,&jclass&clazz)&{&&&&&android_reboot(ANDROID_RB_POWEROFF,&0,&0);&}&
原文链接:
译文链接: /6356.html
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
寒冷的北京城依旧雾蒙蒙。北方的十二月本该是安逸静谧的,而帝都
既然强大的Android Studio来了,有什么理由不去用呢?
北京时间日,苹果在加利福尼亚召开新品发
免费下载+应用内购买(In-App Purchase)已成为移动应用
现在天气渐凉,秋意越来越浓厚了,上周,公司全体组织
本书将介绍如何创建可交互的Web站点,包括从最简单的订单表单到复杂的安全电子商务站点。而且,读者还将了解如何使用开放源代码
Windows Phone专家
Android开发专家
51CTO旗下网站5014人阅读
&1 命令行virsh reboot vm-name
&&&& kvm目前仍不支持reboot命令,'reboot' is not supported by the hypervisor
&2&虚拟机内部重启操作不成功,状态为关机,重启失败。
&& 原因配置文件中:
&on_poweroff&destroy&/on_poweroff&
& &on_reboot&restart&/on_reboot&
& &on_crash&destroy&/on_crash&
其中&on_reboot& 选项设置为restart则表示在虚拟机内部执行reboot但不关机,&如果设置为destroy则表示执行reboot命令后直接关机。
更多参数设置可参考liibvirt官网
3& kvm环境下可以使用shutdown命令让虚拟机关机,但不生效。
virsh shutdown vm-name
&由于关机通过acpi电源管理接口来实现的
& 3.1 首先配置文件里需要有这个选项
& &features&
&&& &acpi/&
&&& &apic/&
&&& &pae/&
& &/features&
& 3.2 虚拟机内部需要有acpi服务并运行
&&& Windowns的虚拟机一般情况是默认已安装且运行的
&&& linux虚拟机例如Ubuntu虚拟机如果没有安装acpi服务,
&&& 先执行apt-get install acpid进行安装并启动该服务,即可让虚拟机响应shutdown命令
依此方法通过ubuntu server 10.04.2,redhat6.0企业版,windows xp sp3 ,windows server2003操作系统进行验证均可以实现自然关机。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:112596次
积分:1458
积分:1458
排名:第11796名
原创:38篇
评论:24条
(1)(21)(21)(1)(1)403 - 禁止访问: 访问被拒绝。
403 - 禁止访问: 访问被拒绝。
您无权使用所提供的凭据查看此目录或页面。zqj101 的BLOG
用户名:zqj101
访问量:56770
注册日期:
51CTO推荐博文
不知道有多少Android开发着对Android虚拟机的那悲剧的性能有意见,反正我的看法是:那速度实在是太坑爹了!
为什么Android虚拟机比iOS和WP7的虚拟机要慢很多呢?原因如下:
1. Android 模拟器模拟的是 ARM 的体系结构(arm-eabi),而 iOS 和 WP7 的模拟器的目标体系结构都是 x86 的,另外 iOS 的模拟器中运行的 App 也是编译为 x86 的。这样一来 Android 模拟器需要做一些额外的二进制翻译工作。
2. Android 模拟器用的是 QEMU 的全系统模式(full system),也就说它模拟时需要启动整个 GUEST 系统,初始化各种模拟设备。相反的,iOS 和 WP7 的模拟器只是 user-mode 的模拟。
3. 在 Android 模拟器之中还需要跑一个 Dalvik VM,用以执行 Android 应用的 bytecodes。
综上所述,慢的一个主要原因就是虚拟机不是跑在x86上而是模拟的ARM,有没有办法弄个x86的Android呢?
答案是当然有&&&开源项目,这个牛B的开源项目将Android移植到了x86平台,系统运行的时候不再需要模拟成ARM,这样就能直接将Android装在PC或虚拟机上流畅的运行了。
1.下载Android-x86系统镜像文件
首先到下载android-x86-2.2-generic.iso,镜像文件大约85MB
2.在VMware上创建虚拟机
过程~照着这样做就行,我也不全懂&&我是小白(里面长的英语就不拼了,我也懒从这里开始,选择最后一项
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/qFx20B9ryFVdSEP5_nm-Lg==/5272360.jpg" />&
选择第一项(创建磁盘分区)
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/KLzNg2Vf2EbgWrjcNVPHAQ==/5272361.jpg" />&
进入这个界面,选择&NEW&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/heQbs13J0qutCiWS0HFsoA==/5272362.jpg" />&
选择&Primary(主分区)&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/EPFGUGhYU8BsTpu81mby-Q==/5272363.jpg" />&
点选&Bootable&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/SOKKb6sNSdljKkeLWTFtXQ==/5272364.jpg" />&
之后点选&Write&,在出现的&(yes or no)&提示后输入yes,回车
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/YrgeKTAn7lmoqmerGeDdVw==/5272365.jpg" />&
完成后点&Quit&进入如下界面
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/G9XaE96M0WN2fhYylV-70Q==/5272366.jpg" />&
回车之后&&分区格式(玩linux的都知道),这里我选了ext3
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/LBPr96e7k4GiRBGn69XsWg==/5272367.jpg" />&
接下来一路选&Yes&(就这样做吧,有一个说是需要更大空间神马的,能玩虚拟机的电脑怎么说也不在乎那么点空间吧)
到这里停~~创建SD卡
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="560" __9__="ev_" src="http://img.ph.126.net/JkDwoRv0HZX14xovmKho0Q==/5272368.jpg" />&
在这里我小辶讼拢褐氨拘“状唇SD卡无视后面的(max 2047)650) this.width=650;" style="word-wrap: break-word" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" __9__="ev_" src="http://img.ph.126.net/NMF0wUDV6NLhTh2CRYiCrA==/471189.jpg" />,结果&&&
安装结束后,重启进入Android这里,第二项比第一项的分辨率高,其他没啥区别貌似;第三项没试过&&&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/ucn6REC0xr06EOD6YkhEJQ==/5272369.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="509" __9__="ev_" src="http://img.ph.126.net/vHdhm8pHitMI5nZr7IblMg==/5272370.jpg" />&
键盘锁,乃懂得
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/IC_Ia1AkgXjG4ogHyXFskQ==/5272371.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/FWzEcoZOhNmygOQPpNwteg==/5272372.jpg" />&
先把语言改成母语吧:解锁后点那个 四点方阵 进入菜单,Settings
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/mWDnuLMhb8jv22rrCvgRew==/5272373.jpg" />&
找到 Language & keyboard(留意上面那个SD Card*****),Select Language,找到&中文(简体)&& && &倒数第二个650) this.width=650;" style="word-wrap: break-word" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" __9__="ev_" src="http://img.ph.126.net/_v0_9q_D7QSqxXic_JG_Xg==/407777.jpg" />
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/FaiV1uY-2jZdHTZcsiVacg==/5272374.jpg" />&
接着退出来,上面那个&SD Card*****&已经变成了&SD卡和手机内存&
【SD卡有时候不能自动安装,需要进入&SD卡和手机内存&选项,安装即可】
改下其他部分设置
设置里的&&应用程序&&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="581" __9__="ev_" src="http://img.ph.126.net/2jrX5G6zX5n2Kwmf0xEQSg==/5272375.jpg" />&
把&未知来源&的勾打亮
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/Gj_UtJENKB_jG0EAWszoqA==/5272376.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/NjRu-tZm2nvGtl8_nHOSag==/5272377.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/9kRnscmMdz38VL8CwkUAdQ==/5272378.jpg" />&
另外,也推荐修改这个设置
显示&&中,把&自动旋转屏幕&给灭了【否则在运行部分程序时得把电脑竖着放了650) this.width=650;" style="word-wrap: break-word" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" __9__="ev_" src="http://img.ph.126.net/cb67J8jZgSCbEhqLgXlUTw==/795263.jpg" />】
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/NP_pNvAUuocYS9r791ilKA==/5272379.jpg" />&
上网页下个Android版的QQ~~~
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/8PPe3Y3v9aE0O_Oks3tGaQ==/5272380.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/fRhzGZkWO8ZN8B5ALXEH4w==/5272381.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="209" __9__="ev_" src="http://img.ph.126.net/md_O0utI4U5z3Ls7eEzYMQ==/5272382.jpg" />&
拖拽那个&&任务栏(暂且这么叫吧),点击安装就行了~~
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/7NMM7rmJnUsxzwlO6V06eA==/5272383.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/4Sil4hLnbue6Vgx6L3LFmg==/5272384.jpg" />&
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/IP1cYfUuVuOEM1yni51_kA==/5272385.jpg" />&
好吧,我承认把QQ正着放有点怪
650) this.width=650;" style="word-wrap: break- cursor: pointer" alt="转:VMware虚拟机中Android的安装(+虚拟SD卡) - wintelx264 - wintelx264的博客" width="600" __9__="ev_" src="http://img.ph.126.net/X09jTflZOFIrvSqEzPnzNw==/5272386.jpg" />&
4.自定义虚拟机分辨率
我们在开发时肯定需要测试不同的分辨率,那么如何自定义Android虚拟机的分辨率呢?
首先我们需要从Virtual Box的设定入手
打开cmd,进入Virtual Box的下你创建的虚拟机的目录,我创建的虚拟机叫Android-x86,我的账户是Administrator,在我Windows XP上的路径是
C:\Documents and Settings\Administrator\VirtualBox VMs\Android-x86
1.在不同操作系统下路径会有一些不同,请根据操作系统的实际情况寻找,原则上都是在你当前用户的个人文件夹里
2.Android-x86是我创建的虚拟机的名称,如果你的和我的不同,请修改为你创建的虚拟机的名称
在这里我们需要使用VirtualBox提供的命令行工具来给你的虚拟机添加一个自定义分辨率,例如我想添加一个现在流行的手机屏幕分辨率 480x800,那么我们输入的命令如下
&C:\Program Files\Oracle\VirtualBox\VBoxManage.exe& setextradata &Android-x86& &CustomVideoMode1& &480x800x16&
上面的命令中,加粗的部分是要根据你自己电脑上的情况进行修改的,相关解释如下:
&C:\Program Files\Oracle\VirtualBox\VBoxManage.exe&
是Virtual Box命令行工具VBoxManage.exe的完整路径,请根据你电脑上安装的VirtualBox的实际路径修改
注意:如果路径中含有空格请使用双引号将整个路径包起来
Android-x86
这个是虚拟机的名称
480x800x16
这个是自定义的分辨率,请根据自己的需要修改,后面的16指的是16位颜色,请勿修改
如果你想增加更多的分辨率,请修改参数后多次运行该命令即可
650) this.width=650;" alt="" src="/images//2365.png" />
修改完毕之后,启动虚拟机,在Android的启动画面选中选项后按两次e键编辑内核启动参数,增加一个参数 vga=ask,具体流程如下
启动画面按e键
650) this.width=650;" alt="" src="/images//5367.png" />
进入新画面后再按一次e键
650) this.width=650;" alt="" src="/images//1190.png" />
这时进入内核参数编辑状态,增加参数 vga=ask
650) this.width=650;" alt="" src="/images//3093.png" />
编辑完毕后按回车保存修改结果,这时会回到上一个页面,此时按下b键启动
此时系统会提示你按回车进入分辨率选择界面,我们按回车继续
650) this.width=650;" alt="" src="/images//5016.png" />
进入页面之后,你可以看到所有系统支持的分辨率,这时请寻找你刚才设定的分辨率,在下图中,可以找到在先前设定的 480x800的分辨率,注意其前面的16进制代码360,如果想以该分辨率启动虚拟机,我们就输入360再回车即可
650) this.width=650;" alt="" src="/images//1954.png" />
回车后Android就会按照你设定的分辨率来启动了,下图是以480x800分辨率启动的Android-x86虚拟机截图
650) this.width=650;" alt="" src="/images//2911.png" />
如果你需要系统采用你指定的分辨率启动,需要在每次Android虚拟机启动的时候执行上面步骤的操作来修改内核参数启动Android
如果你想Android在启动的时候就默认进入分辨率选择画面或者默认采用你指定的分辨率启动虚拟机,那么可以参考以下步骤
1. 进入android虚拟机后按alt+F1进入命令行
2. 输入mkdir /data/fs
3. 挂载硬盘,使用下列命令
mount -t 硬盘格式 /dev/block/硬盘名称 /data/fs
硬盘格式为你虚拟机硬盘的格式,我这里是ext3 硬盘名称则是你虚拟机的
硬盘名称我这默认是sda1,表示第一个sata硬盘, linx下具体的硬盘命名规则请自行Google之
mount -t ext3 /dev/block/sda1 /data/fs
将硬盘挂在到 /data/fs文件夹上
4. vi /data/fs/grub/menu.list 编辑启动菜单列表 (vi这个命令行编辑器怎么用请自行Google之)
5. 和刚才启动时一样,在第一个kernel那一行的末尾增加 vga=ask 后保存
6. 重启虚拟机,这时候你就会发现每次Android启动的时候就会询问分辨率了
5.使用eclipse ADT在虚拟机上远程调试开发
现在虚拟机已经配置完成,下面来讲解如何使用eclipse来在上面运行和调试Android应用程序
在前面设定虚拟机的时候我把虚拟机的网卡设置成了bridged adapter,这样虚拟机在局域网中相当于一台独立电脑,你可以给它设置一个ip或者讲其网卡设置为dhcp状态来自动获取ip,我下面只讲解一下在dhcp状态下如何查看android虚拟机ip的方法:
进入android虚拟机,按alt+F1进入命令,输入netcfg命令来查看网络状态,参考界面如下
650) this.width=650;" alt="" src="/images//4649.png" />
其中eth0就是当前的网卡,后面的ip地址就是通过dhcp获得的ip地址
弄清楚之后再按alt+F7返回图形界面
此时我们打开eclipse,进入android开发插件的设定界面,选择ddms,勾选 Use ado host, 并在ADT host value 一栏填写虚拟机的ip地址,具体界面请参看下图
650) this.width=650;" alt="" src="/images//1388.png" />
选择ok保存后,在ddms界面的device菜单上选择重启adb服务,重启后,就能看到ddms连接上虚拟机了
650) this.width=650;" alt="" src="/images//3722.png" />
接下来就能和平常一样在虚拟上运行和测试你的Android程序了,enjoy~
最后总结一下这个环境的优缺点:
1.高速,相比Android SDK的虚拟机,无论是启动还是运行,本虚拟机要快上很多很多,让你可以流畅的运行测试你的Android应用,当然,也能舒服的在电脑上体验到Android系统:)
2.可以模拟平板电脑的环境
1.硬件支持还是悲剧,像打电话,短信,重力感应,GPS摄像头什么的你还是得去弄台真机器调试(不过这些东西本来就不是模拟器能做的)
另外补充一下虚拟机中主页、返回、关机、菜单对应的键盘按键
Home键 -& Win键
返回键 -& ESC键
挂机键 -& alt+F4
菜单键 -& 键盘菜单键,一般在右边win键和ctrl键中间
1.用鼠标点住某个程序的图标不放:
(在菜单中)相当于要创建桌面快捷方式
(在桌面)可移动至另一桌面或拖入垃圾桶
2.菜单、网页中,鼠标左键相当于前进,右键后退
键盘 回车前进,ESC后退
3.关机(我的本本上可用,其他的不知道):F4、F6、End
4.长按输入框可切换输入法
5.Android设备一般会有Home,Menu和Back三个标准按钮,如果没有,就要这样模拟:
(1)按住上方状态栏的右面一会儿后,会提示打开状态栏模拟按钮的功能:打开后,单击状态栏表示Home;状态栏上按鼠标键并从左向右划动表示Menu;状态栏上按鼠标键并从右向左划动表示Back。同样方法还会关闭状态栏模拟功能。
(2)单击鼠标右键也表示Back;按下键盘上的ESC键或Windows键也表示Home;按下键盘上的上下文键(一般在Alt和Ctrl中间)也表示Menu。
(3)Android里只要程序不显示就表示关闭了程序,对于有后台功能的程序,需要从&Dev Tools - Running Process&里关闭(一般不使用)。
6如果要上下滚动,可以拖动一个空白处,或使用鼠标滚轮。
7.如果要关机,按F6,这时会提示。
8.Alt-F1是切换到Linux命令行,Alt-F7是切换回图形模式。不要使用&reboot -p&关机(没有按Java程序的流程运行)。
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 android 4.0.3 rom 的文章

 

随机推荐