搭建本地AOSP Gerrit Server完全指南 (三)

在这里插入图片描述

概述

本文引导如何从现有的AOSP Branch建立另一个Branch以进行AOSP的客制化,以便将企业及自身的技术知识管理及保留。

本系列介绍如何建立本地自有(Local) Gerrit Server并且将AOSP (Android Open Source Project)的原始码完整导入此Gerrit Server。

若你已完成了

我们就会有了一台Gerrit Server主机,执行gerrit service,并且已经拥有完整AOSP主干(master branch)的所有Projects在Gerrit Server中可供管理。

接下来我会以一个实例来进行建立自有AOSP Branch的工作,本文以Emulator验证自行建立的Branch,并且进行原始码的修改及执行。在之后的文章中,我会再用Pixel2来验证自行建立的Branch再Build出的Image是可以烧录。

主文的主要目的是指引你如何进行Android AOSP分枝建立及利用git push/repo upload来进行Code Review/Submit。这些工作在本文中都以Emulator来完成。所以在AOSP的世界,即使你没有Pixel系统的实机(或Android One),还是可以好好享受探索Android OS!

建立Android P Branch

同步Android P官方原始码

如同PART2的状态,我们的Gerrit Server保有的是AOSP Master branch,那么,我们第一步就是从官网抓回Android P (撰写本文时,master branch是Android P的预览版本)。但不是要整个重新抓回来,那太耗时也耗资源。我们同样在Gerrit Client的目录下工作,把不足的部份补回来就行了。

首先先要了解自己要抓回的版本是什么。例如本文是想要在Pixel2上修改,所以我就要抓回Pixel2最新稳定版本。在官方上,例出的重要Branch/Tag

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

在本文发表时,Pixel2最新的Branch为android-9.0.0_r32。所以,决定了,就是你!我们以这个版本做为基底Baseline,再由它来做出Branch。
首先进入AOSP Mirror目录中,在PART2,该目录位于Gerrit Client主机的aosp_mirror目录下。
在aosp_mirror目录下,进行branch切换

repo init -b android-9.0.0_r32
repo sync -j8

这样就能把一些在Master branch (Android Q)已经由Google官方从master branch移除掉,但仍包含在Android P (android-9.0.0_r32)的Projects抓回来本地的Mirror。
接下来把缺失的Projects一次汇入:

repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 larson@192.168.100.56 gerrit create-project --owner android-admin $REPO_PROJECT' #若有新的Project,就建立它,已經存在的Projects會回應Fatal error,這是正常的,無視
repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 larson@192.168.100.56 gerrit set-project-parent --parent AOSP $REPO_PROJECT' #若有新的Project,將Parent設為AOSP
repo forall -c 'echo $REPO_PROJECT; git push ssh://larson@192.168.100.56:29418/$REPO_PROJECT +refs/heads/*' #匯入所有新增的Code,先匯入branch
repo forall -c 'echo $REPO_PROJECT; git push ssh://larson@192.168.100.56:29418/$REPO_PROJECT +refs/heads/* +refs/tags/*' #再匯入所有tags,完成同步

这和同步汇入的命令是一样的,建立Project,设定Parent Project,汇入Branch,汇入Tags。

接下来就是把原始码从Gerrit Server抓出一份android-9.0.0_r32
重新从Gerrit Server抓取,例如我们把它放在myaosp这个目录:

mkdir myaosp
cd myaosp
repo init -u ssh://larson@192.168.100.56:29418/platform/manifest
repo sync
source ./build/envsetup.sh
lunch aosp_x86_64-eng #官方Build出X86 Emulator的方法
make -j16 #開始執行Build

或是,如果之前在PART2已经抓过整份Codebase并Build出X86 Emulator,只要重新切换至android-9.0.0_r32,这当然省时很多

repo init -b android-9.0.0_r32 #切換branch
repo sync #取得新的projects, 同時刪掉不需要的projects.
bash #重新進入一個shell以清除Environment Variables
source ./build/envsetup.sh
lunch aosp_x86_64-eng #官方Build出X86 Emulator的方法
make -j16 #開始執行Build

以上无论是重新取得一份Codebase或切换Branch的方式,最后Build出Emulator后,在shell下执行emulator (如果遇到CPU acceleration status: This user doesn’t have permissions to use KVM (/dev/kvm),请执行 sudo chown echo $USER -R /dev/kvm,请/dev/kvm的权限设定好,再执行次emulator的命令即可)

在这里插入图片描述

可以看见以上的Emulator的Android Version为9 (就是Android P),而Build number也显示username,所以能确认是自行Build出来的版本。

有了一个稳定可执行的版本,接下来就要进行自建Branch的动作。
(当然,你可以先建立新的Branch再抓取出来验证,这样比较省时,我的习惯是先确定原本的Baseline是好的,再建立新的Branch,这样的步骤有助于万一出现问题比较容易侦错)。

建立Branch

