配置ububtu22.04

安装过程参考以下文章:

VMware虚拟机安装Ubuntu详细教程_vmvare安装ubuto-CSDN博客

安装curl工具

sudo apt-get install curl

更换软件下载源

  • 命令行方式

    修改 /etc/apt/soruces.list文件

    sudo apt-get update 更新源

  • 图形化方式

    关于 -> 软件更新 -> 下载自 -> 其他站点 -> aliyun

使用命令行方式时,要先对原来的配置文件进行备份:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo rm -rf /etc/apt/sources.list

然后从清华大学镜像站获得url:

ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

然后使用nano编辑器进行编辑:

sudo nano /etc/apt/sources.list

安装源码下载

前置知识

aosp源码、对应的Linux内核、对应的手机驱动

这里的对应指的是要跟aosp系统版本对应,要与手机型号对应

源码下载

北方用清华镜像源:

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

南方用中科大镜像源:

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

下载初始化包并解压

mkdir ~/bin
cd ~/bin
wget -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar
md5sum aosp-latest.tar
tar xvf aosp-latest.tar

核心区别:是否处理压缩

命令 处理的文件类型 典型文件扩展名
tar xvf 未压缩的 tar 归档文件 .tar
tar -zxvf 经过 gzip 压缩的 tar 文件 .tar.gz, .tgz

配置git

sudo apt-get install git
git config --global user.email 24358757@qq.com
git config --global user.name "xiaojianbang"
git config --global http.sslVerify false

下载repo

echo "PATH=~/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc
sudo apt-get install curl
curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'

修改默认Python

首先查看python路径:

which python/python3

若原先有软连接,先删除:

sudo rm -rf python

创建软连接:

sudo ln -s /usr/bin/python3.8 /usr/bin/python

同步指定版本源码

cd aosp
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r17
repo sync

代号和细分版本号可查看以下链接

https://source.android.com/setup/start/build-numbers?hl=zh_cn

选个有驱动的,支持机型多的分支

谷歌手机设备驱动下载地址

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

同步之前先打个虚拟机快照

repo sync的时候有可能会遇到的问题

fatal: unable to access 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/': server certificate verification failed. CAfile: none CRLfile: none
解决方案:设置跳过SSL证书验证:
git config --global http.sslVerify false
再次repo sync
info: A new version of repo is available
repo: Updating release signing keys to keyset ver 2.3
warning: repo is not tracking a remote branch, so it will not receive updates
repo reset: error: Entry '.github/workflows/test-ci.yml' not uptodate. Cannot merge.
fatal: 不能重置索引文件至版本 'v2.16^0'。

解决方案:
cd ~/bin/aosp/.repo/repo
git pull
cd ~/bin/aosp
再次repo init 和 repo sync

安装JDK8

sudo apt-get update
sudo apt-get install openjdk-8-jdk

安装所需依赖 (Ubuntu 20.04)

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
参考以下地址
https://source.android.com/setup/build/initializing?hl=zh-cn

设备驱动的准备

谷歌手机设备驱动下载地址

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

将驱动文件放入虚拟机解压并运行

查看内核是否存在

源码下载完后最好看下里面有没有你手机对应的设备内核

如果没有,需要另外下载或者编译

https://source.android.google.cn/setup/build/building-kernels#id-version

编译源码

编译参考以下链接
https://source.android.com/setup/build/building
source build/envsetup.sh
lunch # 选择设备内核和编译版本 userdebug
# 增加编译产品选项 修改aosp/device/google/marlin/AndroidProducts.mk
make -j4 # 数字代表开启的线程数量,内存小的设备,不要给的过大

编译补充

编译报错或者修改系统文件以后,都可以直接make,已经编译的部分会跳过

make clean 会清除已经编译的,全部重来,在编译不同lunch选项时使用

AOSP源码导入到AndroidStudio

先成功编译一次,再使用以下方法导入

在源码根目录运行如下命令, 会在 out/host/linux-x86/framework 目录下生成 idegen.jar:

source build/envsetup.sh
mmm development/tools/idegen/

在源码根目录运行如下命令,会在根目录下生成 android.iml 和 android.ipr ,这两个文件是as的工程配置文件

development/tools/idegen/idegen.sh

安装并打开as,选择Open an existing Android Studio project,找到源码根目录,点击Android.ipr

具体参考:https://wuxiaolong.me/2018/08/15/AOSP3/

android studio的IDEA max heap size记得设置成4096MB

