How to Build and Run Android L 64-bit ARM in QEMU

来源:互联网 发布:战国六国灭亡顺序知乎 编辑:程序博客网 时间:2024/04/29 16:42

As many others, I can't wait to put my hands on Android running on aarch64 (arm-v8) and as many other, it's difficult to afford such an expensive Juno board (the only development board arm-v8 available which I am aware of) If you Google a bit you'll bump into this cool article: 

http://www.cnx-software.com/2014/08/23/how-to-build-and-run-android-l-64-bit-arm-in-qemu/


The Linaro team put together ahead of time, around may 2014, a version of the Kernel for aarch64 called ranchu (forked from 3.10) and patched/worked together with the qemu team to create a machine model ranchu capable of emulating aarch64. Everything is well explained in the article above. 


However, by compiling the latest Android L preview 2 AOSP, I ended up with serious issues during the zygote startup. It looks there is something seriously different in how boot.art is made, thus passing it to patchoat (at first time boot) something goes very wrong. Not going into details of the hell issue.


Sometimes, when things goes wrong, better to restart from scratch. It's the old rule learned since the old Windows 95 time, hit ctrl-alt-delete. 


While compiling the AOSP, I noticed that into the prebuilt folder you have something called emultator64-arm64 which sounds pretty much what I wanted; who said that Google is not providing amr64 emulation yet? :) Yes, it's not official, emulator images are not provided with the latest SDKv19 but I happily found another piece of gold. In the folder qemu-kernel/arm64/kernel-qemu this file sounds very much like the kernel prebuilt for the arm64 emulator. Why not trying compiling AOSP for generic arm64 support? in the end the device reference is there in the AOSP without any patching... and voila...




Here are the steps to follow:

1) get Android L developer preview AOSP

cd /data/src
mkdir AOSP 
repo init -u https://android.googlesource.com/platform/manifest -b android-l-preview_r2
repo sync

wait a considerable amount of time to sync, almost 2 hours, prepare almost 100GB on your drive
note: you need repo command from google configured on your system.

2) have fun and compile (takes almost 1h on a decent machine)

source build/envsetup.sh
lunch aosp_arm64-eng
m -j8
here is the lunch output
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=4.4.3.43.43.43
TARGET_PRODUCT=aosp_arm64
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv7-a-neon
TARGET_2ND_CPU_VARIANT=cortex-a15
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-37-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=AOSP
OUT_DIR=out
============================================

3) move to the prebuilt emulator folder, in my case I am under linux-x64, chose your arch


cd /data/src/AOSP/prebuilts/android-emulator/linux-x86_64

4) to run the emulator you need anyhow an AVD configuration or start it manually from the qemu binary without using the google emulator wrapper. I prefer to use the wrapper here as the command is cleaner.

create an AVD using your ANDROID SDK, launch 

./android avd

(from platform tools, you can create one via command line ./android create)

or if you have already defined AVDs, just use one of them, settings will be overwritten by the command, so whatever you have in your AVD you are just using the config.ini file (stored in the .android folder). Preferably, set your AVD with more then 1024 MB ram. 


5) now you are ready to launch the emulator, here is the command (all one line). 

testL is the name of the AVD prepared. Wait, wait wait for android to finish booting, remember you are on a slow emulation, it takes time. If you are curios to see what's going on, just run "logcat" at the prompt to see all the mess in real time. 


./emulator64-arm64 -kernel ../../qemu-kernel/arm64/kernel-qemu -data /data/src/AOSP/out/target/product/generic_arm64/system.img -system /data/src/AOSP/out/target/product/generic_arm64/system.img -cache /data/src/AOSP/out/target/product/generic_arm64/cache.img -ramdisk /data/src/AOSP/out/target/product/generic_arm64/ramdisk.img -avd testL

Output, kernel boot and android prompt:


