31
Busybox Integration on Android Botao Sun ([email protected]) Android Builders Summit botao_sun Linaro Android Platform Team

Busybox Integration on Android - The Linux Foundation

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Busybox Integration on Android - The Linux Foundation

Busybox Integration on Android

Botao Sun ([email protected])

Android Builders Summit

botao_sunLinaro Android Platform Team

Page 2: Busybox Integration on Android - The Linux Foundation

Why we do this?

1. Arming your board:● More features, more possibilities.

2. Re-use existing open source software:

● DO NOT reinvent the wheel. 3. Meet customer requirements:

● Make a highly customized system to finish a specific job, such like: automation, computation...

● The control is in your hands, not the manufactures.

botao_sunLinaro Android Platform Team

Page 3: Busybox Integration on Android - The Linux Foundation

Preparation

1. Hardware:● 64-bit Dual-Core CPU● Hard disk with enough free space - 100GB+● 4GB+ RAM● Linaro development board, for example:

Samsung Origen board 2. Software:

● 64-bit Linux distribution, Ubuntu or Debian recommended

botao_sunLinaro Android Platform Team

Page 4: Busybox Integration on Android - The Linux Foundation

Preparation

3. Get busybox source code:● Download source code package:

○ http://busybox.net/downloads/

● Git clone (install git first if you don't have):○ http://busybox.net/source.html

■ git clone git://busybox.net/busybox.git

○ For git install: http://git-scm.com/

botao_sunLinaro Android Platform Team

Page 5: Busybox Integration on Android - The Linux Foundation

Preparation

4. Get repo (install curl first if you don't have):● For curl install: http://curl.haxx.se/● $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

● $ chmod a+x ~/bin/repo5. Get Linaro tool chain:

● https://android-build.linaro.org/builds/~linaro-android/toolchain-4.6-bzr/

botao_sunLinaro Android Platform Team

Page 6: Busybox Integration on Android - The Linux Foundation

Preparation

6. Get Linaro Android platform source code:● $ repo init -u git://android.git.linaro.org/platform/manifest.git -b linaro_android_4.0.3 -m staging-origen.xml

● $ repo syncIt will require user name & email address during the repo init, just follow the instructions.

botao_sunLinaro Android Platform Team

Page 7: Busybox Integration on Android - The Linux Foundation

Preparation

7. Initializing a Build Environment:● Refer to these 2 web pages to install the

packages which you don't have:○ http://source.android.com/source/initializing.html

○ http://bazaar.launchpad.net/~linaro-infrastructure/linaro-android-build-tools/trunk/view/head:/node/setup-build-android

botao_sunLinaro Android Platform Team

Page 8: Busybox Integration on Android - The Linux Foundation

A full build

1. Enter Android root directory, then run:● $ . build/envsetup.sh

2. Extract tool chain package then run:● $ make -j4 HOST_CC=gcc-4.5 HOST_CXX=g++-4.5 HOST_CPP=cpp-4.5 TARGET_PRODUCT=origen TARGET_SIMULATOR=false TARGET_TOOLS_PREFIX=/your_toolchain_path/bin/arm-linux-androideabi- boottarball systemtarball userdatatarball showcommands

botao_sunLinaro Android Platform Team

Page 9: Busybox Integration on Android - The Linux Foundation

A full build

3. A better build command:● $ make -j4 HOST_CC=gcc-4.5 HOST_CXX=g++-4.5 HOST_CPP=cpp-4.5 TARGET_PRODUCT=origen TARGET_SIMULATOR=false TARGET_TOOLS_PREFIX=/your_toolchain_path/bin/arm-linux-androideabi- boottarball systemtarball userdatatarball showcommands > build_log_YYMMDD.txt 2>&1 &

botao_sunLinaro Android Platform Team

Page 10: Busybox Integration on Android - The Linux Foundation

A full build

● On my Lenovo ThinkPad T420 laptop, with Intel i5-2410M CPU (2.30GHz), 4GB RAM, 500GB 7200RPM hard disk, a full build will take 90+ minutes.

● Once the build is done, you will find 3 target

packages: "boot.tar.bz2", "system.tar.bz2" and "userdata.tar.bz2" under the path: /your_Android_root/out/target/product/origen

botao_sunLinaro Android Platform Team

Page 11: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

● Before building Busybox against to the whole Linaro Android platform, we'll build it with the Linaro tool chain individually.

● In this step we will familiarize ourselves with the

build architecture of Busybox.

● Your Busybox source code should look like this:

botao_sunLinaro Android Platform Team

Page 12: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

botao_sunLinaro Android Platform Team

Page 13: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

● Run: $ make menuconfig

botao_sunLinaro Android Platform Team

Page 14: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Configuration file for Android:

botao_sunLinaro Android Platform Team

Page 15: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Build options in configuration file for Android:

botao_sunLinaro Android Platform Team

Page 16: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Customize the configuration file:● Set your own tool chain path and prefix;● Enable more applets;● Modify other configuration items you want.

Tips for configuration file customization:

● Usually we build Busybox in dynamic mode;● Enable applet one-by-one;● Backup your configuration file.

botao_sunLinaro Android Platform Team

Page 17: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Use "android-build" script:

botao_sunLinaro Android Platform Team

Page 18: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Look into "android-build" script:

botao_sunLinaro Android Platform Team

Page 19: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Compile the source:

● Enter your Busybox source code directory then run:

○ $ make android_defconfig● Run:

○ $ ./examples/android-build● If everything is OK, you will get the binary

"busybox" file under your source code directory.

botao_sunLinaro Android Platform Team

Page 20: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Tips:● While Busybox compiles, it will link to the libraries

which have been generated from the whole platform build. Therefore, if you already made a platform build, you will find that Busybox compilies quickly - it take less than 1 minute.

● Because our compiling mode is dynamic, in order to run busybox, you have to transfer it to the directory "/system/bin" on your board.

botao_sunLinaro Android Platform Team

Page 21: Busybox Integration on Android - The Linux Foundation

Build Busybox in platform

Put Busybox source code here:● /your_Android_root_directory/external/busybox

Write a "Android.mk" file then put it in Busybox source code directory.

botao_sunLinaro Android Platform Team

Page 22: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Write "Android.mk" file for Busybox - Part I:

botao_sunLinaro Android Platform Team

Page 23: Busybox Integration on Android - The Linux Foundation

Build Busybox out of platform

Write "Android.mk" file for Busybox - Part II:

Page 24: Busybox Integration on Android - The Linux Foundation

Android.mk

Android.mk: Android.mk files are merged into one giant Makefile during the Android build process.A typical Android.mk is its own build system, e.g. LOCAL_SRC_FILES := file1.c file2.cLOCAL_MODULE := libmylibraryinclude $(BUILD_STATIC_LIBRARY) If something already has a build system and you don't want to reinvent it, you have to "abuse" the fact that it's a Makefile at heart:

botao_sunLinaro Android Platform Team

Page 25: Busybox Integration on Android - The Linux Foundation

Android.mkdroid: busybox

systemtarball: busybox

"droid" and "systemtarball " are the targets we're building when building the OS - so make sure they depend on the target we're introducing

busybox: $(TARGET_CRTBEGIN_DYNAMIC_O) $(TARGET_CRTEND_O) $(TARGET_OUT_STATIC_LIBRARIES)/libm.so $(TARGET_OUT_STATIC_LIBRARIES)/libc.so $(TARGET_OUT_STATIC_LIBRARIES)/libdl.so

We need bionic (libc) and friends to be built first - and Android.mk has no way of knowing this automatically - so we have to list the deps manually.

cd external/busybox && \ sed -e "s¦^CONFIG_CROSS_COMPILER_PREFIX=.*¦CONFIG_CROSS_COMPILER_PREFIX=\"$(shell basename $(TARGET_TOOLS_PREFIX))\" configs/android_defconfig >.config && \

Inject parameters from Android's build system into busybox's build system...

$(MAKE) oldconfig && \ $(MAKE) && \ mkdir -p ../../$(PRODUCT_OUT)/system/bin && \ cp busybox ../../$(PRODUCT_OUT)/system/bin/

And call into busybox's build system to do its job

botao_sunLinaro Android Platform Team

Page 26: Busybox Integration on Android - The Linux Foundation

Build Busybox in platform

Output directories definition:● /Android_root/build/core/envsetup.mk

botao_sunLinaro Android Platform Team

Page 27: Busybox Integration on Android - The Linux Foundation

Build Busybox in platform

Use "mm" to rebuild just Busybox:● After you've finished your changes in, cd back to

your Android root directory and run:○ $ . build/envsetup.sh○ $ HOST_CC=gcc-4.5 HOST_CXX=g++-4.5 HOST_CPP=cpp-4.5 TARGET_PRODUCT=origen TARGET_SIMULATOR=false TARGET_TOOLS_PREFIX=/your_toolchain_path/bin/arm-linux-androideabi- mm

botao_sunLinaro Android Platform Team

Page 28: Busybox Integration on Android - The Linux Foundation

Build Busybox in platform

If everything works, you will find your "busybox" binary file in this directory:

● /your_Android_root/out/target/product/origen/system/bin

Transfer it to the directory "/system/bin" on your board then run this command to test it:

● $ busybox top

botao_sunLinaro Android Platform Team

Page 29: Busybox Integration on Android - The Linux Foundation

Build Busybox in platform

Make a final full build:● After add the item likes this in your product

manifest;○ <project path="external/busybox" name="platform/external/busybox" revision="linaro_android_4.0.3"/>

● You can launch a full platform build now (Page 8);● If the build can be done successfully, after flash it

to your product, you can launch busybox in the serial or ADB shell.

botao_sunLinaro Android Platform Team

Page 30: Busybox Integration on Android - The Linux Foundation

Go through the dots

● Prepare the hardware & software environment● Launch a full platform build without busybox● Build busybox out of platform with Linaro tool

chain○ Build error may happen here

● Build busybox in platform with Linaro tool chain and "Android.mk"

○ Build error may happen here● Launch a full platform build with busybox

botao_sunLinaro Android Platform Team

Page 31: Busybox Integration on Android - The Linux Foundation

Thank you!

Feel free to send your questions and comments toBotao Sun ([email protected])

orbotao_sun in #linaro-android on irc.freenode.

net