安卓5.0源码编译及烧录到真机

本文详细介绍了在Ubuntu环境下从下载源码、安装依赖到编译完成Android系统的全过程,并提供了常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的操作都是在linux下进行的,我用的Ubuntu。切换到su超级用户。
1.下载源码,有各种方法:
①你如果能访问谷歌的话,直接用git下载。
②不能访问谷歌,那就搜索下载源码压缩包(搜不到的可以联系我)。
2.安装open jdk 7(必须),不要安装oracle的jdk,这里面的原因比较复杂,我想大概和之前oracle-Google打官司有关吧。

sudo add-apt-repository ppa:openjdk-r/ppa  
sudo apt-get update   
sudo apt-get install openjdk-7-jdk

执行

gedit ~/.bashrc

添加jdk的环境变量,通过apt-get安装的软件一般都在/usr/lib/目录下:

# set jdk PATH
export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH

保存并退出。
3.安装各种软件包:

sudo apt-get install git gnupg flex bison gperf build-essential

sudo apt-get install zip curl libc6-dev libncurses5-dev x11proto-core-dev

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386

sudo apt-get install g++-multilib tofrodos lib32ncurses5-dev lib32ncursesw5-dev

sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo apt-get install lib32z1 dos2unix gcc g++

4.在 .bashrc文件中添加相关属性:

echo export USE_CCACE=1 >> ~/.bashrc

5.在终端cd进入到下载好并解压了的源码目录下,导入编译Android源码所需的环境变量和其它参数,运行以下命令:

source build/envsetup.sh

注意:由于我们需要烧录的是真机,所以一定要事先准备好相应机型的驱动,否则烧录之后开机会一直卡在Google logo这个界面里。驱动下载
可以看到,nexus5的5.0对应的驱动是LRX21O,我们下载好驱动之后,拷贝到源码根目录,执行

tar -zxvf 驱动.tgz

命令依次解压出.sh文件还是放到源码根目录下,运行文件就会在根目录下生成vendor文件夹,里面放着驱动(三个驱动都要下载、解压)。
运行

make clobber

清除无用的编译。

6.运行lunch命令选择编译目标

lunch

nexus5选择aosp_hammerhead-userdebug,也就是输入20并回车,如果是模拟器就选择aosp_arm-eng
7.执行make

make -j10

【执行make -j8, 8为同时编译的线程数,一般Google推荐执行源码编译的线程数 = CPU核心数x 2 + 2,比如4核,就推荐10线程编译,执行make –j10。】
关于cpu个数,可以用下面命令查看:

cat /proc/cpuinfo

如果有报错的话,直接输入make重试。
当你看到下面一堆输出时,已经编译完成了:

Creating filesystem with parameters:
    Size: 1073741824
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 4096
    Label: 
    Blocks: 262144
    Block groups: 8
    Reserved block group size: 63
Created filesystem with 1411/65536 inodes and 81288/262144 blocks
Install system fs image: out/target/product/hammerhead/system.img
out/target/product/hammerhead/system.img+out/target/product/hammerhead/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=1096212480 blocksize=135168 total=317825554 reserve=11083776

#### make completed successfully (01:18:47 (hh:mm:ss)) ####

×××××××××××××××××××××××××××××××××××
我的i7+16G内存等待一个多小时,编译成功之后我们就要把源码弄成可以在AndroidStudio下查看的项目(只是为了方便我们学习源码):
使用m、mm、mmm命令之前要在android源码目录下执行命令:

. build/envsetup.sh

1.生成IDE工具文件

mmm development/tools/idegen/

运行完将生成idegen.jar文件。

2.生成Android Studio配置文件
主要是生成android.iws, android.ipr, android.iml,这三个文件是Android Studio项目的关键文件,主要就是列出项目的模块组成,依赖关系,目录结构。

sh ./development/tools/idegen/idegen.sh

3.导入到AndroidStudio
打开Android Studio,File->Open->源码根目录android.ipr,Android会自动导入工程所有代码,漫长的indexing过程耗时30~120分钟左右,i7+16G内存也就20分钟左右,听4首歌曲的时间。

过程:index中会弹出framework的config提示,点击config, 然后确认,会继续indexing一段时间。

结束:indexing结束后,选择project视图,就看到文章开始的那张清晰的代码结构了。

注意:如果你编译的是 aosp 分支 可能会出现
Exception in thread “main” java.io.FileNotFoundException: ./out/target/product/generic/obj/GYP/shared_intermediates/res.java (Is a directory)
解决办法:这其实是一个bug,打开/development/tools/idegen/src/Configuration.java,将

if (path.endsWith(".java"))

修改为

if (path.endsWith(".java") && !file.isDirectory())

×××××××××××××××××××××××××××××××××××

好了,源码我们后面有时间再看,既然已经编译完成,我们就烧录到手机上看看呗。
1.安装adb:

apt-get install adb

2.进入fastboot模式

adb reboot bootloader

3.安装fastboot命令

apt-get install fastboot

4.指定rom位置

export ANDROID_PRODUCT_OUT=out/target/product/hammerhead

5.烧录

fastboot flashall -w

-w选项清除设备的data分区,对你第一次烧录设备非常有用,如果不是第一次的话则可选可不选。


编译过程遇到的问题:
1.unsupported reloc 43

解决办法:文件 /art/build/Android.common_build.mk,找到:

# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
  # By default, host builds use clang for better warnings.
  ART_HOST_CLANG := true
endif

改成如下:

# Host.
ART_HOST_CLANG := false
ifeq ($(WITHOUT_HOST_CLANG),false)
  # By default, host builds use clang for better warnings.
  ART_HOST_CLANG := true
endif

如果错误还存在,尝试:

cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

2.build/core/tasks/apicheck.mk:57: recipe for target ‘out/target/common/obj/PACKAGING/checkapi-current-timestamp’ failed
解决办法:

make update-api && make -j10
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值