原文地址:Installing Android on the Samsung XE303C12 Chromebook
原作者:matteofranchin
我认为 Samsung Chromebook(XE303C12 型号)绝对是一款非常有意思的产品。它非常便于携带、价格适中,配备有基于 ARM 的Samsung Exynos 5 双核 CPU。网络上有多篇讲解如何在其上安装不同 Linux 发行版的博文,但是我却未找到任何有关尝试在其上移植 Android 的文章。本文中,我将详述如何在 Chromebook XE303C12 型号上移植 Android。我将尽量详细介绍所采取的每项操作程序。希望此篇文章能够对其他类似移植操作起到帮助作用。
硬件:
软件:
下面,我将描述如何设置 Chromebook 和计算机,以便构建软件。此部分内容将对以下部分很有帮助。
使用下面命令在台式 PC 上安装一些所需软件包:
desktop-pc$ sudo apt-get install \ u-boot-tools device-tree-compiler \ gcc-4.6-arm-linux-gnueabi g++-arm-linux-gnueabi
这将支持您生成 u-Boot 图片,并使用 dtc 将所需扁平设备树添加至您的内核图片中。
dtc
许多博文均讲述了如何执行此操作。我建议阅读下列文章:Daniel P. Berrangé's instructions;方便起见,我已将内容复制在下文中:
当 Chromebook 处于“开发者模式”时,它将执行如下操作:设备开启后,即会显示一个白色屏幕,并显示文本“OS 验证已关闭/按下 SPACE 以重新启用”。此时,您可以选择执行如下操作:
CTRL+D
CTRL+U
SPACE
打开 Chromebook,让其启动 Chrome-OS。如果您刚购买设备不久,则无需接受 Chrome-OS 许可证。稍等片刻,您将看到第一个画面,提示您选择并设置网络。本指南中,无需设置网络,但如果需要的话,您可以轻松执行此操作:只需遵循画面上的说明继续操作,直到显示许可协议为止。现在,您可以按下 CTRL+ALT+→ 组合键,其中 → 是指键盘顶部左起第三个键,F1 和 F2, ... 则为键盘上对应的键。Chromebook 将显示一个控制台。以根身份登录;无需填写密码。光标可能会不可见。显示光标的一种方法为启动 vi。键入 vi + ENTER,然后快速键入 :q!+ ENTER 启动 vi。
CTRL+ALT+→
→
F1
F2
根
vi
:q
通过根控制台,您可以执行以下操作:检查配置(例如,查找当前已通过 lsmod 在内核中加载的模块,或者查看如何通过 ifconfig 配置网络),这可能有助于稍后解决有关 Android 的问题。可以使用命令 reboot 重启计算机,或者使用命令 poweroff 关闭计算机。
lsmod
ifconfig
reboot
poweroff
在本指南中,我将说明如何安装 GNU/Linux 发行版,以便在将编译的内核与 Android 配合使用之前先对其进行测试。严格来讲,安装 GNU/Linux 发行版并非是使 Android 在 Chromebook 上运行的必要条件,但是此系统可能会在调试过程中非常有用。与 Android 不同,GNU/Linux 发行版配备有功能强大的工具,可用于检测系统并直接与其进行交互。
本指南中,我们将准备 SD 卡,以便通过 Android 和另一个定期发行的 GNU+Linux 发行版进行双启动设置。有四种不同的发行版可供选择:Fedora、Bodhi Linux、Debian 和 Ubuntu。
本指南中,我选择 Fedora,因为相关说明已清晰地表达出来。
按照 Fedora https://www.berrange.com/posts/2012/11/30/installing-fedora-17-arm-on-a-samsung-google-chromebook/相关说明 操作,但是以不同的方式对 SD 卡进行分区。创建四个分区:两个大小为 16 MB 的分区(用于内核),以及两个 ext4 分区:一个用于 Fedora(大约 4 GB),而另一个用于 Android(大约为 4 GB):
此时,您应该可以启动 Fedora 了。您应该已从 Chrome-OS 中获得了内核和模块,并且 Fedora 应该能够使用图形、无线功能和 USB 转以太网适配器(如果您拥有)。接下来,自行编译内核并确保 Fedora 可以使用我们拥有的内核和模块。
为运行 Android,您需要一个支持部分 Android 特定功能的内核(例如 Binder Kernel 驱动程序)。然后,您需要编译已启用了上述功能的内核(不同于 Chromebook 随附的内核)。本部分中,我们将阐述如何执行此操作。
下载 Chromium Linux 内核:
desktop-pc$ mkdir chromebook desktop-pc$ cd chromebook desktop-pc$ git clone http://git.chromium.org/chromiumos/third_party/kernel.git \ -b chromeos-3.4
chromebook 表示想要从其中下载源的目录的名称。此处,我使用子目录 chromeos-3.4。
chromebook
表示想要从其中下载源的目录的名称。此处,我使用子目录
chromeos-3.4
。
名称为 kernel 的目录本应由 git 创建。在下文中,我认为:
名称为
kernel
的目录本应由
git
创建。在下文中,我认为:
CHROMEOS=chromebook/kernel
如果您想要使用与本指南所用一样的内核,请执行下列步骤(我建议执行此操作,除非您了解您正在执行的操作):
desktop-pc$ cd $CHROMEOS desktop-pc$ git checkout 70301d5c21ee9d422e2621b76239f51f0e008362
现在,配置内核:
desktop-pc$ ./chromeos/scripts/prepareconfig chromeos-exynos5
此脚本将在内核的顶层目录中创建 .config 文件。请注意,chromebook 本地文件系统中的 /boot/config-3.4.0 文件包含用于构建本地 chromebook 内核的配置。
现在,请调整配置,并添加一些 Android 所需的功能。确保 .config 文件包含下列行(未备注):
CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_LOGGER=y CONFIG_ANDROID_LOW_MEMORY_KILLER=y CONFIG_ASHMEM=y CONFIG_FB_TILEBLITTING=y
开始编译已配置的内核:
desktop-pc$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage
请注意,您需要安装 "arm-linux-gnueabi" 版本的 GCC,如安装附加软件部分所述。如果执行此操作,则显示
desktop-pc$ arm-linux-gnueabi-gcc --version
显示内容如下所示:
arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
现在,我们将返回,编译内核。列出 make command 命令后,您可能会看到类似消息:
Android RAM buffer console (ANDROID_RAM_CONSOLE) [N/y] (NEW)
只需针对它们键入 ENTER 便可使用默认值。编译过程将花费数分钟。
通过编译,在 $CHROMEOS/arch/arm/boot 目录中创建 Image、zImage 和 uImage 文件。运行以下命令,在 $CHROMEOS/arch/arm/boot 目录中针对您的设备创建 dtb 文件:
desktop-pc$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
接下来,在 $CHROMEOS/arch/kernel.its 中创建带有下列内容的文件:
接下来,在
$CHROMEOS/arch/kernel.its
中创建带有下列内容的文件:
/dts-v1/; / { description = "Chrome OS kernel image with one or more FDT blobs"; #address-cells = <1>; images { kernel@1{ description = "kernel"; data = /incbin/("arm/boot/zImage"); type = "kernel_noload"; arch = "arm"; os = "linux"; compression = "none"; load = <0>; entry = <0>; }; fdt@1{ description = "exynos5250-snow.dtb"; data = /incbin/("arm/boot/exynos5250-snow.dtb"); type = "flat_dt"; arch = "arm"; compression = "none"; hash@1{ algo = "sha1"; }; }; }; configurations { default = "conf@1"; conf@1{ kernel = "kernel@1"; fdt = "fdt@1"; }; }; };
另请参阅 Olof Johansson's post 和 Siarhei Siamashka's mkimage script。
请注意,路径 arm/boot/zImage 和 arm/boot/exynos5250-snow.dtb 指向目前本应存于文件系统中的文件。然后,编写下列内容:
desktop-pc$ cd $CHROMEOS/arch desktop-pc$ mkimage -f kernel.its kernel.itb
生成的 kernel.itb 文件将包含正确格式的内核:FIT 内核图片。它可以使用 kernel.itb 来替换已存储在原始设备中的 /boot/vmlinuz-3.4.0。
编写下列内容:
desktop-pc$ cd $CHROMEOS desktop-pc$ mkdir $CHROMEOS/../modules desktop-pc$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules desktop-pc$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install \ INSTALL_MOD_PATH=$CHROMEOS/../modules
目录 $CHROMEOS/../modules 应填充有内核模块。
目录
$CHROMEOS/../modules
应填充有内核模块。
在 PC 上插入 SD 卡。此处假设包含 Fedora 文件系统的分区安装在 /mnt/Fedora 中。另外还假设已在 Fedora 中创建了名为 guest 的用户。安装 Fedora 时,如果您已正确遵循说明,便能从 Chrome-OS 内置的 /mnt/Fedora/lib/modules/ 和固件文件内置的 /mnt/Fedora/lib/firmware/ 中复制模块。编写下列内容:
desktop-pc$ mv /mnt/Fedora/lib/modules/3.4.0 /mnt/Fedora/lib/modules/original-3.4.0 desktop-pc$ cp -a $CHROMEOS/../modules/lib/modules/3.4.0 /mnt/Fedora/lib/modules/
还可以检查模块文件的权限:如果不具备权限,内核可能会拒绝加载模块!
desktop-pc$ cd /mnt/Fedora/lib/modules/ desktop-pc$ find . -type f -print0 | xargs -0 chmod 0644
复制 SD 卡上的内核:
desktop-pc$ cp $CHROMEOS/arch/kernel.itb /mnt/Fedora/home/guest/kernel.itb
在 /mnt/Fedora/home/guest/fedora-install-kernel.sh 中创建带有下列内容的文件:
echo "console=tty1 debug verbose root=/dev/mmcblk1p3 lsm.module_locking=0 rootwait rw" > /tmp/config vbutil_kernel \ --pack=/tmp/outkernel \ --keyblock=/usr/share/vboot/devkeys/kernel.keyblock \ --version=1 \ --signprivate=/usr/share/vboot/devkeys/kernel_data_key.vbprivk \ --config=/tmp/config \ --vmlinuz=/tmp/inkernel \ --arch=arm dd if=/tmp/outkernel of=/dev/mmcblk1p1 cgpt add -i 1 -S 1 -T 5 -P 10 -l kern-fedora /dev/mmcblk1 rm /tmp/outkernel /tmp/inkernel /tmp/config
需要注意的事项如下:
/dev/mmcblk1p3
lsm.module_locking=0
/dev/mmcblk1p1
现在,启动 Chromebook 并打开根命令解释程序,如打开根命令解释程序子部分所述。输入根命令解释程序后,在 Chromebook 中插入 SD 卡,然后执行以下操作:
chromebook$ cd /tmp chromebook$ mount /dev/mmcblk1p3 /mnt chromebook$ cp /mnt/home/guest/kernel.itb inkernel chromebook$ cp /mnt/home/guest/fedora-install-kernel.sh . chromebook$ bash fedora-install-kernel.sh
脚本在 SD 卡的第一个分区中安装内核。如果您在安装 Fedora 时尚未执行此操作,则必须运行下列命令:
chromebook$ crossystem dev_boot_usb=1
现在启动:
chromebook$ reboot
启动系统后,打开命令解释程序,然后尝试执行下列命令:
chromebook$ dmesg | head
将出现下列类似情况:
dmesg | head [ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.4.0 (username@hostname) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #3 SMP Fri Mar 22 14:26:00 GMT 2013 [ 0.000000] CPU: ARMv7 Processor [410fc0f4] revision 4 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, PIPT instruction cache [ 0.000000] Machine: SAMSUNG EXYNOS5 (Flattened Device Tree), model: Google Snow [ 0.000000] Ramoops: 41f00000 - 41ffffff [ 0.000000] Memory policy: ECC disabled, Data cache writealloc [ 0.000000] CPU EXYNOS5250 (id 0x43520010) [ 0.000000] exynos5_init_clocks: initializing clocks
username@hostname 替换为您的用户名和主机名。这证明,您正在使用自有的内核。现在,请检查一些模块是否正在被使用:
username@hostname
替换为您的用户名和主机名。这证明,您正在使用自有的内核。现在,请检查一些模块是否正在被使用:
chromebook$ lsmod Module Size Used by rfcomm 24189 4 uvcvideo 62616 0 videobuf2_vmalloc 2941 1 uvcvideo mcs7830 5683 0 usbnet 14225 1 mcs7830 isl29018 7782 0 joydev 8791 0 industrialio 15248 1 isl29018 btmrvl_sdio 8602 0 mwifiex_sdio 14642 0 sbs_battery 7117 0 mwifiex 109577 1 mwifiex_sdio cfg80211 167815 1 mwifiex btmrvl 12715 1 btmrvl_sdio bluetooth 178735 22 btmrvl,rfcomm,btmrvl_sdio lib80211 3707 1 mwifiex uinput 6922 0
请注意,模块 usbnet 和 mcs7830 为加载的模块,用于处理 USB 至以太网适配器。如果适配器为其他类型(不同供应商或型号),则可能不会看到这些模块。您应该确认特定硬件应该需要哪些模块,因为这在稍后非常有用。
请注意,模块
usbnet
和
mcs7830
为加载的模块,用于处理
USB
至以太网适配器。如果适配器为其他类型(不同供应商或型号),则可能不会看到这些模块。您应该确认特定硬件应该需要哪些模块,因为这在稍后非常有用。
还请注意,在 dmesg 日志中,您应获取大量的下列行:
还请注意,在
dmesg
日志中,您应获取大量的下列行:
[ 14.840425] Chromium OS LSM: init_module old-api-locking-ignored module= pid=1 cmdline="/init"
这表明内核模块加载限制功能已禁用。
通过阅读有关如何正确设置台式计算机的相关指南(请访问 http://source.android.com/source/initializing.html),熟悉 Android 构建机制。另请查阅 http://source.android.com/source/downloading.html 页面,该页面叙述了有关如何检索源的说明(例如,repo 实用程序的安装方式及使用方法)。熟悉这些说明后,通过下列命令检查 Android 文件系统:
repo
desktop-pc$ mkdir -p $ANDROID && cd $ANDROID desktop-pc$ repo init -u https://android.googlesource.com/platform/manifest -b jb-mr1.1-dev desktop-pc$ repo sync
此处以及下文中,我认为您可以在 $ANDROID 目录中下载 Android 源。
$ANDROID
同步过程将花费数分钟。现在,请针对 "Jelly Bean MR1" 版本应用列举在 http://linux-arm.org/LinuxKernel/LinuxAndroidPlatform 中的补丁。仅应用补丁。请不要解压缩该页面中指定的 tarball,相反请使用此处给定的 tarball。解压缩设备目录中的 tarball 后,新目标 samsung_xe303c12 将添加至 Android 构建系统。
设备
samsung_xe303c12
接下来,您应修复 Android 文件系统中的部分文件。有关执行此操作的详细信息,请参阅以下部分:调整屏幕设置、开始编译Installing Android on the Samsung XE303C12 Chromebook wpa_supplicant 以及 调整Installing Android on the Samsung XE303C12 Chromebook init.rc 以加载额外的模块并使用网络。
您可能必须修改 Android 源以便使 Android 提供相应的图形。问题在于 Samsung Chromebook 中的硬件希望使用 BGR 像素格式,而 Android 希望使用 RGB 像素格式。如果出现此种情况,logcat 将在 adb logcat -d -f log.txt 的输出 (log.txt) 中报告下列内容:
您可能必须修改
Android
源以便使
提供相应的图形。问题在于
Samsung Chromebook
中的硬件希望使用
BGR
像素格式,而
希望使用
RGB
像素格式。如果出现此种情况,
logcat
将在
adb logcat -d -f log.txt
的输出
(log.txt)
中报告下列内容:
[...] W/SurfaceFlinger( 101): no suitable EGLConfig found, trying without EGL_FRAMEBUFFER_TARGET_ANDROID W/SurfaceFlinger( 101): no suitable EGLConfig found, trying without EGL_RECORDABLE_ANDROID W/SurfaceFlinger( 101): no suitable EGLConfig found, trying with 16-bit color allowed E/SurfaceFlinger( 101): no suitable EGLConfig found, giving up [...]
可以入侵 Android 以便使用 BGR 格式。在 frameworks/native/opengl/libagl/egl.cpp 文件中,查找下列代码:
可以入侵
以便使用
格式。在
frameworks/native/opengl/libagl/egl.cpp
文件中,查找下列代码:
static configs_t const gConfigs[] = { { config_0_attribute_list, NELEM(config_0_attribute_list) }, { config_1_attribute_list, NELEM(config_1_attribute_list) }, { config_2_attribute_list, NELEM(config_2_attribute_list) }, { config_3_attribute_list, NELEM(config_3_attribute_list) }, { config_4_attribute_list, NELEM(config_4_attribute_list) }, { config_5_attribute_list, NELEM(config_5_attribute_list) }, { config_6_attribute_list, NELEM(config_6_attribute_list) }, { config_7_attribute_list, NELEM(config_7_attribute_list) }, };
在表的末端添加新的条目:
{ config_8_attribute_list, NELEM(config_8_attribute_list) },
将代码置于 gConfigs[] 表定义的正前方,以定义新的像素格式:
将代码置于
gConfigs[]
表定义的正前方,以定义新的像素格式:
/* 32-bit BGRA */ static config_pair_t const config_8_attribute_list[] = { { EGL_BUFFER_SIZE, 32 }, { EGL_ALPHA_SIZE, 8 }, { EGL_BLUE_SIZE, 8 }, { EGL_GREEN_SIZE, 8 }, { EGL_RED_SIZE, 8 }, { EGL_DEPTH_SIZE, 0 }, { EGL_CONFIG_ID, 2 }, { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_BGRA_8888 }, { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, };
此条目最初从 config_4_attribute_list复制,差异在于 GGL_PIXEL_FORMAT_RGBA_8888被替换为 GGL_PIXEL_FORMAT_BGRA_8888(EGL_NATIVE_VISUAL_ID 属性)。执行此变更后,logcat 应给出:
此条目最初从
config_4_attribute_list
复制,差异在于
GGL_PIXEL_FORMAT_RGBA_8888
被替换为
GGL_PIXEL_FORMAT_BGRA_8888
(
EGL_NATIVE_VISUAL_ID
属性)。执行此变更后,
应给出:
[...] W/SurfaceFlinger( 99): no suitable EGLConfig found, trying without EGL_FRAMEBUFFER_TARGET_ANDROID W/SurfaceFlinger( 99): no suitable EGLConfig found, trying without EGL_RECORDABLE_ANDROID W/SurfaceFlinger( 99): EGL_SLOW_CONFIG selected! [...]
此修复办法是根据 http://comments.gmane.org/gmane.comp.handhelds.android.porting/521 和 https://groups.google.com/forum/?fromgroups=#!topic/android-porting/rSttzZE9SBo 所述内容而产生的。
您应当修复 $ANDROID/external/wpa_supplicant_8/wpa_supplicant/src/drivers/driver_nl80211.c 文件,否则您可能在构建 Android 文件系统会遭遇链接错误。您应当标注设置字段 driver_cmd 的命令行,内容如下所示:
您应当修复
$ANDROID/external/wpa_supplicant_8/wpa_supplicant/src/drivers/driver_nl80211.c
文件,否则您可能在构建
文件系统会遭遇链接错误。您应当标注设置字段
driver_cmd
的命令行,内容如下所示:
//.driver_cmd = wpa_driver_nl80211_driver_cmd,
此变更将禁用 wpa_supplicant 的部分功能,但是不会阻碍无线正常运行。
此变更将禁用
wpa_supplicant
的部分功能,但是不会阻碍无线正常运行。
Samsung Chromebook 不具备以太网端口。如果您需要连接至因特网,则可以使用内置无线功能。如果无线功能不可用,则可以使用 USB 转以太网适配器。本部分中,我将阐述如何进行设置。
可以通过 Android 文件系统顶部的 init.rc 文件定制 Android 开机方式。有关 rc 文件语法的信息,请参阅下列链接 https://android.googlesource.com/platform/system/core/+/master/init/readme.txt。
init.rc
rc
已对 init.rc(基于 PRODUCT-samsung_xe303c12-eng 产生)进行了部分调整,使其适用于 Samsung Chromebook。尤其是,存在大量使用 insmod 命令在内核中加载的模块。您应针对 USB 转以太网适配器添加部分附加行。可以通过检查 Fedora 或 ChromeOS 中的 lsmod 输出确定所需模块:在不使用适配器的情况下启动、键入 lsmod、连接适配器、等待 5 秒、重新键入 lsmod 并标注插入适配器后要加载的附加模块。
PRODUCT-samsung_xe303c12-eng
insmod
在此案例中,我必须添加两个 insmod 命令:
[...] insmod /system/lib/modules/kernel/net/ipv6/netfilter/nf_conntrack_ipv6.ko insmod /system/lib/modules/kernel/net/netfilter/xt_mark.ko # The two lines below are the ones I had to add for my dongle: insmod /system/lib/modules/kernel/drivers/net/usb/usbnet.ko insmod /system/lib/modules/kernel/drivers/net/usb/mcs7830.ko #wait /nonexistentfile 60
最后一行已加注,但是您可能希望取消批注,以便当 Android 加载模块时能够停顿 60 秒。这可能会使您有机会看到模块是否已正确加载。请注意,设置合适的网络非常重要,因为它允许使用 adb(Android Debugging Bridge) — 反过来,它也支持调试系统可能遇到的其他问题。
最后一行已加注,但是您可能希望取消批注,以便当
加载模块时能够停顿
60
秒。这可能会使您有机会看到模块是否已正确加载。请注意,设置合适的网络非常重要,因为它允许使用
adb
Android Debugging Bridge) —
反过来,它也支持调试系统可能遇到的其他问题。
为启用有线以太网,请在 init.rc 末尾添加下列行,定义服务:
为启用有线以太网,请在
末尾添加下列行,定义服务:
service wired-ethernet /system/bin/netcfg eth0 dhcp oneshot
接下来,在“开机”部分末尾添加下列内容,告知 Android 启动服务:
start wired-ethernet
此行应遵循下列行:
class_start core class_start main
按照下列命令构建源:
desktop-pc$ cd $ANDROID desktop-pc$ source build/envsetup.sh desktop-pc$ make -j8 PRODUCT-samsung_xe303c12-eng
编译输出位于 $ANDROID/out/target/product/samsung_xe303c12/ 目录中。尤其是,此目录包含两个目录:根目录和系统目录。包含文件的这两个目录 — 在 Android 设备中 — 将分别在 locations / 和 /system下找到。
编译输出位于
$ANDROID/out/target/product/samsung_xe303c12/
目录中。尤其是,此目录包含两个目录:根目录和系统目录。包含文件的这两个目录
—
在
设备中
将分别在
locations /
/system
下找到。
我认为将包含 Android 文件的 SD 卡的分区已安装在 /mnt/Android中。将在构建Installing Android on the Samsung XE303C12 Chromebook Android 文件系统部分中获取的 Android 文件系统复制到 SD 卡上:
/mnt/Android
desktop-pc$ cp -a $ANDROID/out/target/product/samsung_xe303c12/root/* /mnt/Android desktop-pc$ cp -a $ANDROID/out/target/product/samsung_xe303c12/system/* /mnt/Android/system
从 Fedora 分区复制固件和模块目录:
desktop-pc$ mkdir -p /mnt/Android/system/lib/modules desktop-pc$ cp -a /mnt/Fedora/lib/modules/3.4.0/* /mnt/Android/system/lib/modules/ desktop-pc$ mkdir -p /mnt/Android/system/etc/firmware/ desktop-pc$ cp -a /mnt/Fedora/lib/firmware/* /mnt/Android/system/etc/firmware/
请记住,固件目录可从 Chromebook 中直接获取。
您可能还要更改 prop 和 rc 文件的权限,以便使它们只能由所有者写入:
desktop-pc$ find /mnt/Android \( -name "*.prop" -o -name "*.rc" \) -print0 | xargs -0 chmod 0644
检查模块文件的权限是否正确;如果您遵循了相应的说明,则权限应当正确无误。如果不正确,请写入:
desktop-pc$ cd /mnt/Android/system/lib/modules desktop-pc$ find . -type f -print0 | xargs -0 chmod 0644
我们需要设置 SD 卡以便启动 Android。类似于将编译的内核和模块与Installing Android on the Samsung XE303C12 Chromebook Fedora 结合使用部分中执行的操作,请在 /mnt/Fedora/home/guest/android-install-kernel.sh 中创建带有下列内容的文件:
/mnt/Fedora/home/guest/android-install-kernel.sh
echo "console=tty1 debug verbose root=/dev/mmcblk1p4 lsm.module_locking=0 init=/init rootwait rw" > /tmp/config vbutil_kernel \ --pack=/tmp/outkernel \ --keyblock=/usr/share/vboot/devkeys/kernel.keyblock \ --version=1 \ --signprivate=/usr/share/vboot/devkeys/kernel_data_key.vbprivk \ --config=/tmp/config \ --vmlinuz=/tmp/inkernel \ --arch=arm dd if=/tmp/outkernel of=/dev/mmcblk1p2 cgpt add -i 2 -S 1 -T 5 -P 15 -l kern-android /dev/mmcblk1 rm /tmp/outkernel /tmp/inkernel /tmp/config
确保 kernel.itb 文件位于 /mnt/Fedora/home/guest/ 目录中;如果您遵循了 将编译的内核和模块与 Fedora 结合使用部分中的说明,则不会出现差错。
kernel.itb
/mnt/Fedora/home/guest/
请注意,init=/init 选项将告知内核,将控制传输至 Android 文件系统顶部目录中的 init 可执行程序。和针对 Fedora 执行的操作相同,请启动 Chromebook 并打开根命令解释程序。输入根命令解释程序后,在 Chromebook 中插入 SD 卡,然后执行以下操作:
init=/init
init
chromebook$ cd /tmp chromebook$ mount /dev/mmcblk1p3 /mnt chromebook$ cp /mnt/home/guest/kernel.itb inkernel chromebook$ cp /mnt/home/guest/android-install-kernel.sh . chromebook$ bash android-install-kernel.sh
脚本将内核安装在 SD 卡的第二个分区中。它给此内核分配的优先级为 15,这高于当前在 /dev/mmcblk1p3 中分配给 Fedora 内核的优先级,并且由此被根目录下的 bootloader 选中。这意味着,从此刻起,系统将启动 Android 而非 Fedora。在切换回Installing Android on the Samsung XE303C12 Chromebook Fedora 部分中,我将讲解如何更改优先级以便再次启动 Fedora。
接下来,键入 reboot 重启系统,然后在出现白色启动屏幕时按下 CTRL+U 组合键以便通过 SD 卡触发启动。
将显示 Android。这可能会花费数分钟。图形、键盘、触摸屏和无线功能均应正常运行。
我建议转至“设置”,然后向下滚动左侧菜单(您可以使用向下箭头),并选择“{} 开发者选项”。右侧将显示一个“保持开机”复选框,您可以选中此复选框以便阻止设备进入待机状态。
请记住,您只需按住电源按钮几秒即可关闭 Android 系统。
单击工具框上的无线图标即可激活无线功能,该工具框还包括其他蓝牙按钮等。等待一分钟,Android 会自动检测无线并让您进行设置。在今后的启动中,此设置将会被记住。
如果 adb 不可用,则调试 Android 是一项非常棘手的事情;您无法轻松打开命令解释程序或轻松配置系统。需要执行的第一项操作即为使网络正常运行,以便使 adb 可用。如果网络不能正常运行,您可能需要在 init.rc 文件中添加下列两行:
如果
不可用,则调试
是一项非常棘手的事情;您无法轻松打开命令解释程序或轻松配置系统。需要执行的第一项操作即为使网络正常运行,以便使
可用。如果网络不能正常运行,您可能需要在
文件中添加下列两行:
service logstuff /system/bin/logcat -f /mylogstuff oneshot
您可以通过下列命令启动服务
start logstuff
该命令行支持启动 Android 记录服务并将输出重新导向至 Android 文件系统顶部的 mylogstuff 文件中。接下来,您可以启动您的系统、关闭系统、从 Chromebook 获取 SD 卡并将其插入 PC,以便检查 mylogstuff 文件的内容。
该命令行支持启动
记录服务并将输出重新导向至
文件系统顶部的
mylogstuff
文件中。接下来,您可以启动您的系统、关闭系统、从
Chromebook
获取
SD
卡并将其插入
PC
,以便检查
文件的内容。
使用诸如以下命令行:
wait /filethatdoesnotexist {number of seconds}
您还可以在加载模块时手动降低系统运行速度,以便您可以看到这些命令的输出。当然,既不需要规范也不要漂亮,只需手动而已...
为启动 Android Debug Bridge,您可以使用下列命令:
desktop-pc$ adb kill-server desktop-pc$ ADBHOST=AAA.BBB.CCC.DDD adb devices
其中 AAA.BBB.CCC.DDD 表示 Android 设备的 IP 地址。其中一种获取设备 IP 的方式(如果设备已连接至与台式 PC 相同的交换机/路由器,则该方式可行)如下所示:
desktop-pc$ sudo tcpdump -n -i eth0 'tcp port 54321'
这将在 PC 屏幕上显示从台式 PC 的 54321 端口出发或到达该端口的所有数据包。您可以在 Android 设备中打开浏览器并用作为计算机 IP 地址的 URL。例如,如果台式 PC 拥有 IP 地址(请尝试使用 ifconfig) XXX.YYY.ZZZ.WWW,则在 Android 浏览器 "XXX.YYY.ZZZ.WWW:54321" 中输入 URL 并按下 ENTER。tcpdump 应显示诸如以下内容的命令行:
这将在
屏幕上显示从台式
的
54321
端口出发或到达该端口的所有数据包。您可以在
设备中打开浏览器并用作为计算机
IP
地址的
URL
。例如,如果台式
拥有
地址(请尝试使用
)
XXX.YYY.ZZZ.WWW
,则在
浏览器
"XXX.YYY.ZZZ.WWW:54321"
中输入
并按下
ENTER
tcpdump
应显示诸如以下内容的命令行:
15:42:04.188811 IP AAA.BBB.CCC.DDD.51734 > XXX.YYY.ZZZ.WWW.54321: Flags [S], seq 3681918437, win 14600, options [mss 1460,sackOK,TS val 290000 ecr 0,nop,wscale 7], length 0
其中 AAA.BBB.CCC.DDD 表示设备的 IP 地址。现在,您可以使用此地址作为 ADBHOST 的值。adb 设备将找到您的 Android 设备:
其中
AAA.BBB.CCC.DDD
表示设备的
地址。现在,您可以使用此地址作为
ADBHOST
的值。
设备将找到您的
设备:
desktop-pc$ ADBHOST=... adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached emulator-5554 device
现在,您可以使用 adb。例如,
现在,您可以使用
。例如,
命令解释程序
logcat -d
帮助
下载终端模拟器应用。例如,Jack Palevich https://github.com/jackpal/Android-Terminal-Emulator/wiki的终端模拟器应用。使用 adb 在主机上远程安装该应用:
desktop-pc$ adb install Term.apk desktop-pc$ adb shell # this opens a remote root shell adb-shell# cd /system/bin adb-shell# cp mksh mysh adb-shell# chown root:root mysh adb-shell# chmod 4775 mysh adb-shell# exit
现在,从 Chromebook 中打开终端模拟器应用,并键入 /system/bin/mysh。您应该拥有根权限。
现在,从
中打开终端模拟器应用,并键入
/system/bin/mysh
您应该拥有根权限。
mysh 是隶属于根的默认命令解释程序 mksh 的副本,可以由任何人执行并且拥有 setuid 标记设置。尤其是,稍后的权限设置意味着,执行该可执行程序的人均会被当做根用户。请记住,如果您不再需要该文件,请务必进行删除,因为这明显是一个严重的安全漏洞(未经验证的根访问)。
mysh
是隶属于根的默认命令解释程序
mksh
的副本,可以由任何人执行并且拥有
setuid
标记设置。尤其是,稍后的权限设置意味着,执行该可执行程序的人均会被当做根用户。请记住,如果您不再需要该文件,请务必进行删除,因为这明显是一个严重的安全漏洞(未经验证的根访问)。
要切换回 Fedora,请使用 cgpt 实用程序。在 ChromeOS 命令解释程序中,尝试使用 cgpt show /dev/mmcblk1。此命令将显示分区列表,并且详细说明哪些内核应安装在哪个分区中(包括启动优先级)。要使 bootloader 选择 Fedora 内核,只需键入 cgpt add -i 2 -P 5 /dev/mmcblk1即可。该命令将 Android 内核的优先级降至为 5,远低于 Fedora 内核的优先级(之前设置为 10)。在接下来的重启中,系统将显示 Fedora。
要切换回
Fedora
,请使用
cgpt
实用程序。在
ChromeOS
命令解释程序中,尝试使用
cgpt show /dev/mmcblk1
。此命令将显示分区列表,并且详细说明哪些内核应安装在哪个分区中(包括启动优先级)。要使
bootloader
选择
内核,只需键入
cgpt add -i 2 -P 5 /dev/mmcblk1
即可。
该命令将
内核的优先级降至为
5
,远低于
内核的优先级(之前设置为
10
)。在接下来的重启中,系统将显示
本指南旨在支持您在 Chromebook 上启动 Android。您应当能够使用其来浏览 Web 并运行部分应用了。您还可以针对该系统执行大量改进以便提供更好的用户体验:声频、用于播放视频(例如 YouTube)的编解码器、蓝牙支持、定制菜单和配置、以及安全性等。包括二进制图片发布和维护在内的所有这些改进,均不在本指南的范围内。期待更多慷慨的工程师志愿者们在开源社区中发布关于上述方面的文章。