2015年1月6日 星期二

android-x86: 在電腦裡面玩平板

android-x86 開機畫面, 選擇 「安裝」 針對 7.* 重寫的新文章 Android-x86 Nougat 版 已取代本文。

黃志偉大大 所開發的 android-x86 讓你可以在 PC 裡面開一部平板電腦來玩。 對於老師/演講者超級有用: 你可以透過它用筆電接單槍投影, 展示平板/手機 (虛擬機) 上面的 apps, 而不需要煩惱如何將實體平板/手機接上單槍。 適用於 f-droid 市集及其他 「可以取得 apk 檔」 的 apps; 不適用於 「拿不到 apk 檔」 的 google play apps。

android-x86 對於開發人員也很有用 -- 事實上 (還不算是開發人員的) 我就是因為受不了 android 開發環境的龜速而搜尋到這一篇, 才開始玩 android-x86 的: How to speed up the Android Emulator by up to 400%

Windows 用戶請參考 重灌狂人的教學文。 (只進虛擬機操作體驗, 沒有安裝步驟。)

本文全程使用 root 的身份在做事。

首先建立一個 4G 大小的映象檔案, 當做平板的硬碟:

qemu-img create -f qcow2 ..../experiment.img 4G

ls -l ..../experiment.img 檢查, 會發現這個檔案的大小只有幾百 KB 而不是想像中的 4GB。 這是因為 qemu 所提供的 qcow2 格式可以隨著需要才逐漸成長。

再來用光碟開機, 並且把光碟上的 android-x86 安裝到 experiment.img 映象檔上面:

kvm -monitor stdio -vga std -m 1024 -cdrom ..../android-x86-4.4-r1.iso -hda ..../experiment.img -boot d

看到開機選單, 趕快移到最下方的 「Installation -- Install Android-x86 to harddisk」。 簡單摘要一下每一步我的選擇:

  1. Create/Modify partitions (分割硬碟, 就是剛建立的那個 experiment.img 映象檔)
  2. 在 cfdisk 介面底下:
    1. 選 new
    2. 選 primary
    3. 按照預設的空間分配 (整個映象檔的大小) 直接按 Enter
    4. 勾選 Bootable
    5. 選 write (把剛剛所有設定真的寫入映象檔)
    6. 回答 yes ("是的, 舊資料全部刪除沒關係")
    7. 選 quit (離開 cfdisk)
  3. 再來選擇要把 android x86 安裝到哪一顆硬碟去。 先前沒得選; 現在出現了唯一的選擇: 「sda1 Linux QEMU HARDDISK」, 按 Enter。
  4. 要用什麼方式格式化這個分割? 選 ext3 。
  5. 選擇 yes ("是的, 舊資料全部刪除沒關係")
  6. 格式化的時間很長, 而且一直停在 0% 不會動。 但其實並沒有當掉。 你可以用 ls -l ..../experiment.img 查看映象檔一直在長大。 以我當初指定 4G 來說, 映象檔最後長到 70M 左右, 格式化就完成了。
  7. 要安裝開機管理員 grub 嗎? 沒差。 就給他 yes 了。
  8. 要把 /system 目錄設成可讀寫嗎? 需要完整 root 權限的人, 當然選 yes。
  9. 選擇 reboot, 回到開機選單時, 直接關掉虛擬機。

如果覺得上面太簡略, 硬碟分割的細步畫面快照可以參考 How To Install Android-x86 4.0 Using QEMU On Ubuntu 11.10/12.04 How to Install Android on PC 「电脑安装安卓Android-X86教程」 「Android x86详细安装教程 让安卓跑在PC上」 等等各篇關於 cfdisk 的畫面。

命令列上的 -monitor stdio 主要是保險用的。 萬一虛擬機當機還是出了什麼狀況, 至少還可以從 kvm 命令列上 送指令 檢查或救援。 如果省略這段, 就沒有 kvm 命令列可用了。 至於 -vga std 我忘記是為了要解決什麼問題而加上去的 ^_^|||

