Android系统开发环境搭建

目录

一、ubuntu20.04环境配置

1、源更新

2、构建Linux

3、配置JDK

4、配置SDK

5、配置环境变量

6、配置git

7、配置repo

8、配置ssh

9、激活gerrit

二、远程服务器环境配置

 1、远程服务器连接

2、配置依赖

3、配置ssh

4、配置git

5、配置repo

6、ubuntu本地挂载远程服务器工作目录

7、windows本地挂载远程服务器工作目录

8、服务器管理维护

三、android源码

1、源码下载

2、源码编译

3、生成IDE

4、问题汇总

四、芯片厂商

1、联发科mtk

1.1、SP_Flash_Tool工具启动失败

1.2、SP_Flash_Tool工具LIB DA no match

2、高通Qualcomm

五、OTA升级

1、生成ota包

2、升级OTA


一、ubuntu20.04环境配置

1、源更新

        ubuntu下载更新安装软件包相当方便,只需要使用sudo apt-get install就能够一键下载更新安装,详情可以参考《Linux apt 命令》

        在使用apt命令的时候,会自动从源清单文件/etc/apt/sources.list配置的远程服务器中去寻找软件包。但是经常出现找不到该软件包,或者有依赖未安装等奇葩问题,这个时候可能需要更新源文件,具体详情可以参考《Ubuntu 20.04换阿里源》在更新源的时候需要注意不同ubuntu版本需要使用对应的源配置,例如ubuntu20.04就应该使用focal;通常情况使用阿里源,因为相对来说比较稳定。

2、构建Linux

        android基于linux内核,所以在编译android的时候还需要使用linux相关的一些软件包,android官方网站已经有说明需要安装那些工具,详情可以点击我。最新的软件包配置如下:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

3、配置JDK

        android源码中使用了大量的java代码,因此jdk也是必不可少的,通常使用的是jdk 8,执行如下命令即可:

sudo apt install openjdk-8-jdk

4、配置SDK

        如果需要使用android sdk的一些工具(例如adb调试工具)的话,还需要配置sdk,可以把android studio下载的sdk包直接拷贝过来。如果只是用于源码的下载与编译可以跳过。

5、配置环境变量

        涉及到jdk和sdk就避免不能环境变量这个话题,即在终端中执行某条命令,系统会自动优先去环境变量中路径去寻找对应命令的执行文件,因此要想使用jdk和sdk还需要把他们配置到环境变量中。

#编辑bashrc文件	
vi ~/.bashrc
#添加以下配置内容到.bashrc文件中
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#添加完成保存,回到terminal端输入命令
source ~/.bashrc

6、配置git

        android使用了git来进行代码分布式管理,因此还需要安装git相关的工具包,在终端执行如下命令:

sudo apt-get install  git git-core gitk git-man openssh-server openssh-client vim

        接下来我们第一步就需要配置git用户信息,执行git config --global命令来配置我们的用户名和邮箱地址,还可以通过git config --list来查看配置信息。若要更改个人的信息,只需再次运行该命令即可,不会影响到权限等问题。

7、配置repo

        android的代码是放在多个git仓库中,需要一个全局的命令repo进行统一的管理,repo是谷歌提供的用于管理多个git仓库的工具。它其实就是一个python脚本,所以使用它就很简单了,只需要将它配置到环境变量中就OK了。具体操作如下:

#确保您的主目录中有一个bin/ 目录
mkdir ~/bin
#下载 Repo 启动器
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
#赋予执行权限
chmod a+x ~/bin/repo
#讲repo添加到环境变量中
PATH=~/bin:$PATH

8、配置ssh

        光是git和repo还是不能愉快的进行代码下载,因为repo脚本中使用了ssh相关的密文校验,因此我们还需要执行如下命令:

