Android x86架构分析与移植1

Download as pdf or txt
Download as pdf or txt
You are on page 1of 56

Android-x86 Project

Marshmallow Porting
https://docs.google.com/presentation/pub?
id=1mUQDFaERipwQQWHiZxmkvwPXNPlqtdv9lXrY5hPoUJ4


[email protected]
2015/11/28
http://cwhuang.info
android-x86.org
Agenda

Introduction: what, why, how?


History and milestones, current status
How to develop android-x86
Inside android-x86
App compatibility issues
What we contributed?
Difficulties and challenges
Live Demo?

android-x86.org
Introduction

What's Android-x86?
Why needs Android-x86?

How can we do it?

android-x86.org
What's Android-x86 ?

An open source project aimed to provide a


complete solution for Android on x86 devices.
At first we use ASUS Eee PC and virtual box as
the reference platform.
Some vendors donate tablets to us, like
Tegatech Tegav2, 4tiitoo AG WeTab and AMD.
BSP (Board support Package) for x86 platform

android-x86.org
Why needs Android for x86?

Android is an open source operating-system


designed for arm platform
But it's open source, we can port it to other

platforms?
Mips porting (MIPS Technology)
PowerPC porting
Mentor Graphics
Power.org
x86 porting

android-x86.org
But what are the benefits?

Understanding Android porting process


The x86 platform is widely available

As a test platform, much faster than SDK

emulator
Android-x86 on vbox / vmware

Suitable for tablet apps

android-x86.org
Android architecture

android-x86.org
How to do that?

Toolchains already in AOSP, but old...


Kernel almost works, except power management, drivers
Libraries bugfixes or improvements
Building time bionic, llvm, ppp, v8, ...
Runtime bluetooth, vold, ...
HAL (hardware abstraction layer)
Framework / app
Android 4.0 (ICS) is the first Android version that can be built
for x86 without patches. However, to make it run on a real x86
device, there are still a lot of work to do.

android-x86.org
History (2009)

Mar: Not maintained, need patches


Apr: Patch hosting for android x86 support by
Yi Sun <beyounn at gmail.com>
May: Hard to maintain and sync with upstream
Jun: Need a common, complete code base
Jul: android-x86.org, release v0.9
Aug: Build 20090820
Sep: Build 20090916
Oct: Build 20091024
Nov: Android-x86 1.6 released
Dec: Eclair 2.0 porting

android-x86.org
History (2010)

Jan: Build 20100115 (Android 2.0)


Feb: Create eclair-x86 branch (Android 2.1)
Mar: Android-x86 1.6-r2 released
Apr: Eclair-x86 updated to 2.1-update1
Jul: Working on froyo-x86
Aug: A test iso for vm released
Sep: target eeepc, i915 HAL, 3G support
Oct: 3D hardware acceleration
Nov: Improved vold, target viewpad10
Dec: Installer read-write support, i965 support

android-x86.org
History (2011)

Jan: Android-x86 2.2 released


Feb: Gingerbread-x86 branch (Android 2.3)
Mar: Honeycomb-x86 porting (private)
Jul: Android-x86 2.2-r2 released
Aug: Android-x86 2.3-RC1 released
Nov: Android-x86 3.2-RC2 released
Dec: ICS-x86 branch (Android 4.0)

android-x86.org
History (2012)

Jan: Build 20120101


Feb: Android-x86 4.0-RC1 released
Apr: Update ics-x86 to 4.0.4
Jul: Android-x86 4.0-RC2 released
Nov: Jb-x86 porting based on Android 4.2
Jul: Build 20121225 (Android 4.2)

android-x86.org
History (2013)

Feb: Build 20130228 (Android 4.2)


Jun: Android-x86 4.0-r1 released
Jul: Build 20130725 (Android 4.3)
Nov: Kitkat-x86 porting based on Android 4.4

android-x86.org
History (2014)

Feb: Android-x86 4.4-RC1 released


