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和操控都有所不同。具体原因敬请期待。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 00:16:07

Android实战技巧之四十:Android5.1.1源代码编译与烧写的相关文章

Android实战技巧之四十四:Hello,Native!

在Android上运行C程序对于做上层App的童鞋来说有些陌生,因为目前的Android应用开发怎么还是绕不过Java. 但对于底层驱动开发者,这就是家常便饭一样,因为Android是Linux分支,底层是C/C++的世界. 有时为了测试一些功能,我们也会编写直接运行在Android终端下的C程序.前提是有Android交叉编译器以及Android系统的root权限. 交叉编译工具 ndk为我们开发native程序做了很多工作,下面我们将Android交叉编译工具从ndk中分离出来. 我的系统是

Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

【转】Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

Android实战技巧之四十三:终止一个线程引起的

这是一道老牌面试题.通常面试官会问你对Java线程的了解,然后再问此问题. 从理论到实践,这是一条好路子. 线程是操作系统实现多任务的一种方式,可以理解为线程是一个任务的执行单元.比如Android系统中每个App都会有自己的主线程,同时还可以创建worker thread"并行"为我们工作. Java中创建新线程的方法 Java对线程(Thread)提供了语言级的支持(依托虚拟机吧).java.lang包下有Thread类和Runnable接口,都可以替你完成创建新线程的工作. 1.

Android实战技巧之三十:人脸检测-静态

最近微软的how-old.net把人脸识别技术又大大的火了一把.通过大数据和复杂的算法,能够神奇的预测出照片中人物的性别和年龄.虽然错误率也不低,但是大家都抱着玩一玩乐一乐的心态把照片传上去让机器来鉴定一下自己的颜龄. 人脸识别算法是高深复杂的,面对着计算机视觉的种种数学公式,我就已经投降了.先来简单的玩玩人脸检测吧.Android早已提供了FaceDetector类,今天就来看看如何使用这个类人脸检测吧. 流程: 1.打开文件夹选择照片 2.将照片加载到bitmap中并缩放到设置的宽高 3.用

Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库

第三方类库源码 将一网友的XMPP代码从ADT转到AS时,发现其使用了第三方类库,源码放在了lib下,直接在AS中Import project,第三方类库并没有自动导入进来,看来需要自己动手了. 项目的目录结构如下: XMPP$ ls app build.gradle gradlew import-summary.txt XMPP.iml build gradle gradlew.bat local.properties settings.gradle 1 2 3 1 2 3 将第三方源码qqE

Android实战技巧之三十二:Android Studio中的源代码管理

Android Studio最近经过了两次升级到了Android Studio 1.2.1.1, 用起来是越来越顺手了.AS中加入了主流的源码管理工具,让开发者不用离开AS就可以提交和管理代码. 下面就演示一下在AS中使用git管理代码. 选择要提交的代码 右键->commit 编写commit message 可以选择commit and push一起完成提交的动作 确认后push 查看提交历史和对比文件 总结: 玩git的都知道在命令行下有些版本历史信息的显示是不方便的,我们需要借助gitk

Android实战技巧之十八:adb取出安装在手机中的apk

场景: 朋友看见你Android手机中的游戏或应用很好玩,也想装一个此程序,但限于网络条件不能从网上下载.那么最简单的办法就是直接从你手机中将此apk扣出来给他安装上. pm命令 第一步,找到程序的包名 借助adb shell pm命令,将安装的所有应用包名列出来: $ adb shell pm list packages package:android package:cn.wps.moffice package:com.android.backupconfirm package:com.an

Android实战技巧之十:获得屏幕物理尺寸、密度及分辨率

大家帮忙喽! 博主参加2014博客之星活动,大家帮忙投票啦!猛击这里! 通过程序去了解硬件情况是一件十分有意思的事情.很早我就研究在WM6.5上获得屏幕物理尺寸,但一直没有成功.后来又想要在Android上有所突破,不过在今天之前得到的尺寸都不准确.虽然很多人认为没必要这么较真,因为貌似很多情况下用不到.不过我就当这是一件很有挑战性的事,一定要做到.对,就是这么任性. 源码中android.view包下的Display类提供了很多方法供程序员获得显示相关的信息,通过此类让我们开启了解设备屏幕之旅