sudo apt-get install sshpass encfs cifs-utils ccache python

        SSH协议有两种访问方式:使用对应机器的用户密码;通过密匙对进行本地与远程机器的访问。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,我们用公钥配置后才能提交代码到gerrit上进行代码审查。可通过如下步骤:

  • 生成秘钥和公钥:执行ssh-keygen -t rsa  -C xxx@xxx.com 命令会在~/.ssh目录下自动生成私钥文件id_rsa和公钥文件id_rsa.pub。注意该命令最后一个参数是上文中配置git邮箱;该命令执行过程中会让你输入密码,但是切记一定不要输入,一路回车即可。如下:

  • 配置ssh服务器:SSH协议使用通过~/.ssh/config文件里面信息进行获取,因此还需要在该文件中配置对应的服务器(repo解析命令在该文件中寻找对应的服务器并进行代码下载)。如下:
host scm
user git
hostname gitcode.tinno.com
identityFile ~/.ssh/id_rsa

host gerritXXX             #服务器标识 repo init -u后面参数
KexAlgorithms +diffie-hellman-group14-sha1
KexAlgorithms +diffie-hellman-group1-sha1
user pengcheng.ding        #用户名 git config --global user.name配置用户名
port 29418                 #服务器端口号
hostname gitcode.tinno.com #服务器地址或者域名
identityFile ~/.ssh/id_rsa #秘钥

# 例如下载某个项目代码需要执行如下repo init命令:
# repo init -u gerritXXX:mt6762r/platform/manifest -b sw -m MT67R_DEV_EXP2.0_V1.0.xml
# repo 解析第四个参数gerritXXX,会从~/.ssh/config文件中寻找适合有该服务器标识,如果有就得到具体的服务器地址和端口,使用~/.ssh/id_rsa秘钥中的信息与该服务器的公钥信息进行配对,配对成功就可用开始愉快的下载代码了

  • 验证ssh权限:上面已经完成了配置,但是还需要进行校验一下我们是否可以与服务器配对成功。在校验之前需要把本地的公钥文件和你的git用户信息交给配置管理员,配置管理员讲这些信息配置到对应的服务器,否则校验不过,因为服务器并没有你的信息。除此之外

9、激活gerrit

        以上步骤只是把本地环境准备好了,还需要把本地的公钥文件和你的git用户信息交给配置管理员,配置管理员讲这些信息配置到对应的服务器。

        如果服务器已经OK的话可以开始计划gerrit了,Gerrit 是一个基于网页的代码审核系统,适用于使用 Git 的项目。Gerrit 允许所有授权用户提交更改(如果这些更改通过代码审核,便会自动纳入到项目中),以此鼓励他们更集中地使用 Git。此外,Gerrit 会在浏览器中并排显示更改,并支持代码内注释,从而使审核工作变得非常轻松。

        激活gerrit需要把本地公钥和git用户名和git邮箱放上去,如下图:

        一切准备就绪,就可以开始验证与服务器之间的ssh校验等其他权限是否OK,可以执行ssh 服务器标识来判断。例如上文中的~/.ssh/config文件中配置了scm和gerritXXX两个服务器标识,那么在终端执行ssh scm和ssh gerritXXX命令,如下图结果标识验证成功:

        注意,在验证之前需要给本地公钥秘钥文件赋予可执行权限。

二、远程服务器环境配置

        远程服务器架构指的本地windows/ubunut -----ssh-----> 远程服务器。(本地ubuntu或者windows终端通过ssh命令去连接远程服务器,源码下载编译修改都在远程服务器操作)所以这样本地环境配置相对简单,只需要如下几步骤:

  • 配置ssh
  • 配置git
  • 配置repo

 1、远程服务器连接

        ubuntu下面可以直接使用ssh命令连接远程服务器,如下命令:

#命令格式:ssh 用户名@服务器地址
ssh pengcheng.ding@172.19.169.106

        windows下面没有默认支持ssh,因此需要下载对应的客户端,例如xshell等工具。

2、配置依赖

        因为远程服务器已经配置好了基本的依赖和软件包,所以这一步我们可以跳过。

3、配置ssh

        详情配置可以参考第一章,这里我们可以从本地ubuntu里面拷贝.ssh目录下的config配置文件和公钥、私钥,可以在远程服务中执行scp命令拷贝,如下:

#连接远程服务器
ssh pengcheng.ding@172.19.169.106
#创建.ssh目录
mkdir   .ssh
cd   .ssh
#通过scp拷贝本地ubuntu配置文件
#命令格式:scp 远程计算机用户名@远程计算机地址:远程计算机被拷贝的文件 目的地址
scp  android@172.19.160.120:/home/android/.ssh/id_rsa   .
scp  android@172.19.160.120:/home/android/.ssh/id_rsa.pub   .
scp  android@172.19.160.120:/home/android/.ssh/config   .

4、配置git

        配置git账号和邮箱,我们才可以提交下拉代码,注意这里的用户和邮箱一定要和上面ssh里面配置一致,如下命令:

git config --global user.name shen
git config --global user.email xxx@xxx.com

5、配置repo

        详情配置可以参考第一章,但是直接从google下拉的qiangrepo可能需要换墙,因此可以直接使用深圳配置组发的repo。

  • 本地创建usr/bin路径:
cd  ~/usr/bin
scp  深圳的repo  .
chmod 755 repo
  • 添加环境变量usr/bin路径:
vi  ~/.bashrc
#末行增加
export PATH=${PATH}:~/usr/bin
source ~/.bashrc

6、ubuntu本地挂载远程服务器工作目录

        上面步骤让我们可以通过ssh命令进入到远程服务器进行代码下载编译及vim等操作,但是在处理复杂代码的时候可能有些不方便,因此还需要本地挂载远程服务器的工作目录,本地通过as等ide工具加载源码。如下流程:

  • 本地ubuntu安装smb文件系统依赖
sudo apt-get install smbfs nfs-common cifs-utils 
  • 本地ubuntu创建挂载目录
mkdir /home/android/mnt
  • 挂载共享到/home/android/mnt目录
#Mount挂载命令格式:mount -t cifs  远程主机地址/远程主机用户名  本地被挂载的路径  -o username=远程主机用户名,password=远程主机密码,uid=android,gid=andoird
sudo mount -t cifs //172.19.169.106/pengcheng.ding  /home/android/mnt/ -o username=pengcheng.ding,password=pengcheng.ding,uid=android,gid=android
#注意,这种方式ubuntu重启的时候也会去检测文件系统包括挂载这块,导致费时很长,所以重启之前需要取消挂载操作

7、windows本地挂载远程服务器工作目录

8、服务器管理维护

        实际上跟维护本地ubuntu一样,执行如下命令:

#连上服务器
ssh pengcheng.ding@172.19.169.106
#切换root用户
sudo -i
#查看服务器状态
glances

        使用glance命令查看当前服务器各种情况,其信息如下图:

三、android源码

1、源码下载

  • repo init  xxxxxx:该命令执行后将会在当前目录下生产隐藏目录.repo文件夹,里面存储了所有相关的git仓库信息,可以.repo/manifest.xml查看当前有哪些仓库,如下图,其中path字段表示所在当前目录下的路径,后续可以指定该字段同步:

  • repo sync -c -f --no-tags -r YB:该命令根据.repo下的仓库信息依次从服务器下载代码,其中-r指定远程服务器,-c表示只下载当前分支,--no-tags表示不拉tag信息,-f表示出现错误不停止
  • repo sync android/device -c -f --no-tags:该命令指定路径下载代码,指定的路径必须是manifest.xml里面的path配置了的路径。如果下载不下来的可以尝试删除该文件重新repo sync

2、源码编译

        源码编译通常有两种方式:其一是使用谷歌原生的编译方式;其二是直接执行芯片厂商已经封装好的脚本文件(不同平台做了相应的命令封装,实际上还是使用的谷歌原生的命令)。本文只介绍谷歌原生的编译步骤如下:

  • 进入根目录执行命令source build/envsetup.sh初始化一系列环境变量
  • 在根目录执行命令lunch选择要编译的版本的tag
  • 在根目录执行mmm或者make编译整个源码
  • 进入单个模块目录(独立Android.mk文件)执行mm编译当前模块(实际上调用了当前目录下的Android.mk脚本)

