首页
社区
课程
招聘
[原创]源码编译(1)——Android6.0源码编译详解
发表于: 2021-9-29 11:19 32330

[原创]源码编译(1)——Android6.0源码编译详解

2021-9-29 11:19
32330

最近在研究Xposed框架定制,恰好又看到看雪上两个大佬关于源码定制Xposed源码定制的帖子,所以尝试基于Android6.0版本,详细记录一下从源码下载到Xposed框架定制的全过程。

我们首先给虚拟机分配一个物理内存4G 然后设置虚拟内存8G,开始实验之前记得快照,考虑到源码编译可能需要很大的内存,我们提前配置好交换内存

我们可以为虚拟机设置一个比较大的磁盘空间,但是如果你的虚拟机已经分配了一个磁盘空间,可能你需要扩展你的磁盘空间,这里可以详细参考磁盘空间扩展,去扩大你的虚拟机磁盘,这里最好保证自己的磁盘空间充足。

我们到后面需要使用adb和fastboot,所以我们需要下载platform-tools资源包

然后我们解压到自己的目录

我们配置环境变量

我们可以测试一下配置:

image-20210926214750048

创建必要目录,git-repo工具保存目录,这里需要保存在bin目录下,不然后面可能出问题

由于使用Google的repo源需要挂代理,所以我们使用清华的源repo源,无需挂代码就可以很快下载Android源码了

后面是对应的repo保存路径

image-20210929092905942

image-20210929092947786

设置权限:

由于bin的环境变量已经配置过了,所以我们只需要去加入REPO_URL,来更新镜像源

配置环境变量:

配置环境变量或下载repo失败时,注意一下空格,大部分是此原因导致的

清华的镜像源官网上我们可以看见有两种方法:

我们初始化代码仓库:

我们下载初始包,我们需要下载最新的aosp-latest.tar文件以及对应的md5值,官方镜像网址

image-20210929103113870

我们可以验证文件的完整性,进行MD5校验

下载完毕后可以使用tar -zxvf aosp-latest.jar指令解压该文件,解压出来文件夹名称为aosp,里面只有一个叫.repo的隐藏文件夹,该文件夹就是仓库,安卓源代码都在里面,可以使用CTRL+H来查看该隐藏文件夹

然后我们只需要在目标文件夹下同步即可

我们进入我们的目标文件夹

然后我们初始化厂库:

image-20210929102809637

这里注意我们的每个分支应该根据我们的设备情况而选定,详细参考官网:Android源码

初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下

同步源码树:

由于我们在下载源码的过程中,时间太长可能会中途失败,所以我们需要编写不死脚本down.sh,保持运行

然后我们将down.sh启动

由于关于源码下载的过程比较缓慢,这里方便实验,就不演示下载的流程了,这里会给大家在附件提供各个版本的android系统源码,方便大家进行实验,本文所需要的实验:

我们在Android源码编译过程中,一定要注意对应Android版本的平台要求,和Android版本所需要的JDK版本,参考官方网址

image-20210926214750048

image-20210926214816258

经过网上的资料查找,考虑到Ubuntu16仓库里面的镜像已经没有OpenJDK7的版本,所以要替换镜像源:

首先进行备份一下:

进行修改:

下面是一些镜像源:

阿里源

官方配置

清华源

官方配置

ubuntu镜像

然后我们需要将apt install更新一下

然后我们需要向ubuntu的镜像里面添加openjdk7 的仓库,开始下载:

这样就可以将openjdk7下载完成,但是这里好像并不适用,所以我在这里直接给出我找到的压缩包,大家解压一些就可以了

我们将压缩包直接解压,压缩包见附件

image-20210927093209306

配置环境变量:

激活环境变量

检测jdk版本

image-20210927093720491

这样我们的jdk环境就配置完成,当然我们为了方便后续多版本切换,我们还可以设置jdk版本切换

我们需要使用update-alternatives设置序列号方便我们选择

image-20210927093720491

我们选择对于的版本序号

image-20210927094633711

然后我们再次验证版本:

image-20210927094633711

我们可以同样的配置javac,这样我们就可以完成jdk的版本切换了

下面主要介绍jdk配置引起的错误:

image-20210927094918651

原因分析:

解决办法:

切换镜像源,然后更新 apt-get update,详细可以参考上文常见方法中镜像源的设置

image-20210927094918651

原因分析:

解决办法:

1.修改安卓源码目录下的/build/envsetup.sh

image-20210927094918651

2.注释版本检测的终止语句

image-20210927094918651

保存后按照正常的编译命令进行make就可以了

image-20210927094918651

原因分析:

解决办法:

配置javac

image-20210927094918651

image-20210927094918651