基本设置

去除WIFI叉号

packages/modules/NetworkStack/res/values/config.xml
13行 修改
<!-- HTTP URL for network validation, to use for detecting captive portals. -->
<string name="default_captive_portal_http_url" translatable="false">http://connect.rom.miui.com/generate_204</string>

<!-- HTTPS URL for network validation, to use for confirming internet connectivity. -->
<string name="default_captive_portal_https_url" translatable="false">https://connect.rom.miui.com/generate_204</string>

<!-- List of fallback URLs to use for detecting captive portals. -->
<string-array name="default_captive_portal_fallback_urls" translatable="false">
<item>http://connect.rom.miui.com/generate_204</item>
<item>http://connect.rom.miui.com/generate_204</item>
</string-array>

原链接: http://play.googleapis.com/generate_204

联网自动更新时间

frameworks/base/core/java/android/util/NtpTrustedTime.java
53行 增加
private String[] mNtpServers = { "cn.ntp.org.cn", "edu.ntp.org.cn", "ntp1.aliyun.com", "ntp2.aliyun.com", "cn.pool.ntp.org" };
128行 增加
for(String ntpServer : mNtpServers) {
if(client.requestTime(ntpServer, (int) mTimeout, network)) {
mHasCache = true;
mCachedNtpTime = client.getNtpTime();
mCachedNtpElapsedRealtime = client.getNtpTimeReference();
mCachedNtpCertainty = client.getRoundTripTime() / 2;
return true;
}
}

设置默认中文

build/tools/buildinfo.sh
注释45-47行 增加48行
echo "ro.product.locale=zh-CN"
设置默认时区 59行 增加
echo "persist.sys.timezone=Asia/Shanghai"

设置默认息屏时间

frameworks/base/packages/SettingsProvider/res/values/defaults.xml
device/google/marlin/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<bool name="def_screen_brightness_automatic_mode">true</bool> 自动亮度调节
<integer name="def_screen_off_timeout">1800000</integer> 默认息屏时间
<bool name="def_notification_pulse">false</bool> 关闭震动提醒
<bool name="def_bluetooth_on">false</bool> 关闭蓝牙
<bool name="def_install_non_market_apps">true</bool> 允许安装非市场apk
<bool name="def_stay_on_while_plugged_in">true</bool> 连接电源时不休眠
<bool name="def_dim_screen">false</bool>

进行编译测试

make update-api
source build/envsetup.sh
lunch
make -j4

编译注意事项

  • 修改java代码以后,最好先make update-api,再进行增量编译

  • 通常情况下,安卓会对修改的那部分源码进行增量编译,但有时不是很靠谱

    如果你确定改的没有问题,但是刷机以后,功能不生效,可以考虑make clean以后重新全量编译

  • 建议每次都是全量编译,不要使用make snod,打包system.img

    Pixel3 不能make snod等打包一部分镜像

    Pixel1 可以make snod等打包一部分镜像

  • 建议每次都是编译出来的镜像全刷,不要只刷其中几个

    Pixel3 刷机不能只刷一部分镜像,全刷,才能刷成功

    Pixel1 可以只刷一部分镜像

配置好ANDROID_PRODUCT_OUT环境变量后,使用:

fastboot flashall -w

超级adbd

1. 超级adbd
system/core/adb/daemon/main.cpp
75行 增加
static bool should_drop_privileges() {
return false;

217行 增加
auth_required = false;
adbd_auth_init();

2. 去除编译出来的su、strace等
build/make/target/product/base_system.mk
366行 删除
su \
strace \


adb disable-verity
verity cannot be disabled/enabled - USER build

全局搜索报错提示,找到以下文件中的相关代码注释即可
system/core/adb/daemon/set_verity_enable_state_service.cpp

//===========================================================
adb remount
E only functions on userdebug or eng builds
/system/bin/remount exited with status 1
remount failed

全局搜索报错提示,找到以下文件中的相关代码注释即可
system/core/fs_mgr/fs_mgr_remount.cpp
remount_service.cpp

selinux

1. user版本还需要设置selinux宽容模式
system/core/init/selinux.cpp
100行 增加
bool IsEnforcing() {
return false;

2. selinux有三种运作模式:
强制模式:Enforcing
宽容模式:Permissive
关闭:Disabled

3. 将selinux在Enforcing与permissive之间切换与查看
setenforce 0
getenforce //Permissive
setenforce 1
getenforce //Enforcing