3、生成IDE

        到目前为止我们已经下载并且编译了源码, 但是还有一个刻不容缓的问题摆在我们面前,就是如何阅读这庞大的源码,通常使用source insight或android studio工具。本节将介绍如何通过studio来加载源码。如下步骤:

  • 初始化环境变量:使用命令source build/envsetup.sh和lunch指定当前编译的tags。
  • 编译idegen工具:使用命令mmm development/tools/idegen/在根目录下编译idegen工具。
  • 生成android.ipr文件:使用命令./development/tools/idegen/idegen.sh将在根目录下通过idegen工具生成android.ipr和android.imi文件。
  • Android studio导入工程:打开Android Studio, 点击File -> Open,选中前面生成的android.ipr文件即可, 该过程较耗时,但有两种方式可以去掉不需要加载的内容:

4、问题汇总

ubuntu20.04编译android-11.0.0_r3源码问题:libncurses.so.5找不到

5、MTK基线编译

5.1、基线下载

# 初始化mt6762r的V8.152基线
repo init -u gerrit207:mt6762r/platform/manifest -b build -m ALPS-RELEASE-R0.MP1-V8.152.xml
# 下载同步代码
repo sync -c --no-tags

5.2、基线编译

# 初始化环境
source build/envsetup.sh 
# 选择平台
lunch
# 选择full_k65v1_64_bsp-userdebug
60
# 编译
make -j32

mt6762r的选择的产品全部定义在android/device/mediateksample目录下,即full_k65v1_64_bsp这样的文件进行配置,userdebug属于自带的模式。如下图:

 但是如上命令编译的时候并不是很顺利,会报如下错误。该错误是因为找不到modem的img

5.3、modem编译

modem的编译详情可以去MTK官网搜索[FAQ21675] 和[FAQ21016],详情如下:

Step 1: 配置环境
按照release note -->Build Environment Info, 配置编译环境。
注意:tool要使用要求的版本,其它版本MTK内部没有测试过,很可能会出现编译报错。

Step 2: 编译命令
./m [Project makefile name] new
Ex:
./m "TK_MD_BASIC(LWCTG_67xx).mak" new

Step 3: 执行modemRenameCopy.pl脚本
In ALPS codebase, run command:
perl device/mediatek/build/build/tools/modemRenameCopy.pl [Modem Codebase Path] [Modem Project Makefile Name]
Ex:
perl device/mediatek/build/build/tools/modemRenameCopy.pl ~currUser/MOLY_codebase/mcu TK_XXX_MODEM
注意:
执行modemRenameCopy.pl脚本,这个步骤一定不能漏掉。它的作用是把所有需要拷贝到AP端的文件收集到temp_modem文件夹中(modem codebase根目录下),并且还会生成一个Android.mk文件。

Step 4:拷贝modem image到AP
执行modemRenameCopy.pl脚本之后,需要把temp_modem文件夹拷贝到AP。AP端路径:
M0之前版本:alps/vendor/mediatek/proprietary/custom/${project}/modem/[temp_modem]
M0以及之后版本:alps/vendor/mediatek/proprietary/modem/[temp_modem]
 
[temp_modem]文件夹拷贝到AP端之后,文件夹名可以自行更改,如${modem}:
alps/vendor/mediatek/proprietary/modem/${modem}

Step 5:编译APPS
Apps是跟modem code一起release的。APPS同样需要先编译,然后把编译生成的文件拷贝到AP端.
注意:
编译APPS之前,需要安装Android NDK。下载地址请参考release note -->Build_Configure_Modem--->[2. Build MD APPS library & binary]
 
编译命令:
./build.sh clean,build,pack all [modem chip generation config file]
Ex:
./build.sh clean,build,pack all GEN93_USER
 