原因分析:

问题解决:

配置javadoc

我们可以通过使用repo来从官方的镜像来下载Android源码,但是这样需要的时间较长,这里我们直接提供了各个版本系统源码的压缩包,大家直接导入后,进行解压即可

image-20210926204554020

我们需要下载对应设备的驱动文件,这里我们使用的是Google nexus5,我们可以去官方网址下载:

image-20210926204554020

我们可以看到这里的设备驱动型号很多,我们可以根据我们的设备型号去选择对应的设备驱动,这里我们就将这三个设备驱动下载并放入我们的源码下

image-20210926204554020

然后我们依次的运行驱动文件

按Enter键一行行的查看,经过实验,当不停的确认到了8条后e结束,需要我们输入I ACCEPT,这样就解压到了vendor 目录下,其他两个脚本同样这样执行

image-20210926204554020

三个文件解压后的目录:

image-20210926204554020

首先我们需要修改源码,修改源码文件中:art/build/Android.common_build.mk里的内容

image-20210927100604203

不然容易报错:

image-20210927100604203

原因分析:

我们在编译源码之前为了提高编译的速率:

在 .bashrc文件末尾添加:export USE_CCACHE = 1

为了提高编译效率,设置编译器高速缓存:

我们可以在开始编译之前清楚之前所有编译操作的输出,避免出现错误,首次编译不需要:

image-20210926204554020

然后使用build目录中的envsetup.sh脚本初始化环境:

image-20210926204554020

我们选择编译的具体目标,也就是指我们是将我们的源码编译到虚拟机还是具体的手机上运行,这里我们可以先看官方给的型号图

image-20210926210739483

我们输入指令:lunch

image-20210926213243118

参考官方解释:

image-20210926211110079

image-20210926212512938

我们可以理解为:

这里我们开始编译源码,执行make -j4,4为同时编译的线程数,大家可以根据自己的设备情况选择

查看cpu核心个数命令:

编译结束,经过了漫长的过程,我们总算可以看见我们编译成功

image-20210926213243118

我们进入输出的目录文件夹下:

image-20210926213243118

Android镜像结构分析详细可以见(8)

我们将手机进入bootloader模式:

手机如果没有解锁,我们需要解锁

我们将选中镜像导出,并刷入手机,编写刷机脚本,windows上文件后缀.bat,linux上文件后缀.sh

然后我们启动刷机脚本,就可以看见手机正常的刷入

image-20210926213243118

image-20210926213243118

刷机包目录:

image-20210927105814789

主要镜像:

image-20210927104439801

详细参考博客:android 主要镜像(image)解析

image-20210927104439801

类似错误:make:Nothing to be done for 'all_modules' 或 make:*No rule to make target Android.mk Stop等

解决办法:

image-20210927104439801

问题分析:

我们使用命令:

make clobber的功能是把上一次make命令生成的文件或目录清除掉,效果比make clean更严格

本文详细记录了从Android6.0源码下载到Android源码编译的详细过程,其中参考了看雪上面的两位大佬帖子和网络上的一些博客,中间遇到了很多问题,并逐一解决,这里将所有的错误情况总结并放在了错误区,大家可以详细的对照,通过源码编译的过程,对Android系统的理解更加的深入了,接下来便开始进行Xposed源码的编译和定制,本文有什么问题就请大佬们指正了。

这里给大家提供android版本的源码和OpenJDK7的下载包,大家也可以去github上免费下载,后续都会上传到github上:github网址

JDK环境配置:

Android源码下载:

Android源码编译:

实验平台: Ubuntu 16.0.4
运行内存: (物理内存4G+交换内存8G)
磁盘空间: 300G
1)在Home目录创建一个大小为8G的swap文件
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=8k 
注:从 /dev/zero 文件读出内容并存到/swapfile文件中,块大小为1MByte,总共 16K 个块,也就是总共 8GB
2)格式化新增的swap文件:
$ sudo mkswap /swapfile
3)启动新增的swap文件
$ sudo swapon /swapfile
4)通过free命令就可以看到,swap分区增大了8G
$ free
5)关闭新增的swap文件
$ sudo swapoff /swapfile
 再次通过free命令就可以看到,swap分区减小了8G
6)开机后自动启动新增的swap文件,在/etc/fstab中新增如下命令
$ vim /etc/fstab
/swapfile       none    swap    sw      0       3
1)在Home目录创建一个大小为8G的swap文件
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=8k 
注:从 /dev/zero 文件读出内容并存到/swapfile文件中,块大小为1MByte,总共 16K 个块,也就是总共 8GB
2)格式化新增的swap文件:
$ sudo mkswap /swapfile
3)启动新增的swap文件
$ sudo swapon /swapfile
4)通过free命令就可以看到,swap分区增大了8G
$ free
5)关闭新增的swap文件
$ sudo swapoff /swapfile
 再次通过free命令就可以看到,swap分区减小了8G
