Android源码环境搭建

虚拟机配置

这里选择的虚拟机是Kali

https://www.kali.org/get-kali/#kali-virtual-machines

基本配置

cpu这里给4核2线程,内存一般给12G(这里咱们内存大,直接给20G,也就是20480M).少于12G会报out of memory错误.

磁盘空间这里给450G

虚拟机扩展磁盘空间

以root用户登录

Kali Linux虚拟机官方提供了一个默认账号:kali/kali,但是并没有提供root账号.

可以先用kali/kali进入虚拟机,执行以下命令设置root账号密码.

1
sudo passwd root

进行重置root密码,重置密码需要输入两次.

重启虚拟机,用root账号登录.

设置时区

1
dpkg-reconfigure tzdata

在弹出窗口选择 Asia->shanghai

字体安装

  1. 在/usr/share/fonts目录下,创建一个文件夹my_fonts
  2. 将ttf格式字体复制到/usr/share/fonts/my_fonts目录下

切换shell为bash

1
2
3
//这里我们要切换到bash,目前Kali默认是zsh
//切换bash 
chsh -s /bin/bash

重启后生效.

关闭息屏和休眠

关闭息屏和休眠1

关闭息屏和休眠2

关闭息屏和休眠3

安装小工具

1
2
apt update
apt install htop jnettop tree

新建分区

使用gparted这个软件,在unallocated部分右击,选择"New",按照默认即可,即可新建一个370G的分区.

点击选择Apply,应用到磁盘.然后将这个新建的磁盘给mount到某个文件夹:

1
2
3
4
5
cd Desktop
mkdir COMPILE
    
//fdisk -l 查看磁盘信息
mount /dev/sda3 COMPILE

源码下载

谷歌官方提供了Android每个版本的原生源码,其官网为:

https://android.googlesource.com/

由于谷歌官方的源码服务器搭建在国外,国内用户访问很卡顿,幸运的是国内有清华源和中科大源,存储着与谷歌官方提供一致的Android源码供国内开发者使用,其链接分别如下:

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

http://mirrors.ustc.edu.cn/aosp/

接下来以中科大源为例进行Android源码的下载.

下载Repo

Repo是Android官方推出的另一个版本管理工具,封装了一系列的Git命令.要想下载Android源码,必须先下载Repo工具.

1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

配置Git

1
2
git config --global user.name "Your name"
git config --global user.email "[email protected]"

同步源码

这里我们以获取特定版本的Android源码为例,可通过如下网址查Android版本.

https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

1
2
3
4
5
6
7
8
//先达到指定目录,然后开始同步Android源码.
cd /root/Desktop/COMPILE
mkdir aosp810_r1
cd aosp810_r1/
    
//下载指定版本的Android源码,这里下载android-8.1.0_r1
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.1.0_r1
repo sync

如果提示无法连接到gerrit.googlesource.com,将如下内容复制到你的~/.bashrc里.

1
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

下载驱动包

  1. 在下述网址搜索上述下载的Android版本(android-8.1.0_r1),找到build ID.

https://source.android.com/setup/start/build-numbers

驱动包1

android-8.1.0_r1对应的build IDOPM1.171019.011

  1. 在下述网址先定位到要刷入的手机型号(这里我目前使用的手机为Pixel sailfish),然后搜索上述build ID,定位驱动下载链接.

https://developers.google.com/android/drivers

驱动包2

1
2
3
//上述两个链接都要下载
https://dl.google.com/dl/android/aosp/google_devices-sailfish-opm1.171019.011-f3bafc8b.tgz
https://dl.google.com/dl/android/aosp/qcom-sailfish-opm1.171019.011-247af472.tgz
  1. 下载驱动包到Android源码所在目录.

驱动包3

  1. 解压.
1
2
tar zxvf google_devices-sailfish-opm1.171019.011-f3bafc8b.tgz
tar zxvf qcom-sailfish-opm1.171019.011-247af472.tgz

准备编译环境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
apt update
apt install bison tree
dpkg --add-architecture i386
apt update
apt install libc6:i386 libncurses5:i386 libstdc++6:i386 libxml2-utils

//安装OpenJdk8
wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
//解压
tar zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz 
//编写~/.bashrc,添加环境变量
export JAVA_HOME=/root/Desktop/java-se-8u41-ri
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

//配置python2环境
//这里使用pyenv来安装python2的版本
//①配置pyenv构建环境
sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
//②下载pyenv
proxychains git clone https://github.com/yyuu/pyenv.git ~/.pyenv
//③配置pyenv环境变量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >>~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >>~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\nfi'>>~/.bashrc
source ~/.bashrc
//④这里安装python2.7.16
PYTHON_CONFIGURE_OPTS="--disable-ipv6"  proxychains pyenv install 2.7.16
//⑤配置全局python版本
pyenv global 2.7.16