重要! 操作時, 滑鼠如果被關進虛擬機裡面, 該怎麼辦? 按 「ctrl-alt」 就可以逃出來。

安裝完之後選擇 reboot, 然後就直接關掉虛擬機。 回到命令列, 這次不指定光碟, 直接從 experiment.img 映象檔開機:

kvm -monitor stdio -vga std -m 1024 -soundhw es1370 -redir tcp:4444::5555 ..../experiment.img

指定 -soundhw es1370 才會有聲音; 而 -redir tcp:4444::5555 則是為了要讓電腦主機可以用 adb 連線到平板虛擬機。 (下詳)

首次開機, 就照自己的正常步驟設定。 選擇 wifi 那邊可以直接 skip 掉, 因為虛擬機不需要 wifi, 預設狀態即可透過 PC 上網。 根據 App HowTo, android-x86 未獲 google 授權, 所以無法安裝 google play 商店的軟體。 對我無差, 因為 我跟西藏人一樣, 相信「原始碼攤在陽光下」才是手機平板真正的安全保障。 所以我都略過 google 帳號的設定、 在設定當中勾選 「允許從不明來源安裝軟體」、 直奔 f-droid 、 下載並安裝 f-droid 的 apk、 從此以後 (幾乎) 只透過 f-droid 安裝軟體。

如何避免 android-x86 睡著? 如果你太認真讀貴哥的文章, 一直沒去碰虛擬機, 導致它休眠叫不回來 (螢幕一片漆黑), 請找到電腦鍵盤右下角 menu 鍵 (夾在 alt 跟 ctrl 之間), 長按一秒。 或是在 kvm 終端機下指令: sendkey menu。 (看吧, 剛剛命令列上的 -monitor stdio 很有用吧!) 然後進入虛擬機視窗, alt-f1 跟 alt-f7 輪流按幾次, 就救回來了。 趕快到 settings => display => sleep => never time out 以免以後它再睡著。 以上是從這篇 Android on virtualBox gets stuck after idle Resume from blacked-out screen 這兩篇問答修改過來的。

再來, 因為我得了一種 「沒有取得 shell 就沒有安全感」 的病, 所以一定要 設定 adb 讓電腦與平板連線。 根據 Debug Howto, 因為我們用 qemu 跑虛擬機, 所以比實體機要多兩個步驟:

  1. 啟動模擬器時, 要加上前述的 -redir tcp:4444::5555 選項。 這跟 debug howto 的寫法不太一樣, 是因為看到 qemu 官網的網路設定文件-net nic 等等語法過時了, 所以找到 wikibooks 的 QEMU 網路設定文件 解釋如何轉 port。 Wikibooks 也解釋: 其實 qemu 不需要任何參數, 虛擬機的網路自動就會通。
  2. 回到 linux 命令列, 先下 adb connect localhost:4444

然後就可以 (像連接實體機一樣) 下 adb shell 連進你的平板虛擬機! 因為是虛擬機, 所以連 「信任那部想要對我除錯的電腦嗎?」 這樣的警告訊息都省略了。 進了 shell、 下 su 指令直接變身成 root, 就像在首都插旗一樣, 成為這部平板真正的主人, 今晚終於可以安心地睡覺了!

最後補充說明一下: 因為 android-x86 不是在最底下硬體的層次, 而只是在軟體的層次模擬 android 環境, 所以如果你想展示的是你自己的平板環境 (例如刷成 CyanogenMod 或 replicant 等等不同的 rom) 而不是只有幾個 「隨處可安裝」 的 apk 檔, 那麼 android-x86 就不適用了。 這時你必須 叫 qemu 直接模擬 ARMv8 之類的。 不過貴哥有興趣的只是建置一個測試開放原始碼 app 的 android 開發環境, 所以就不玩 qemu-ARMv8 了。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。