Apr: Add ntfs/exfat/ext4 support to vold
May: Android-x86 4.4-RC2 released
Aug: Android-x86 4.4-r1 released
Nov: Lollipop-x86 porting based on Android 5.0
Dec: Kernel 3.18 porting

android-x86.org
History (2015)

Jan: Android-x86 4.4-r2 released


Mar: Lollipop-x86 updated to Android 5.1
Apr: Kernel 4.0 porting
Oct: Android-x86 5.1-rc1 released
Oct: Marshmallow-x86 porting for Android 6.0
Oct: Move git server to SourceForge

android-x86.org
Analytics: www.android-x86.
org

android-x86.org
Visitors map overlay

android-x86.org
Statistics (2009/08-2012/04)

Visits: 7,212,717
Unique Visitors: 4,447,993

Pageviews: 15,503,549

Top 5 Country/Territory

United States
South Korea
Germany
Russia
China

android-x86.org
Features of lollipop-x86
Android 5.1.1 (Lollipop-MR1) based
Support both 32-bit and 64-bit systems
Kernel 4.0.9, KMS enabled, support netbook/tablet native resolution
Live CD & disk installer, support ext4/ext3/ext2/ntfs/fat32
Provide hybrid iso image and EFI image
Hardware 3D acceleration (intel/radeon/nvidia chipsets)
Wifi, Bluetooth and Audio support
Auto-detect drivers
Touchscreen support, including calibration
Compressed filesystem (squashfs)
Support virtual machine like Virtual Box, Qemu and VMware
Debug mode (busybox, mksh, )

android-x86.org
Screenshots

android-x86.org
Develop android-x86

Get the source tree


Create a target (optional)

Customize kernel (optional)

Build an iso

Test on target device

android-x86.org
Get source

The git server

git.androidx86.org

android-x86.git.sf.net

$ repo init -u git://gitscm.sf.net/gitroot/android-


x86/manifest \
-b marshmallow-x86
$ repo sync

android-x86.org
Generic target

Device tree under


device/generic/x86

device/generic/x86_64

device/generic/common

BoardConfig.mk

android-x86.org
BoardConfig.mk

BOARD_GPU_DRIVERS :=

i915 i965 r600g swrast i915g nouveau r300g vmwgfx


WPA_SUPPLICANT_VERSION :=

VER_0_8_X or VER_0_6_X
TARGET_ARCH_VARIANT:=

x86 or x86-atom
include $(GENERIC_X86_CONFIG_MK)

android-x86.org
Build kernel

Building rules under


$(TOP)/build/core/tasks/kernel.mk
Each target can specify its own kernel config
Kernel image and modules are built on-fly

Build kernel solely:


make kernel
out/target/product/$TARGET/kernel
out/target/product/$TARGET/system/lib/modules/

android-x86.org
Customize kernel

$ source build/envsetup.sh
$ lunch android_x86(_64)-userdebug

$ make -C kernel O=$OUT/obj/kernel \

ARCH=x86 menuconfig
$ cp $OUT/obj/kernel/.config kernel/arch/x86/configs/

DO NOT make in kernel/ directly. If you do so, try

$ make -C kernel distclean


$ rm -rf $OUT/obj/kernel

android-x86.org
Build an iso image

$ source build/envsetup.sh
$ lunch $target-userdebug

$ make -jN iso_img


out/target/product/$target/$target.iso
{kernel,initrd.img,installer.img,ramdisk.img,system.sfs}
Compress filesystem if mksquashfs is available

(Disable it by USE_SQUASHFS=0)

android-x86.org
Test the iso image

Hybrid iso format


Create a bootable USB
dd if=target.iso of=/dev/sdX
Unetbootin
Linux Live USB Creator ( LiLi )
Boot from the USB disk

Live mode
VESA mode
Debug
Installer

android-x86.org
Inside android-x86

Bootstrap
Peripherals support
Graphic hardware acceleration
Wifi
Touchscreen
Audio
Bluetooth
GPS
G-sensor
3G modem
Storage

android-x86.org
Bootstrap android-x86

Bootloader (grub) loads kernel & initrd.img