至此环境已经准备好了,到这里我们关机打个快照.

源码编译

  1. 挂载磁盘.
1
2
//重新开机后需要先挂载磁盘.
mount /dev/sda3 COMPILE
  1. 新建10G的交换分区.
1
2
3
4
5
dd if=/dev/zero of=swapfile bs=1M count=10240
//mkswap创建交换文件
mkswap swapfile
//swapon激活
sudo swapon swapfile
  1. 在Android源码目录执行下述命令.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//下述两个文件,就是上面驱动包解压出来的
//执行后,要按一直按着Enter键,直到出现需要用户输入"I ACCEPT"选项,输入I ACCEPT
//如果一直按着Enter键,到了末尾也没见提示用户输入,就先按Ctrl+C然后按Ctrl+D,就可以看到提示用户输入了.
./extract-google_devices-sailfish.sh
./extract-qcom-sailfish.sh

//编译安卓源码前执行以下命令
export LC_ALL=C

//导入环境变量
source build/envsetup.sh

//选择设备
lunch
//这里我目前使用的手机为Pixel sailfish
//选择的是 24 aosp_sailfish-userdebug
24

//编译
m -j4

源码编译成功

这里需要提一点的就是与lunch命令相关的构建类型,根据下述Android官网内容显示,在编译的时候可以选择的类型分为useruserdebug以及eng.其中user类型编译出来的镜像是无Root权限的.

https://source.android.com/setup/build/building#choose-a-target

构建类型

然而在我们执行"lunch"命令之后,似乎没有发现user类型,那我们是否无法编译出一个无Root权限的镜像?

lunch命令

经过实践可知,如果在选择编译目标时将带有userdebug文字中的debug字段去掉,就可以编译出不带Root权限的镜像.

1
2
3
//只需将上述编译流程中的lunch替换为下述语句即可.
//下述语句对应的是24,lunch aosp_sailfish-userdebug,这里只是将debug字段去掉.
lunch aosp_sailfish-user

自编译系统刷机

方式一

  1. 手机进bootloader模式.
1
adb reboot bootloader
  1. 执行下述命令,进行刷机.
1
2
//首先执行完 source build/envsetup.sh
fastboot -w flashall

方式二

上述编译出来的系统镜像默认放在源码根目录的"out/target/product/设备代号/“目录下(这里的设备代号即为Pixel对应的sailfish代号)

编译出来的镜像

如果想要将编译出来的镜像刷入设备,还需要从Android镜像官网下载与我们上述源码编译下载的版本一致的镜像.

Android镜像官网如下:

https://developers.google.com/android/images

上面我们源码下载的镜像为android-8.1.0_r1对应的build ID为OPM1.171019.011,编译出的镜像适配Google Pixel代号为sailfish的设备.故我们要在上述Android镜像官网中找到Pixel sailfish对应的版本代号为OPM1.171019.011的镜像下载地址.

sailfish原生镜像地址

对应的链接地址如下:

https://dl.google.com/dl/android/aosp/sailfish-opm1.171019.011-factory-56d15350.zip

接下来就是下载上述镜像,然后解压,用我们编译出来的img镜像文件进行替换,最后执行flash-all.sh脚本进行刷机.

1
2
adb reboot bootloader
./flash-all.sh

进行镜像替换

Android刷机版本

至此,一个自定义的Android系统就成功编译并刷机成功了.

将源码导入AS工具中

将Android源码导入Android Studio工具中,可以利用AS的智能提示,帮助我们在源码修改中避免一些拼写以及语法上的错误.

下载AS

  1. 下载AndroidStudio.

https://developer.android.google.cn/studio

  1. 解压并运行.

切换到android-studio/bin目录下,运行当前目录的studio.sh即可启动AndroidStudio.

  1. 创建程序桌面图标.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//创建桌面图标
gedit /usr/share/applications/android-studio.desktop

//添加以下内容
[Desktop Entry]
Name=AndroidStudio
Encoding=UTF-8
Exec=sh -c "/root/softWares/android-studio/bin/studio.sh"
Icon=/root/softWares/android-studio/bin/studio.png
StartupNotify=false
Terminal=false
Type=Application

执行完上述操作后,即可在菜单中找到AndroidStudio的桌面程序图标,右键可以添加到桌面.

源码导入

接下来的命令均是在Android源码目录中执行.

  1. 执行下述命令,生成idegen.jar文件.
1
2
source build/envsetup.sh
mmm development/tools/idegen/
  1. 执行下述命令,在源码根目录生成android.iml和android.ipr文件.
1
development/tools/idegen/idegen.sh

android.iml:包含源码导入AS时会被导入和排除的子目录文件夹.

android.ipr:包含源码工程的具体配置、代码以及依赖的lib等信息.

  1. 用AS打开上述android.ipr文件,等待一会就可以看到导入成功的Android源码.

源码导入AS中


相关内容

0%