要建立Branch首先进入AOSP Mirror目录中,在PART2,该目录位于Gerrit Client主机的aosp_mirror目录下。
首先进入aosp_mirror,建立自己的Branch。

repo forall -c 'echo $REPO_PROJECT; ssh -p 29418 larson@192.168.100.56 gerrit create-branch $REPO_PROJECT my_android-9 android-9.0.0_r32'

此命令是要求所有在AOSP的Projects (当前的Manifest)基于android-9.0.0_r32这个Branch重新在Gerrit Server上再建立另一个Branch,my_android-9。建立Branch在Git而言原本就是非常快速的事,所以重建Branch应该很快就执行完毕。
完成后你可以在Gerrit Web UI上的BROWSE->Repositories中,任选一个Projects,例如platform/manifest,点选左侧的Branches,搜寻my,就可以看到你新建的my_android-9这个Branch。

修改manifest.xml,首次Code Review

接下来就要进行第一次的Code Review及Commit。
首先要理解manifest.xml。在AOSP Codebase,myaosp/.repo目录下有个档案manifest.xml。这是repo command最重要的依据。里面记载这个Codebase包含的所有Projects,抓取后要放置的目录,以及同步原始码的Review Server。我们的Codebase基于Android官方释出的Codebase,所以同步原始码的Review Server是指向Google官网,这也是我们主要要修改的部份。

编辑.repo/manifest.xml

<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote  name="aosp"
           fetch=".."
           review="https://android-review.googlesource.com/" />
  <default revision="refs/tags/android-9.0.0_r32"
           remote="aosp"
           sync-j="4" />

Highlight的部份,第6及第7行,是我们要修改的部份。第6行是review URL必须改至我们自建的Gerrit Server,而第7行是从Gerrit Server取出的Branch name。修改后的结果。

<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote  name="aosp"
           fetch=".."
           review="http://192.168.100.56:8080/" />
  <default revision="refs/heads/my_android-9"
           remote="aosp"
           sync-j="4" />

转换目录至.repo/manifests,输入git status .,可以看到你修改的diff

diff --git a/default.xml b/default.xml
index 5a85017..33bca8a 100644
--- a/default.xml
+++ b/default.xml
@@ -3,8 +3,8 @@
 
   <remote  name="aosp"
            fetch=".."
-           review="https://android-review.googlesource.com/" />
-  <default revision="refs/tags/android-9.0.0_r32"
+           review="http://192.168.100.56:8080/" />
+  <default revision="refs/heads/my_android-9"
            remote="aosp"
            sync-j="4" />

然后利用git push推上你的patch,进行第一次Code Review。

git add .
git commit -m "My android 9.0 (P)  branch"
git push ssh://larson@192.168.100.56:29418/platform/manifest HEAD:refs/for/my_android-9
Counting objects: 1, done.
Writing objects: 100% (1/1), 237 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, new: 1, done    
remote: 
remote: SUCCESS
remote: 
remote: New Changes:
remote:   http://192.168.100.56:8080/c/platform/manifest/+/1 My android 9.0 (P)  branch
To ssh://larson@192.168.100.56:29418/platform/manifest
 * [new branch]      HEAD -> refs/for/my_android-9

成功之后,回到Gerrit Web UI,点选CHANGES->Open,可以看到第一个Code Review出现:

在这里插入图片描述

图中的Subject是我们刚才使用git commit -m的讯息,Owner/Branch都符合我们想要的结果。
点击进入之后,可以检视修改的部份(这也是Review最重要的部份),如果都没有问题,点击右上角的「CODE-REVIEW+2」,再点击「SUMMIT」实际上将Code上传。完成第一次Code Review及Commit。
如此,我们就完成了自建一个AOSP Branch/Codebase的动作。如果你是个个性谨慎IT人员,那就会把它重新抓取一次以确认整个Codebase的完整性:

mkdir my_android-9
cd my_android-9
repo init -u ssh://larson@192.168.100.56:29418/platform/manifest -b my_android-9
repo sync
source ./build/envsetup.sh
lunch aosp_x86_64-eng #官方Build出X86 Emulator的方法
make -j16 #開始執行Build

重点在第3行,在取出manifest时,加入参数-b my_android-9,则之后repo sync整个AOSP Codebase就会取出所有Project的my_android-9branch。所以也可以理解,其实repo的branch管理概念很简单,就是同一个branch name的集合,即为整个repo branch,包含在当前repo的manifest中的所有Project必须拥有同名称的branch name。

第二次Code Review,告诉我耳机插入了!!

刚刚的Code Review/Commit,使用git push命令将Code Change推上伺服器的动作对AOSP工程师而言很少用,AOSP工程师主要还是用repo upload来进行上Code的动作。以git push上Code的使用情境大概只有在修改manifest.xml及建立branch时才会用上。而这些工作对于中大型研发单位而言比较偏向IT人员或所谓CM (Code Management)人员才会做的事。

