kuailexiaochuan 2011-05-01
原文地址:
http://randomizedsort.blogspot.com/2010/08/building-android-and-linux-kernel-for.htmlSystem Requirements
Google's Android build system only supports Linux (Ubuntu) and Mac OS. Examples below all use Ubuntu. The two most important tools from the Android SDK are "adb" and "fastboot". But "fastboot" is not available in the Linux distribution of the SDK. We will build it from the source.FortheImpatientIfyoualreadyknoweverything,youcanfindrequiredstepsforNexusOneinsummaryfromthisthread.Butyourmileagemayvary.
CompilingAndroidPlatform
VCSGoogleusesGittoastheVCSforbothAndroidanditsownLinuxkernel.TheirsourceispublishedonGitwebathttp://android.git.kernel.org/.
HereareacoupleofGittutorialsforCVSusers:
Cogito-CVSCrashCourse
CVStogitTransitionGuide
GooglepublishesitsrepotoolformanagingAndroidsource.RepodoesnotseemtoworkontheLinuxKernelsourcetreethough.
CHECKING-OUTSOURCE1.CreatetwoseparatedirectoriestoholdAndoridplatformanditsLinuxkernelsourcetrees:
laptop-2:~/myandroid$ ls kernel platform2. Next, change to the platform directory and and initialize the repo.
$ cd platform $HOME repo init -u git://android.git.kernel.org/platform/manifest.git -b froyoThe branch name "froyo" can be found on the git web at:
http://android.git.kernel.org/?p=platform/manifest.git;a=summary
Remotebranchnamescanbefoundinthe"heads"sectiononthatwebpage.
3. Sync with the source.$HOME repo syncThis makes "~/myandroid/platform" the root of the platform source tree. We will use "platform" for short in the following examples.
$ . build/envsetup.sh2. If building a phone-specific Android, then build adb first. Otherwise, skip to step six. But note that you can only build a generic Android if you skip device steps. If you flash a generic Android image to your phone, your phone will not even get a radio signal. Nor will you be able to use any buttons on the device. So skip this step only if you just want to play with the emulator.At the root of the source tree:
$ make adb3. Make adb available on the path.
$ export $HOME/myandroid/platform/out/host/linux-x86/bin:$PATH $ which adb $HOME/myandroid/platform/out/host/linux-x86/bin/adb4. We need to extract device specific files from Nexus One. Connect the phone to the laptop using the USB cable. The phone needs to be powered on. If the phone has not been set to USB debugging. Set it at:Settings-->Applications-->Development-->USBdebuggingThencheckthatadbcanseethedevice.
/out/host/linux-x86/bin$ sudo ./adb devices [sudo] password for userone: * daemon not running. starting it now * * daemon started successfully * List of devices attached HTXXXXXXXXX device5. Google Nexus One is HTC Passion. So we now run the Passion-specific extraction script under the "device/htc/passion" directory.
NotethatthedevicefilesmustbeextractedfromaAndroiddevicethatmatchestoyourbuild.HereweextractfromaNexusOnewith2.2updatebecausewearegoingtobuildtheFroyobranchofthecode.
$ cd device/htc/passion /device/htc/passion$./extract-files.shNote that adb must be on the path in order for the extraction script to succeed. The extraction script will pull HTC proprietary files from the device and store them under "vendor/htc/passion".
/vendor/htc/passion/proprietary$ ls 01_qcomm_omx.cfg libEGL_adreno200.so libOmxVdec.so AdieHWCodecSetting.csv libGLESv1_CM_adreno200.so libOmxVidEnc.so akmd libGLESv2_adreno200.so libopencorehw.so AudioBTID.csv libgps.so libq3dtools_adreno200.so bcm4329.hcd libgsl.so libqcomm_omx.so default.acdb libhtc_acoustic.so libstagefrighthw.so default_att.acdb libhtc_ril.so mm-venc-omx-test default_france.acdb liblvmxipc.so parse_radio_log fw_bcm4329_apsta.bin libmm-omxcore.so vpimg fw_bcm4329.bin liboemcamera.so yamato_pfp.fw libcamera.so libOmxCore.so yamato_pm4.fw6. Change back to the root of the source tree and use "lunch" to set up appropriate build environment variables.
$ lunch You're building on Linux Lunch menu... pick a combo: 1. generic-eng 2. simulator 3. full_dream-userdebug 4. full_passion-userdebug 5. full_sapphire-userdebug Which would you like? [generic-eng] 4The "generic-eng" build option will allow you to build an Android that is not device specific. But then you can't really use a generic Android image on a real phone because the generic image does not know how to use device-specific features such as buttons and camera. Nor can the generic image read radio signals. Therefore, the generic-eng build is only useful for emulator purpose. The main difference between generic-eng and userdebug is if the file system is read-write or read-only by default. We will select "full_passion-user-debug" here because we want to flash our images to the device.7. Build the Android platform from the root of the source tree.
$ makeNote: When building "full_passion-userdebug" the first time, I hit a compiler error on "librpc.so not found" which caused references in HTC's proprietary libgps to fail compiling. After googling a solution, I found the following workaround:
$ mm librpc $ makeDo not run "make clean" when performing the two steps above. I have since checked out the froyo branch many times and have never encountered this problem again.8. Inspect build output.
Thebuildartifactsarelocatedundertheoutsubdirectory.
$ ls out casecheck.txt CaseCheck.txt debug host target tmp versions_checked.mkThe Android tools for Linux/X86 are located under "host". The device images are under "target".Compiling Linux Kernel for ARMCHECKING-OUT SOURCEI used Git instead of Google's repo for kernel building.
1.ClonetheMSMfamilyofthekerneltreefromtheAndroidGittoaworkingdirectory.AsofJuly2010,allHTCAndroidphonesuseQualcomm'sMSMfamilyoftheCDMA/GSM/UMTSchipsets.NexusOneisnoexception.
userone@userone-laptop-2:~/myandroid/kernel$ git clone git://android.git.kernel.org/kernel/msm.git .If building the emulator kernel, use "git://android.git.kernel.org/kernel/common.git" instead.2. Check out the latest 2.6.32 kernel branch for Nexus One.
userone@userone-laptop-2:~/myandroid/kernel$ git checkout --track -b userone-msm-2.6.32-nexusonec remotes/origin/android-msm-2.6.32-nexusonecWhen the check out is done, you can use git to verify the branch info.
userone@userone-laptop-2:~/myandroid/kernel$ git branch -a android-msm-2.6.27 userone-msm-2.6.32 * userone-msm-2.6.32-nexusonec remotes/origin/HEAD -> origin/android-msm-2.6.27 remotes/origin/android-msm-2.6.25 remotes/origin/android-msm-2.6.27 remotes/origin/android-msm-2.6.29 remotes/origin/android-msm-2.6.29-donut remotes/origin/android-msm-2.6.29-nexusone remotes/origin/android-msm-2.6.32 remotes/origin/android-msm-2.6.32-nexusonec remotes/origin/android-msm-htc-2.6.25 remotes/origin/android-msm8k-2.6.29 remotes/origin/msm-2.6.25The root of the kernel tree is now "userone@userone-laptop-2:~/myandroid/kernel".
2.Setupenvironmentvariablesforcrosscompiling.
$ export ARCH=arm $ CROSS_COMPILE=arm-eabi-
3.Pullthekernelconfigurationfromthedeviceandthenbuildthesource.ThisstepisthesameforbuildingakernelforAndroidemulator.
$ adb pull /proc/config.gz $ gunzip config.gz $ mv config .config $ makeThe arm target can be found under ..kernel/arch/arm/boot.
$ ls arch/arm/boot bootp compressed Image install.sh Makefile zImageThe newly built kernel is "zImage".4. Change to root of the Android platform tree and build the new Android with the new kernel.
$ rm -rf out $ make -j4 TARGET_PREBUILT_KERNEL=$HOME/myandroid/kernel/arch/arm/boot/zImageThe TARGET_PREBUILT_KERNEL will instruct the Android build system to use our custom-built kernel.
FlashAndroidImagetotheDeviceWarning!!Flashingimageswilleraseallyouruserdataonthephone!
Warning!!AttemptingthisatyourownRisk!!Yourphonewillbebricked!!
Warning!!Alwayshavefactoryimageshandysoyoucanrecoverincaseofbrickedphones!
An unlocked bootloader allows flashing custom images to an Anroid Phone. Android Dev Phone 1 and 2 ship with unlocked bootloaders. But the bootloader on Nexus One needs to be unlocked first.Both adb and fastboot can write files to the device. I use fastboot for flashing images:UNLOCK THE BOOTLOADER IN NEXUS ONEfrom the (#References):# Reboot phone into fastboot: Power off device and hold down trackball while powering back on. (The fastboot screen is the one with the Androids on skateboards) # Open a command prompt and navigate to your Android SDK tools folder. # Type ‘fastboot devices‘ to make sure your phone is recognized. # Type ‘fastboot oem unlock‘ to unlock the bootloader. # Use volume keys to navigate to yes and press the power button to confirm.
FLASHANDROIDIMAGESTONEXUSONEWenowflashandroidimagesthatwejustbuilttothedevice.
$ sudo $HOME/myandroid/platform/out/host/linux-x86/bin/fastboot -p passion -w flashall [sudo] password for userone: < waiting for device > -------------------------------------------- Bootloader Version...: 0.33.0012 Baseband Version.....: 4.06.00.12_7 Serial Number........: HTXXXXXXXXX -------------------------------------------- checking mid... OKAY [ 0.003s] checking product... OKAY [ 0.009s] checking version-bootloader... OKAY [ 0.002s] checking version-microp... OKAY [ 0.004s] checking version-baseband... OKAY [ 0.012s] sending 'boot' (2336 KB)... OKAY [ 0.366s] writing 'boot'... OKAY [ 0.917s] sending 'recovery' (2562 KB)... OKAY [ 0.405s] writing 'recovery'... OKAY [ 1.048s] sending 'system' (75301 KB)... OKAY [ 10.943s] writing 'system'... OKAY [ 25.634s] erasing 'userdata'... FAILED (remote: not allowed) finished. total time: 39.418sThe error about failing to erase userdata is because we selected user build (i.e. "userdebug") when building android. We can flash it manually:
$ sudo $HOME/myandroid/platform/out/host/linux-x86/bin/fastboot flash userdata $HOME/myandroid/platform/out/target/product/passion/userdata.img sending 'userdata' (2 KB)... OKAY [ 0.022s] writing 'userdata'... OKAY [ 4.872s] finished. total time: 4.894sIf the phone hangs after rebooting, we can restore it back to factory images.
2.Unzipimagestoadirectory.
userone@userone-laptop-2:~/Downloads/nexusone$ ls android-info.txt NexusOne_ERE36B_TMOUS.zip system.img boot.img recovery.img userdata.img3. Flash all images to the device using fastboot.
ThisisthemethodIusedtorestoremyNexusOnetofactorysettings.
$ sudo $HOME/myandroid/platform/out/host/linux-x86/bin/fastboot flash boot ./boot.img $ sudo $HOME/myandroid/platform/out/host/linux-x86/bin/fastboot flash recovery ./recovery.img $ sudo $HOME/myandroid/platform/out/host/linux-x86/bin/fastboot flash system ./system.img $ sudo $HOME/myandroid/platform/out/host/linux-x86/bin/fastboot flash userdata ./userdata.imgI did not use "fastboot -w flashall" and "fastboot update [some].zip" because they complained about missing files.
TIPSUseadbtobootthedeviceintotherecoverymode.
$ adb reboot recovery
$ adb push <recovery-image-package>.zip /sdcard/update.zip
$ sudo fastboot boot arc/arm/boot/zImage
$ adb pull /proc/config.gz
ReferencesGettingAnroidSource
AndroidBuildSystem
BuildingAOSPfortheNexusOne
CompileAndroidkernelfromthesource
FedoraARM/HowToQemu
KernelHackers'Guidetogit
HTCAndroidDevPhone1
Video:HowtoUnlockandRootaNexusOne
HTCKernelSourceandBinaries
MotorolaKernelSource
Howto:RootingyourNexusOne-adefinitiveguidetowhat’sinvolved
AndroidFastboot
MSM/QSDAndroidEnablementProject
AndroidBootProcessfromPower-on
HowtoBuildtheLINUXKERNELfortheANDROIDEMULATOR(Eclairversion)
DownloadandBuildtheGoogleAndroid
AnroidPortingonRealTarget
OpenBinder
Technoteandroid-2.6.31-001:Howtoregeneratebionic/libc/common/kernelheadersforlinuxkernelv2.6.31
Howtodumpbootmessagewithoutadb