init script (bootable/newinstaller/initrd/init)
Detect android-x86 filesystem
Unpack ramdisk.img, mount /android/system
Load scripts (/scripts, /src/scripts)
Run installer if INSTALL=1
Load modules (auto-detect)
mount /android/data, /android/sdcard
Run ts_calibrate if BOARD_USES_TSLIB=true
Set DPI
Post detect
switch_root (chroot) /android

android-x86.org
Init hook scripts

Default scripts

0-auto-detect
1-install
2-mount
3-tslib
4-dpi
Target script
Customize scripts

android-x86.org
Revise booting

Boot parameters can be put to cmdline

ROOT
SRC
DATA, SDCARD
EXTMOD
DEBUG
UVESA_MODE
HWACCEL
BOARD_USES_TSLIB
DPI
Put scripts in $SRC/scripts/

android-x86.org
Debug mode

Boot by DEBUG=1
Write boot log to /tmp/log
Enter interactive shell twice
After mount android filesystem
Before chroot
Another two virtual consoles at Alt-F2 / F3
Run android-x86 in chroot
Be able to access files outside android filesystem
at Alt-F2 / F3 (e.g., /mnt/grub/menu.lst)
Auto start logcat (/data/log.txt)

android-x86.org
Graphic system

Android uses framebuffer driver, no X

vesa driver
uvesa driver
hardware driver - KMS or non-KMS
Use soft rendering by default

Buggy for 1366x768


Very slow in 32-bit color depth
Implements hardware rendering by Mesa library

Needs KMS driver

android-x86.org
How to change resolution?

vesa driver

vga=xxx, vga=ask
uvesa driver

UVESA_MODE=
hardware driver, no Mesa

video=1280x800-32
KMS + Mesa

setprop debug.drm.mode 1024x768

android-x86.org
Mesa porting for HW acceletion

Version 11.0.3 Android graphic system


~ 60 fps
Support drm_gralloc (HAL)
Intel integrated graphic chip
AMD radeon/radeonsi libGLES_mesa
Nvidia (nouveau)
Vmware? (vmwgfx)
Not support

libdrm
Intel Atom Zxxx, E6xx (PowerVR)
Kernel KMS driver

GPU hardware