一般而言,AOSP工程师是使用「repo upload」这个命令来上Code。只是在使用repo upload之前,我们必须先把所有的tracking branch指向aosp/my_android-9(或你指定的branch),这一步很重要,要做这个动作后,之后使用repo upload时才能把Code推向Gerrit。

repo forall -c 'echo $REPO_PROJECT;git checkout -b my_android-9 aosp/my_android-9'

以上的命令会花上一段时间。

实作一个小功能

为了第二次上Code,我们来做简单的一个小功能(其实只是小改一下),功能为「插入耳机时,在Status Bar显示耳机Icon」,像这样:

在这里插入图片描述

你可以看到在插入耳机后,在Wi-Fi信号左边一个耳机图示。这是在耳机插入时才会显示。在Google的原生AOSP设计中,预设是不显示这个Icon,AOSP可能认为「你自己有没有插入耳机难道不知道,要系统提醒你?」。但很多使用者的想法是,「有些耳机就怪怪的,插入了没侦测到,或插不够深,结果一放音乐直接从Speaker出声音,就吵到人了。」,想想都有点道理!

在Android 8.0时,你可以下拉Status Bar后,长按设定键(齿输小Icon),进入System Tuner UI,然后手动将耳机Headset图示开启。但Android 9.0之后,System Tuner的功能预设关掉了,所以我们的工作就是把它找回来!!

因为本文不是教你怎么写AOSP Framework相关的Code,所以就不描述要如何找到需要改变的Code的所在位置的思路。直接把要改的部份就写出来。首先开启:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java
把第三行的Code从false改为true:

public class SettingsButton extends AlphaOptimizedImageButton {

    private static final boolean TUNER_ENABLE_AVAILABLE = true; //原始AOSP的值為false

    private static final long LONG_PRESS_LENGTH = 1000;
    private static final long ACCEL_LENGTH = 750;;

再重新下make命令再Build一次,然后执行emulator。完成后下拉Status Bar,长按右下角的设定键会发现小齿轮一直转动(如下图指标所示),放开后进入Settings画面。

在这里插入图片描述

进入Settings之后,进入System->Advanced->System UI Tunner->Status bar后,开启Headset。在实机上当然就是找个耳机插入了(废话!),在Emulator中,开启Extend Control,在右方选择Microphone,开启virtual headset plug inserted来模拟耳机插入。此时就能看到耳机Icon出现。

用repo upload将改变推向Gerrit

接下来就容易了,直接在你改Code的目录下,输入git status,以检视目前project的状态。这里告诉你有个档案SettingsButton.java改变了。然后用git commit进行Commit动作,最后执行repo upload ,把Code推向Gerrit进行Code Review。

repo upload --no-verify .
Upload project frameworks/base/ to remote branch refs/heads/my_android-9:
  branch my_android-9 ( 1 commit, Wed Apr 3 17:58:27 2019 +0800):
         5857f894 enable system ui tuner
to http://192.168.100.56:8080/ (y/N)? y
remote: Processing changes: refs: 1, new: 1, done    
remote: 
remote: SUCCESS
remote: 
remote: New Changes:
remote:   http://192.168.100.56:8080/c/platform/frameworks/base/+/21 enable system ui tuner
To ssh://larson@192.168.100.56:29418/platform/frameworks/base
 * [new branch]      my_android-9 -> refs/for/my_android-9

注意1:repo upload --no-verify的–no-verify这个选项是避开repo hook的检查功能之用。详述可见:https://android.googlesource.com/platform/tools/repohooks/#Bypassing。如果你觉得麻烦,要关闭repohook的功能,就把manifest.xml中的““删除即可!注意2:repo upload是以user.email设定的email前缀做为user name。例如你的gerrit account名为foo,你的email就必须是foo@xxx.xx,因为repo upload是以email而不是以git config中的user.name做为帐号的判断,这个设计上的考量我就想不通了!也许Google在repo上有其考量点只是我不懂,不过也许以后repo会改善。 最后回到Gerrit Web UI上,将Code进行最后Submit,就完成了Code Review及Commit。

在这里插入图片描述

你可以看到Code Review的画面,点选CODE-REVIEW+2再SUBMIT后,就完成了使用repo upload上传Code至Gerrit的任务。

后记

「架设Gerrit Server并移转AOSP Codebase」这系列的三篇文章主要是本身工作需求下,到处找相关文章,Tutorial,及和同事讨论结果的笔记,再经过整理写在Blog上。文章不像有些Quick Start完全不讲原因,反正照抄照Key能成功就行,也不像很多完整的官方文件过于细节。这些文章就是给一些在工作上有同样需求的IT/RD人员一个可以参照的范本,能省去大家一些摸索的时间,理解一些相关议题的诀窍,快一点完成自己的工作那也就够了。至于真的要成为Gerrit/Git大师,恐怕还是得好好下苦功去钻研官方文件了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值