Step 6:把编译APPS生成的文件拷贝到AP
解开生成的*.tar.bz2,拷贝如下:
init_rc/, 拷贝到alps/vendor/mediatek/proprietary/modem/${modem}/init_rc/
sepolicy/,拷贝到alps/vendor/mediatek/proprietary/modem/${modem}/sepolicy/
makefile/,拷贝到alps/vendor/mediatek/proprietary/modem/${modem}/makefile/
libs/, 拷贝到alps/vendor/mediatek/proprietary/modem/${modem}/libs/
 
Step 7:Configure in ALPS
        1. alps/device/${company}/${project}/ProjectConfig.mk
            CUSTOM_MODEM = ${modem}
        2. 把alps/device/mediatek/build/build/tools/modem/modem_Android.mk
            拷贝到                      
            alps/vendor/mediatek/proprietary/modem/Android.mk  (跟${modem}在同一级目录)

5.4、aosp集成modem

根据mtk提供的文档,需要把modem生成的包拷贝到AOSP的vendor/mediatek/proprietary/modem/目录下,我这里就不研究modem了,直接拷贝的以前项目的modem,如下图

最后还有两个配置:

  • 把alps/device/mediatek/build/build/tools/modem/modem_Android.mk拷贝到 alps/vendor/mediatek/proprietary/modem/Android.mk,目的是编译AOSP的时候能调用Android.mk来集成modem的生成物

  • 修改alps/device/${company}/${project}/ProjectConfig.mk文件中的CUSTOM_MODEM为modem的路径,注意aosp中的company/project根据你lunch选择的配置而定。例如我前面选择的full_k65v1_64_bsp-userdebug就应该是:

 5.5、aosp编译

重复5.2,编译OK,在android/out目录下生成所有的文件,如下:

注意,是没有DA.bin文件的,这个时候需要使用工具的MTK_AllInOne_DA.bin文件,该DA文件是固化到硬件上的可执行文件,MTK提供。

四、芯片厂商

1、联发科mtk

1.1、SP_Flash_Tool工具启动失败

        ubuntu20.04初次启动SP_Flash_Tool工具的时候出现找不到libpng问题,需要执行如下命令下载最新库(详情参考):

sudo add-apt-repository ppa:linuxuprising/libpng12
sudo apt update
sudo apt install libpng12-0

1.2、SP_Flash_Tool工具LIB DA no match

        在windows10上启动SP_Flash_Tool,在选择download-Agent的时候弹出错误对方框无法匹配LIB DA,如下图:

可以在设置中去掉LIB DA检测,如下

1.3、SP_Flash_Tool工具Verified boot is enabled

在烧写镜像的时候报如下错误:

提示校验不通过,但是编译镜像的时候明明经过vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh进行签名了的,替换DA文件为工具自带的MTK_AllInOne_DA.bin即可,试用所有镜像。如下:

1.4、SP_Flash_Tool工具错误码汇总

SP_FLASH_TOOL错误码汇总

1.5、MTK平台申请Patch

2、高通Qualcomm

2.1、高通环境搭建

  • 解压高通工具包到home目录:

  • 配置高通工具包的环境变量:
# 需要注意的是不同版本可能有些路径不一样
# 高通环境 P780
export QUALROOT=/home/data1/pengcheng.ding
#####ARMCT 5.01###################
export ARMROOT=$QUALROOT/Qualcomm/ARM501bld94
export ARMINC=$ARMROOT/include
export ARMLIB=$ARMROOT/lib
export ARMBIN=$ARMROOT/bin
export ARMPATH=$QUALROOT/Qualcomm/ARM501bld94/bin64
export ARMINCLUDE=$ARMROOT/include
export ARMTOOLS=ARMCT5.01
export PATH=$ARMINC:$ARMLIB:$ARMBIN:$ARMPATH:$ARMINCLUDE:$PATH
########HEXAGON TOOL #########################
export HEXAGON_ROOT=$QUALROOT/Qualcomm/HEXAGON_Tools/
export PATH=$HEXAGON_ROOT:$PATH
################  LLVM   TZ  environment ####################
export LLVMTOOLS=LLVM
export LLVMROOT=$QUALROOT/Qualcomm/LLVM/Snapdragon-llvm-4.0.2-linux64
export LLVMBIN=$LLVMROOT/bin
export LLVMLIB=$LLVMROOT/lib/clang/4.0.2/lib/linux
export MUSLPATH=$LLVMROOT/tools/lib64
export MUSL32PATH=$LLVMROOT/tools/lib32
export LLVMINC=$MUSLPATH/include
export LLVM32INC=$MUSL32PATH/include
export LLVMTOOLPATH=$LLVMROOT/tools/bin
export GNUARM7=$QUALROOT/Qualcomm/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux
export GNULIBC=$QUALROOT/Qualcomm/gcc-linaro-4.9-2014.11-x86_64_aarch64-elf/aarch64-linux-gnulibc
export GNUROOT=$QUALROOT/Qualcomm/gcc-linaro-4.9-2014.11-x86_64_aarch64-elf
export GNUTOOL=$QUALROOT/Qualcomm/gcc-linaro-4.9-2014.11-x86_64_aarch64-elf/aarch64-linux-gnu
export PATH=$MUSLPATH:$MUSL32PATH:$LLVMTOOLPATH:$LLVMBIN:$LLVMLIB:$PATH
#########################################################

3、展锐紫光

展锐官方地址:Uni-support

展锐厂商地址:IBM Rational ClearQuest

3.1、编译镜像

        注意展锐紫光项目编译成功后也没有一个提示,坑爹的是还有一个库文件找不到的信息,这个可以跳过,所有展锐项目都有。

3.2、镜像打包

        将FLASHER结尾的zip包拷贝到windows系统并解压会发现里面只有一个pac结尾的文件

3.3、镜像烧写

        展锐紫光的windows烧写工具包如下图,有两个重要的目录,其中一个是usb驱动,ResearchDownload才是烧写工具。

         先进入SPRD_NPI_USBDriver目录安装对应的驱动程序,然后打开ResearchDownload目录下的/Bin/ResearchDownload.exe,启动烧写工具主界面,如下:

  • 加载软件包pac文件

  • 配置Backup

  •  配置flash擦除

  •   烧写镜像(点击三角形按钮开始烧写)

  • 先插入USB,再按住手机音量+键,在按住手机电源键。即可进行镜像烧写

3.4、Patch申请

  • 进入官网Patch界面

  •  搜索ID

  • 下载 

五、OTA升级

1、生成ota包

1)本地编译制作

  • 下载需要差分比较的两个版本,例如XXX_V03_target.zip和XXX_V05_target.zip(注意一定要是target包
  • 进入Android项目根目录(即编译目录),在制作OTA差分包之前需要先在本地执行一次otapackage编译,否则后续出现错误:

  • 执行ota_from_target_files命令生成OTA差分包:
./build/tools/releasetools/ota_from_target_files --path out/host/linux-x86 --block -i ~/work/ota/VXXX_02_target.zip    ~/work/ota/VXXX_05_target.zip    ~/work/ota/ota_VXXX_02_to_05.zip
# --path参数指定制作升级包过程中需要依赖的一些库
# -i参数后面跟三个参数,第一个为OTA开始版本,第二个为OTA结束版本,第三个为升级包的名称
  • 上面命令执行成功将在指定目录下生成OTA差分包,如下:

 2)其他工具制作

2、升级OTA

1)本地升级OTA

  • 先将低版本VXXX_02_target.zip烧写到手机

  • 连接手机USB,打开调试模式

  • 让手机进入recovery模式,使用命令adb reboot recovery

  • MTK机型有时候没有cmd,可以尝试电源键+音量加触发recovery模式的命令菜单

  • 音量加减键选择adb升级

  • 推送ota升级包,使用命令adb sideload ota_v755_05_07.zip

  • 可能出现如下错误,改原因为检测不到设备,可以尝试重新插拔usb或者adb kill-server和adb start-server重启adb服务

adb: sideload connection failed: device unauthorized. This adb server's $ADB
  • 升级成功后可能还会停留在recovery模式,音量加减选择进入系统

2)线上升级OTA


版权声明:本文为qq_27672101原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。