├── .gitignore ├── README.md └── screenshots └── ss001.png /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 编译Android源码 2 | 3 | ## 配套视频教程地址 4 | 5 | [https://yunp.top/p/v/2](https://yunp.top/p/v/2) 6 | 7 | ## 说明 8 | 本教程演示如何编译 Android 源码,目的是教会你如何基于aosp(Android open source project)定制Android系统。教程演示所使用的手机是Nexus6,但本教程是通用教程,并不局限于Nexus6,只要你有合适的驱动包,你就可以面向任意机型做定制。 9 | 10 | ## 推荐学习机型 11 | 12 | * Nexus 5X 13 | * Nexus 6 14 | * Nexus 6P 15 | * Nexus 9 16 | * Nexus Player 17 | * Pixel 18 | * Pixel C 19 | * Pixel XL 20 | 21 | ## 基本硬件要求 22 | 名称 | 需求 23 | --- | --- 24 | 电脑CPU | 双核4线程2GHz或者更高配置的CPU 25 | 电脑内存 | 16G物理内存 26 | 电脑磁盘 | 至少200G可用的磁盘空间,固态硬盘更好 27 | 电脑操作系统 | Ubuntu 16.04 28 | Android手机 | Google Nexus 6 29 | 30 | ## 准备Ubuntu环境 31 | 32 | 1. 全新安装Ubuntu 16.04 操作系统(安装到虚拟机也可以,至少为虚拟机分配16G内存,否则容易出错,这可能要求你的宿主计算机具有24G以上的物理内存) 33 | 2. 执行如下命令进行更新 34 | ``` 35 | sudo apt-get update 36 | ``` 37 | 3. 执行如下命令安装jdk8 38 | ``` 39 | sudo apt-get install openjdk-8-jdk 40 | ``` 41 | 4. 执行如下命令安装依赖项 42 | ``` 43 | sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip 44 | ``` 45 | 5. 如果想使用SELinux tool 则还应该安装 python-networkx ,通过执行如下命令进行安装 46 | ``` 47 | sudo apt-get install python-networkx 48 | ``` 49 | 6. 如果使用LDAP,则还应该安装 libnss-sss:i386 ,通过如下命令进行安装 50 | ``` 51 | sudo apt-get install libnss-sss:i386 52 | ``` 53 | 7. Ubuntu默认不允许普通用户使用USB,所以还应该配置Android USB设备能够被当前用户访问到,则需要执行如下命令 54 | ``` 55 | wget -S -O - http://source.android.com/source/51-android.rules | sed "s//$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules 56 | ``` 57 | **注意:执行该命令需要翻墙** 58 | 59 | 国内用户可执行如下命令 60 | ```shell 61 | wget -S -O - http://yunpstatic.oss-cn-beijing.aliyuncs.com/res/android/source/51-android.txt | sed "s//$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules 62 | ``` 63 | 64 | ## 安装并配置代码管理工具 repo 65 | 66 | 1. 在当前用户目录下创建 bin 目录,可通过如下命令创建 67 | ``` 68 | mkdir ~/bin 69 | ``` 70 | 2. 通过如下命令下载 repo ,并将其放在 ~/bin 目录中 71 | ``` 72 | curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 73 | ``` 74 | **注意:执行该命令需要翻墙** 75 | 76 | 国内用户可以使用这条命令来执行 77 | ```shell 78 | curl http://yunpstatic.oss-cn-beijing.aliyuncs.com/res/android/source/repo > ~/bin/repo 79 | ``` 80 | 3. 通过如下命令给repo添加可执行权限 81 | ``` 82 | chmod a+x ~/bin/repo 83 | ``` 84 | 4. 通过如下命令初始化git用户名 85 | ``` 86 | git config --global user.name "Your Name" 87 | ``` 88 | 5. 通过如下命令初始化git邮箱 89 | ``` 90 | git config --global user.email "you@example.com" 91 | ``` 92 | 93 | ## 下载Android源代码 94 | 95 | 1. 创建一个目录用于存放Android源码,如我存放的路径是 /Work/AndroidSource/Nexus6/source ,并使用终端进入该目录 96 | 1. 通过如下代码初始化 Nexus 6 源码仓库 97 | ``` 98 | repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r28 99 | ``` 100 | 其中 -b 参数指明将下载的代码分支 101 | 如果要下载master分支,则不需要加任何参数,则执行的命令如下 102 | ``` 103 | repo init -u https://android.googlesource.com/platform/manifest 104 | ``` 105 | 您也可以根据自己的需要来选择合适的分支进行下载,分支与匹配机型参考表网址是 106 | http://source.android.com/source/build-numbers.html#source-code-tags-and-builds 107 | **注意:访问该网址需要翻墙** 108 | 2. 执行如下命令下载(同步)代码 109 | ``` 110 | repo sync 111 | ``` 112 | 目前默认使用4个任务同步代码,如果你的机器足够好,可以指定更多的任务,如下命令演示使用8个任务同步代码 113 | ``` 114 | repo sync -j8 115 | ``` 116 | **说明:同步代码可能需要很长时间,你需要一个较好的网络环境和一个较稳定的翻墙工具,按平均状况来看大约需要2天时间,视频教程里有介绍如何使用我已经下载好的用百度云共享的代码,好的网络环境和好的电脑配置可在2小时内完成该任务** 117 | 118 | ## 配置厂商提供的驱动 119 | 120 | 1. 访问页面 https://developers.google.com/android/drivers 查找配置自己机型的驱动(我这里查找的是Nexus 6的驱动) 121 | **注意:访问该页面需要翻墙** 122 | 2. 下载 Nexus6 驱动包,如下图所示这三项均需下载 123 | ![驱动包截图](screenshots/ss001.png) 124 | 3. 驱动包文件都是压缩包,在压缩包中包括一个sh文件,该sh文件为自解压脚本,分别将这3个sh文件放在Android源码树的根目录,比如/Work/AndroidSource/Nexus6/source,并执行依次执行这3个文件以自动配置驱动包,配置完成后将在源码树根目录中多出一个vendor目录。 125 | **注意:在执行3个sh文件时会呈现协议条款,请慢慢看,不要跳过I ACCEPT那一步,否则不解压** 126 | 127 | ## 编译Android源码 128 | 129 | 1. 执行如下命令进行清理 130 | ``` 131 | make clobber 132 | ``` 133 | 2. 执行如下命令加载环境变量 134 | ``` 135 | source build/envsetup.sh 136 | ``` 137 | 3. 执行如下命令选择构建目标 138 | ``` 139 | lunch aosp_shamu-userdebug 140 | ``` 141 | 如果想选择其它目标,请直接执行 `lunch` ,将会呈现一个目标列表,可根据自己的手机型号进行选择,如果只想运行在模式器中,可以选择第一项或者直接执行 `lunch aosp_arm-eng` 。 142 | 4. 执行如下命令进行编译 143 | ``` 144 | make -j4 145 | ``` 146 | 该命令使用4个任务进行编译,如果电脑不够好,编译过程可能会持续10小时或更久,如果电脑足够好,也可以指定更多任务,如 `make -j32` 是指定32个任务进行编译。 147 | 148 | ## 编译必备的工具 149 | 150 | 说明:如果你已经安装Android sdk,也可以使用sdk内置的命令。 151 | 152 | 1. 执行如下命令编译 adb 153 | ``` 154 | make adb 155 | ``` 156 | 2. 执行如下命令编译 fastboot 157 | ``` 158 | make fastboot 159 | ``` 160 | 161 | ## 运行 162 | 163 | 1. 进入手机 `设置 -> 开发者选项` (如果没有该选项,请进入 `设置 -> 关于手机`,连续点击 `Build number` 7次以启用开发者模式),启用USB调试和OEM解锁 164 | 2. 将手机通过USB连接电脑,执行命令 `adb reboot bootloader` 以进入手机的Bootloader模式,也可以通过手机硬键操作进入Bootloader模式,查看不同手机操作方式列表请访问 http://source.android.com/source/running.html (**注意:访问该网址需要翻墙**)。 165 | 3. 解锁Bootloader,执行命令 `fastboot flashing unlock` ,2014年或更老的手机请执行 `fastboot oem unlock` ,你必须通过手机屏幕确认该操作。 166 | 4. 执行如下命令格式化缓存 167 | ``` 168 | fastboot format cache 169 | ``` 170 | 5. 执行如下命令格式化用户数据 171 | ``` 172 | fastboot format userdata 173 | ``` 174 | 6. 执行如下命令将系统写入手机 175 | ``` 176 | fastboot flashall -w 177 | ``` 178 | 写入成功后手机将重启进入您编译的操作系统 179 | 7. 如果您想长期安全的使用该手机,可以通过命令 `fastboot flashing lock` 锁定Bootloader,2014年或更老的手机请执行 `fastboot oem lock` ,之后进入手机系统,在开发者选项中取消OEM解锁。 180 | 181 | ## 附 182 | 183 | * [Android源码打包下载地址](https://pan.baidu.com/s/1kUAj9kF) 184 | -------------------------------------------------------------------------------- /screenshots/ss001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yunptop/CompileAndroidSource/274fdfd03e3080bb83d046c822304895901a4689/screenshots/ss001.png --------------------------------------------------------------------------------