android-x86.org
Wifi
Android-x86 adds patches to auto-detect wifi driver
/sys/class/net/*/wireless
WPA_SUPPLICANT_VERSION :=
VER_0_8_X
VER_0_6_X
BOARD_WPA_SUPPLICANT_DRIVER :=
NL80211 (0_8)
AWEXT (0_6)
BOARD_WPA_SUPPLICANT_PRIVATE_LIB :=
private_lib_driver_cmd (0_8)

android-x86.org
Touchscreen

ICS needs an idc file for touchscreen

VID & PID


Device name
Android-x86 uses a default GenericTouch.idc if
no special idc found for a touchscreen.
Most touchscreens should just work if drivers

are available.

android-x86.org
Touchscreen driver

May need to load driver by EXTMOD


May need to calibrate by setting

BOARD_USES_TSLIB=true
Most new multi-touch touchscreens are supported

by hid-multitouch driver.
echo 3 03eb 201c 1 > \
/sys/module/hid_multitouch/drivers/hid:hid-multitouch/new_id
Multi-touch issues can be reported to Benjamin

Tissoires, who has great help to android-x86.org.

android-x86.org
Audio

Audio HAL has been changed in ICS. WindRivers


implementation alsa_sound doesnt work anymore.
Use a hacked version from Linaro.
BoardConfig.mk

BOARD_USES_GENERIC_AUDIO := false
BOARD_USES_ALSA_AUDIO := true
BUILD_WITH_ALSA_UTILS := true
Some audio chips dont work?

android-x86.org
Bluetooth

Android searches /sys/class/rfkill/rfkillX


where X starts from 0
Not always true if devices reconnect
Android-x86 modified it to search
/sys/class/rfkill/ directly
Tested drivers: btusb, ath3k
Some issues are reported for ath3k

android-x86.org
GPS

HAL hardware/gps contributed by a


volunteer to support GPS input from tty
setprop ro.kernel.android.gps ttyS3
setprop ro.kernel.android.gpsttybaud 9600
Bluetooth GPS also works (need an app
from Market)

android-x86.org
G-sensor

HAL Kbdsensor: Support G-sensor inputs from keyboard


driver: Ctrl-Alt-arrow keys
BOARD_USES_KBDSENSOR := true
BOARD_USES_KBDSENSOR_ROTKEY1 := true (F9-F12)
BOARD_USES_KBDSENSOR_ROTKEY2 := true (F5-F8)
HDAPS accelerometer sensor (thinkpad)

BOARD_USES_HDAPS_ACCEL := true

android-x86.org
3G modem

Two implementations of RIL


reference-ril
huaweigeneric-ril
setprop rild.libpath /system/lib/libhuaweigeneric-ril.so
setprop rild.libargs "-d /dev/ttyUSB2 -v /dev/ttyUSB1"

Only tested OK on Huawei modem


Internet, SMS work
Phone also works, but no sound

android-x86.org
Storage

Support internal storage since 4.0-RC1

Use internal storage to simulate /mnt/sdcard


Share the same space as /data
MMC/SD/USB auto-mount

A modified vold daemon


No vold.fstab needed
Fake sdcard is considered obsolete

android-x86.org
App compatibility?

Use arm native code (jni)


NDK r6 support x86

Need special peripherals

Sensors, GPS, NFC

Resolution issue

Not design for tablet

Force portrait mode

android-x86.org
Make the app friendly for x86

Do not use jni, or build x86 libs


MoboPlayer for x86, Dolphin

player
Consider larger resolution

Allow landscape mode

Design tablet mode

android-x86.org
Open source activities

www.android-x86.org

code.google.com/p/android-x86
sourceforge.net/projects/android-x86
Over 2,800,000 downloads

Over 320,000 downloads for ics-x86


twitter.com/android_x86
IRC at irc.freenode.net #android-x86

android-x86.org
Discussion group

groups.google.com/group/android-x86
[email protected]

Over 3600 subscribers

~ 1000 emails/month

android-x86.org
Cowork with upstream AOSP

Submit patches to review.source.android.com


19 patches are accepted and merged (2010):
9779, 10065, 10066, 11443, 11444, 13251,13272,
13467, 13468, 14078, 14117, 15209, 15599,
15664, 15702, 15975, 16034, 16979, 16980
Patches review in progress
16035, 16162, 16163, 16318, 17233, 17234,
17273

android-x86.org
Open source partners

0xdroid - 0xlab
CyanogenMod

MirOS (mksh)
OESF
Open Invention Network (OIN)
LIME

android-x86.org
What we contributed?

Modified build system to customize kernel


Open source OpenGL ES implementation

New style Android installer

MMC/SD/USB auto-mount

Configurable keyboard layouts

Soft mouse cursor (obsolete)

Ethernet support (deprecated)

android-x86.org
Soft mouse cursor & Ethernet

Handle mouse events and draw cursor on Canvas

Support wheel for scrolling, right button


Obsolete since honeycomb

Ethernet status tracker (like Wifi status tracker)

Monitor the Ethernet status


Configurable via Settings

Considered deprecated

Simulate by libril-ethernet?

android-x86.org
Challenges

Too many platforms, peripherals

auto-detect, target specified scripts


Android is originally designed for ARM

Some are optimized for ARM only


Some apps only provide ARM version

Optimization for x86

Art, bionic, llvm, v8, ...


Hardware acceleration (2D/3D, codec, ...)

Power management

android-x86.org
Vendors

Google

No interesting before, but may


changed since ICS


Difficulty: don't use AOSP tree

Intel

At first no interesting, no help


Begin their own porting recently

Criticize?

android-x86.org
Call for developers

Google group: Android-x86

http://groups.google.com/group/android-x86

IRC channel at irc.freenode.net

#android-x86

Issue tracker
http://code.google.com/p/android-x86/issues/list

android-x86.org

You might also like