1. 程式人生 > >Android實戰技巧之四十:Android5.1.1原始碼編譯與燒寫

Android實戰技巧之四十:Android5.1.1原始碼編譯與燒寫

購買Nexus手機的朋友大多是為了自己修改系統玩,再加上其較高的價效比,在開發者中還是廣受歡迎的。我的5太子被我升級到了6.0預覽版,玩的正嗨,捨不得換回到5.1時代了。不過鑑於距6.0原始碼釋出還有段日子,5.1的原始碼編譯與燒寫仍是主流,下面就記錄了整個過程(持續了很長時間,我們要有耐心)。

搭建開發環境

系統推薦Ubuntu 14.04
1.openjdk is needed

$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk

set it the default java version

$ sudo update-alternatives --config java
$ sudo
update-alternatives --config javac

2.required package

sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip

遇到問題:

$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip
[sudo] password for
linc: Reading package lists... Done Building dependency tree Reading state information... Done make is already the newest version. zip is already the newest version. git is already the newest version. git set to manually installed. libxml2-utils is already the newest version. libxml2-utils set
to manually installed. Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: g++-multilib : Depends: gcc-multilib (>= 4:4.8.2-1ubuntu6) but it is not going to be installed E: Unable to correct problems, you have held broken packages

按照如下步驟即可:

$ sudo apt-get install g++-multilib
$ sudo apt-get install  bison git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip

gcc為必須

$ sudo apt-get install gcc

$ gcc -v
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 

repo

$ mkdir ~/bin
$ PATH=~/bin:$PATH

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

check sh1 sum:

$ sha1sum repo 
b8bd1804f432ecf1bab730949c82b93b0fc5fede  repo

For version 1.21, the SHA-1 checksum for repo is b8bd1804f432ecf1bab730949c82b93b0fc5fede

repo init

針對Nexus5的5.1.1的初始化如下:

LMY48I  android-5.1.1_r9    Lollipop    Nexus 4, Nexus 5, Nexus 6, Nexus 7 (flo), Nexus 9 (volantis/volantisg), Nexus 10
$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.1_r9

Your identity is: linc <[email protected].com>
If you want to change this, please re-run 'repo init' with --config-name

Testing colorized output (for 'repo diff', 'repo status'):
  black    red      green    yellow   blue     magenta   cyan     white 
  bold     dim      ul       reverse 

repo has been initialized in /home/linc/source-android/android-source

repo sync

$ repo sync

一個晚上兩個白天,終於下載完成,程式碼達34G.

Setting up ccache

Put the following in your .bashrc (or equivalent):

export USE_CCACHE=1

run the command:

prebuilts/misc/linux-x86/ccache/ccache -M 50G

Building the System

1.Set up environment

$ source build/envsetup.sh

or

$ . build/envsetup.sh

2.Choose a Target

$ lunch 

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. aosp_manta-userdebug
     8. aosp_flo-userdebug
     9. aosp_deb-userdebug
     10. full_fugu-userdebug
     11. aosp_fugu-userdebug
     12. aosp_tilapia-userdebug
     13. aosp_grouper-userdebug
     14. aosp_mako-userdebug
     15. aosp_hammerhead-userdebug
     16. aosp_flounder-userdebug
     17. aosp_shamu-userdebug
     18. mini_emulator_x86-userdebug
     19. mini_emulator_arm64-userdebug
     20. mini_emulator_x86_64-userdebug
     21. mini_emulator_mips-userdebug
     22. m_e_arm-userdebug

Which would you like? [aosp_arm-eng] 

Nexus5就選擇了15,如果只是用於模擬器就選擇1好了。
3.build

make -j4

如果遇到等待其他任務完成的錯誤,是多執行緒衝突,就直接make好了。
4.error
1)

No private recovery resources for TARGET_DEVICE hammerhead
host C++: bcc <= frameworks/compile/libbcc/tools/bcc/Main.cpp
clang++: error: unable to execute command: Executable "as" doesn't exist!
clang++: error: assembler command failed with exit code 1 (use -v to see invocation)
make: *** [out/host/linux-x86/obj32/EXECUTABLES/bcc_intermediates/Main.o] Error 1

try make clean.這是沒有安裝gcc的後果。

build successfully

#### make completed successfully (05:53:54 (hh:mm:ss)) ####

目錄結構如下:

out/target/product/hammerhead$ du -sh *
4.0K    android-info.txt
8.8M    boot.img
4.0K    cache
14M cache.img
64K clean_steps.mk
172K    data
4.0K    fake_packages
81M gen
64K installed-files.txt
8.1M    kernel
16G obj
4.0K    previous_build_config.mk
700K    ramdisk.img
1.4M    ramdisk-recovery.img
2.2M    recovery
9.5M    recovery.img
1.3M    root
2.9G    symbols
288M    system
307M    system.img
135M    userdata.img

Flash device

To flash a device, you will need to use fastboot, which should be included in your path after a successful build. Place the device in fastboot mode either manually by holding the appropriate key combination at boot, or from the shell with

$ adb reboot bootloader

Once the device is in fastboot mode, run

$ fastboot flashall -w

The -w option wipes the /data partition on the device; this is useful for your first time flashing a particular device but is otherwise unnecessary.

For more information about building for and running on actual hardware, see Running Builds.

Flash emulator

1.build generic img
lunch 1即可,然後正常make。

make completed successfully (05:02:47 (hh:mm:ss))

2.啟動模擬器

~/source-android/android-source/out/target/product/generic$ emulator -sysdir ~/source-android/android-source/out/target/product/generic -system system.img 
emulator: WARNING: system partition size adjusted to match image file (550 MB > 200 MB)

emulator: WARNING: data partition size adjusted to match image file (550 MB > 200 MB)

Creating filesystem with parameters:
    Size: 69206016
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 4224
    Inode size: 256
    Journal blocks: 1024
    Label: 
    Blocks: 16896
    Block groups: 1
    Reserved block group size: 7
Created filesystem with 11/4224 inodes and 1302/16896 blocks

模擬器順利啟動,與真機的區別有很多,比如開機畫面不同,Home的UI和操控都有所不同。具體原因敬請期待。