虚拟机配置
这里选择的虚拟机是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账号密码.
进行重置root密码,重置密码需要输入两次.
重启虚拟机,用root账号登录.
设置时区
1
|
dpkg-reconfigure tzdata
|
在弹出窗口选择 Asia->shanghai
字体安装
- 在/usr/share/fonts目录下,创建一个文件夹my_fonts
- 将ttf格式字体复制到/usr/share/fonts/my_fonts目录下
切换shell为bash
1
2
3
|
//这里我们要切换到bash,目前Kali默认是zsh
//切换bash
chsh -s /bin/bash
|
重启后生效.
关闭息屏和休眠
安装小工具
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'
|
下载驱动包
- 在下述网址搜索上述下载的Android版本(android-8.1.0_r1),找到build ID.
https://source.android.com/setup/start/build-numbers
android-8.1.0_r1对应的build ID为OPM1.171019.011
- 在下述网址先定位到要刷入的手机型号(这里我目前使用的手机为Pixel sailfish),然后搜索上述build ID,定位驱动下载链接.
https://developers.google.com/android/drivers
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
|
- 下载驱动包到Android源码所在目录.
- 解压.
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
2
|
//重新开机后需要先挂载磁盘.
mount /dev/sda3 COMPILE
|
- 新建10G的交换分区.
1
2
3
4
5
|
dd if=/dev/zero of=swapfile bs=1M count=10240
//mkswap创建交换文件
mkswap swapfile
//swapon激活
sudo swapon swapfile
|
- 在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官网内容显示,在编译的时候可以选择的类型分为user、userdebug以及eng.其中user类型编译出来的镜像是无Root权限的.
https://source.android.com/setup/build/building#choose-a-target
然而在我们执行"lunch"命令之后,似乎没有发现user类型,那我们是否无法编译出一个无Root权限的镜像?
经过实践可知,如果在选择编译目标时将带有userdebug文字中的debug字段去掉,就可以编译出不带Root权限的镜像.
1
2
3
|
//只需将上述编译流程中的lunch替换为下述语句即可.
//下述语句对应的是24,lunch aosp_sailfish-userdebug,这里只是将debug字段去掉.
lunch aosp_sailfish-user
|
自编译系统刷机
方式一
- 手机进bootloader模式.
- 执行下述命令,进行刷机.
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的镜像下载地址.
对应的链接地址如下:
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系统就成功编译并刷机成功了.
将源码导入AS工具中
将Android源码导入Android Studio工具中,可以利用AS的智能提示,帮助我们在源码修改中避免一些拼写以及语法上的错误.
下载AS
- 下载AndroidStudio.
https://developer.android.google.cn/studio
- 解压并运行.
切换到android-studio/bin目录下,运行当前目录的studio.sh即可启动AndroidStudio.
- 创建程序桌面图标.
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源码目录中执行.
- 执行下述命令,生成idegen.jar文件.
1
2
|
source build/envsetup.sh
mmm development/tools/idegen/
|
- 执行下述命令,在源码根目录生成android.iml和android.ipr文件.
1
|
development/tools/idegen/idegen.sh
|
android.iml:包含源码导入AS时会被导入和排除的子目录文件夹.
android.ipr:包含源码工程的具体配置、代码以及依赖的lib等信息.
- 用AS打开上述android.ipr文件,等待一会就可以看到导入成功的Android源码.