目录
1.2、SP_Flash_Tool工具LIB DA no match
一、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
- MTK官方地址:MediaTek On-Line | Login
- MTK厂商地址:Mediatek eService: | Login
- MTK烧写镜像的工具SP_Flash_Tool_exe_Linux_v5.1832.00.100
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工具错误码汇总
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模式,音量加减选择进入系统