console on port 5554, ADB on port 5555Initializing cgroup subsys cpuLinux version 3.10.0+ (digit@tyrion.par.corp.google.com) (gcc version 4.8 (GCC) ) #12 SMP Tue Sep 16 22:36:19 CEST 2014CPU: AArch64 Processor [411fd070] revision 0Machine: ranchudebug: skip boot console de-registration.Unknown earlyprintk arguments: ttyAMA0PERCPU: Embedded 10 pages/cpu @ffffffc07ffdf000 s11456 r8192 d21312 u40960Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 517120Kernel command line: console=ttyAMA0,38400 keep_bootcon earlyprintk=ttyAMA0PID hash table entries: 4096 (order: 3, 32768 bytes)Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes)Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes)Memory: 2048MB = 2048MB totalMemory: 2058560k/2058560k available, 38592k reservedVirtual kernel memory layout:    vmalloc : 0xffffff8000000000 - 0xffffffbbffff0000   (245759 MB)    vmemmap : 0xffffffbc00e00000 - 0xffffffbc02a00000   (    28 MB)    modules : 0xffffffbffc000000 - 0xffffffc000000000   (    64 MB)    memory  : 0xffffffc000000000 - 0xffffffc080000000   (  2048 MB)      .init : 0xffffffc00057a000 - 0xffffffc0005a8cc0   (   188 kB)      .text : 0xffffffc000080000 - 0xffffffc000579364   (  5093 kB)      .data : 0xffffffc0005a9000 - 0xffffffc0005e7200   (   249 kB)SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1Hierarchical RCU implementation. RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=1.NR_IRQS:64 nr_irqs:64 0GIC CPU mask not found - kernel will fail to boot.GIC CPU mask not found - kernel will fail to boot.Architected local timer running at 62.50MHz (virt).Console: colour dummy device 80x25Calibrating delay loop (skipped), value calculated using timer frequency.. 125.00 BogoMIPS (lpj=625000)pid_max: default: 32768 minimum: 301Mount-cache hash table entries: 256/cpus/cpu@0: Unknown CPU typehw perfevents: no hardware support availableBrought up 1 CPUsSMP: Total of 1 processors activated (125.00 BogoMIPS).atomic64 test passedNET: Registered protocol family 16vdso: 2 pages (1 code, 1 data) at base ffffffc0005b1000hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.software IO TLB [mem 0xbd400000-0xbd800000] (4MB) mapped at [ffffffc07d400000-ffffffc07d7fffff]Serial: AMBA PL011 UART driver9000000.pl011: ttyAMA0 at MMIO 0x9000000 (irq = 33) is a PL011 rev1console [ttyAMA0] enabledbio: create slab  at 0SCSI subsystem initializedSwitching to clocksource arch_sys_counterNET: Registered protocol family 2TCP established hash table entries: 16384 (order: 6, 262144 bytes)TCP bind hash table entries: 16384 (order: 6, 262144 bytes)TCP: Hash tables configured (established 16384 bind 16384)TCP: reno registeredUDP hash table entries: 1024 (order: 3, 32768 bytes)UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes)NET: Registered protocol family 1RPC: Registered named UNIX socket transport module.RPC: Registered udp transport module.RPC: Registered tcp transport module.RPC: Registered tcp NFSv4.1 backchannel transport module.Unpacking initramfs...Freeing initrd memory: 816K (ffffffc008000000 - ffffffc0080cc000)fuse init (API version 7.22)msgmni has been set to 4022io scheduler noop registeredio scheduler cfq registered (default)loop: module loaded vda: unknown partition table vdb: unknown partition table vdc: unknown partition tabletun: Universal TUN/TAP device driver, 1.6tun: (C) 1999-2004 Max Krasnyansky mousedev: PS/2 mouse device common for all miceinput: qwerty2 as /devices/9040000.goldfish-events/input/input0ashmem: initializedlogger: created 256K log 'log_main'logger: created 256K log 'log_events'logger: created 256K log 'log_radio'logger: created 256K log 'log_system'ip_tables: (C) 2000-2006 Netfilter Core Teamarp_tables: (C) 2002 David S. MillerTCP: cubic registeredNET: Registered protocol family 10ip6_tables: (C) 2000-2006 Netfilter Core Teamsit: IPv6 over IPv4 tunneling driverNET: Registered protocol family 17Bridge firewalling registeredRegistering SWP/SWPB emulation handlerdrivers/rtc/hctosys.c: unable to open rtc device (rtc0)Freeing unused kernel memory: 184K (ffffffc00057a000 - ffffffc0005a8000)init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_score_adj instead.init: /dev/hw_random not foundinit: /dev/hw_random not foundEXT4-fs (vda): mounted filesystem with ordered data mode. Opts: (null)EXT4-fs (vdb): Ignoring removed nomblk_io_submit optionEXT4-fs (vdb): mounted filesystem with ordered data mode. Opts: nomblk_io_submit,errors=panicEXT4-fs (vdc): Ignoring removed nomblk_io_submit optionEXT4-fs (vdc): mounted filesystem with ordered data mode. Opts: nomblk_io_submit,errors=panicinit: cannot find '/system/etc/install-recovery.sh', disabling 'flash_recovery'healthd: BatteryVoltagePath not foundhealthd: BatteryTemperaturePath not foundbinder: 774:774 transaction failed 29189, size 0-0logd.auditd: startshell@generic_arm64:/ $ 

0 0
原创粉丝点击