6)开机后自动启动新增的swap文件,在/etc/fstab中新增如下命令
$ vim /etc/fstab
/swapfile       none    swap    sw      0       3
 
mkdir -p /home/user/Android
unzip platform-tools_r30.0.5-linux.zip  -/home/user/Android
mkdir -p /home/user/Android
unzip platform-tools_r30.0.5-linux.zip  -/home/user/Android
vim  ~/.bashrc
添加:
#add Android Sdk  platform tools to path
#add START
export ADB_PATH=/home/tom/Android/platform-tools
export PATH=$PATH:$ADB_PATH
#add END
激活环境:
source ~/.bashrc
vim  ~/.bashrc
添加:
#add Android Sdk  platform tools to path
#add START
export ADB_PATH=/home/tom/Android/platform-tools
export PATH=$PATH:$ADB_PATH
#add END
激活环境:
source ~/.bashrc
 
mkdir /home/tom/bin ##没有就创建
mkdir /home/tom/bin ##没有就创建
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o /home/tom/bin/repo
cp repo ~/bin/
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o /home/tom/bin/repo
cp repo ~/bin/
 
 
 
chmod +x /home/tom/bin/repo
chmod +x /home/tom/bin/repo
 
vim  ~/.bashrc
##在bashrc中添加
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
##激活环境变量
source  ~/.bashrc
vim  ~/.bashrc
##在bashrc中添加
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
##激活环境变量
source  ~/.bashrc
cd /home/tom/SourceCode/
cd /home/tom/SourceCode/
 
 
md5sum aosp-latest.tar
md5sum aosp-latest.tar
tar -zxvf aosp-latest.jar
tar -zxvf aosp-latest.jar
repo sync
repo sync
cd SourceCode/Android6
cd SourceCode/Android6
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r20
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r20
 
 
 
repo sync
repo sync
#!/bin/bash
echo  "==========start repo sync==="
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r20
repo sync -j4 -d --force-sync --no-clone-bundle
while [ $? = 1 ]; do 
        echo “======sync failed, re-sync again======” 
        sleep 3 
        repo sync -j4 -d --force-sync --no-clone-bundle
done
#!/bin/bash
echo  "==========start repo sync==="
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r20
repo sync -j4 -d --force-sync --no-clone-bundle
while [ $? = 1 ]; do 
        echo “======sync failed, re-sync again======” 
        sleep 3 
        repo sync -j4 -d --force-sync --no-clone-bundle
done
chmod a+x down.sh
./down.sh
chmod a+x down.sh
./down.sh
实验平台: Ubuntu 16.0.4 (运行内存4GB+CPU 4+磁盘300G)
Android源码: android-6.0.1_r1
实验手机 Google nexus5
 
 
 
sudo  cp   /etc/apt/sources.list   /etc/apt/sources.list.bak
sudo  cp   /etc/apt/sources.list   /etc/apt/sources.list.bak
sudo gedit /etc/apt/sources.list
sudo gedit /etc/apt/sources.list
 
 
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
 
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
 
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
 
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
 
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
 
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
 
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
 
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
 
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
 
# 预发布软件源,不建议启用

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-9-29 13:57 被随风而行aa编辑 ,原因:
收藏
免费 12
支持
分享
最新回复 (5)
雪    币: 5782
活跃值: (3854)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请问 如何下载国内手机的驱动编译安装
2021-10-9 14:12
0
雪    币: 7201
活跃值: (21965)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
3
vigiles 请问 如何下载国内手机的驱动编译安装
一般你下载的源码中也会包含驱动文件,每个厂家目录不同,一些一般在官网和厂家论坛里可以找到,还有比如lineageos 可以去对应的官网,里面不同产品有对应的驱动,可以查看代号 https://wiki.lineageos.org/devices/等等
2021-10-9 14:36
1
雪    币: 5782
活跃值: (3854)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
随风而行aa 一般你下载的源码中也会包含驱动文件,每个厂家目录不同,一些一般在官网和厂家论坛里可以找到,还有比如lineageos 可以去对应的官网,里面不同产品有对应的驱动,可以查看代号 https://wiki ...
谢谢
2021-10-10 15:15
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我准备看编译xp来着
2021-10-10 17:38
0
雪    币: 7201
活跃值: (21965)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
6
万里星河 我准备看编译xp来着
可以参考下一个帖子哦
2021-10-11 09:32
0
游客
登录 | 注册 方可回帖
返回
//