首先,安装linux系统,我们需要一个虚拟机,然后再把linux系统安装到虚拟机上。才完成一个能正常运行和工作的环境。
为什么选择ubuntu版本的linux系统?
总所周知,Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本。
不同Linux版本系统选择:
Debian:一般来说Debian作为适合于服务器的操作系统,它比Ubuntu要稳定得多。开源资料少
Ubuntu:Ubuntu是一个以桌面应用为主的Linux操作系统 (因此linux系统,是支持桌面操作的)
它的图形界面固然漂亮,但这也决定了它最佳的应用领域是桌面操作系统而非服务器操作系统。最受欢迎,适合桌面操作
CentOS:你会发现非常多的商业公司部署在生产环境上的服务器都是使用的CentOS系统。主要用在公司服务器上。
**总结:**如果装在自己电脑中而不是服务器的话,就要选择桌面操作的ubuntu系统。如果安装到服务器,需要选择centos版本的linux系统
必备软件
Repo:android源码同步工具
Ubuntu系统:16.0.4,默认安装了Python2.7和3.5
python:版本大于3.6及以上,注意:2.7版本的python一定要保留,源码编译需要用2.7版本的python
android系统:自己选择android版本 android-8.1.0_r1 参考附录资料
jack-server:源码编译过程会自动启动jack-server服务器。手动启动(jack-admin start-server)
配置文件:
1,/etc/profile :全局配置文件路径,配置了openjdk路径,python路径
2, ~/.bashrc 同上(当前用户配置文件路径,配置全局,就不用配置当前用户了) export REPO_URL=‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/’
3,.repo/manifests.git/config :android源码下载路径配置文件,用于提高repo sync 源码同步速度
4, /etc/apt/sources.list : 可以添加一些国内镜像地址 ,用于提高apt-get install 安装软件包的速度
5,etc/hosts :域名映射地址。暂时不需要改动
jack-server服务器
sourcecode/prebuilts/sdk/tools/jack-admin文件 :配置jack-server
git配置文件:
~/.gitconfig 里面就是配置过的git 邮箱和用户名信息
**
硬件:
**
虚拟机内存:运行内存最好超过8G(13G左右,条件可以16G都行),磁盘内存至少250G,然后分配给jack-server内存8G左右用于编译android 系统,13G考虑因素:正常打开虚拟机,保证虚拟机运行内存大概是2G左右。然后分配8G给jack-server编译。
增加jack-server内存:
修改源码目录下的 prebuild/sdk/tools/jack-admin文件
JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME” # 改成下面这行,增加java堆大小。
JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx8000M -cp $LAUNCHER_JAR $LAUNCHER_NAME”
4096编译失败了,改成7000M试下,内存大小可以自己调整
正式篇章
ubuntu系统Android源码编译流程
1,安装虚拟机 (本地虚拟机文件:G:VMware-workstation-full-12.1.0-3272444.exe)
2,在虚拟机安装ubuntu系统(16.0.4,默认安装了Python2.7和3.5) 路径:G:ubuntu-16.04.6-desktop-amd64.iso
3,在系统上安装OpenJDK环境 (源码编译:OpenJDK支持,但JDK不支持)
首先移除ubuntu自带的openJDK,命令:sudo apt-get purge openjdk*
如果ubuntu系统版本是Ubuntu16.0.4 及以上,则可以直接命令安装:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安装后,输入命令java -version 查看是否安装成功。
然后配置环境变量:1,先确认安装的OpenJDK路径(sudo update-alternatives --config java)2;确认环境变量是否配置。如果是全局环境变量:vim /etc/profile; 配置完成后,source /etc/profile 使环境变量生效
4,安装各种包
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
5,安装repo 和下载Android源码
安装repo,参考下面的 linux–Repo的介绍与安装和Android源码下载
源码下载: 需要借助repo工具,google用repo工具实现git类似的功能,具体如下:
…/bin/repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r1 //指定下载分支
…/bin/repo sync //repo放在bin目录下,相当于git clone下载源码,可以-j4 开启线程同步
6,编译源码
初始化环境,命令:执行envsetup.sh 这个脚本
source build/envsetup.sh
然后选择编译的目标模式,有3种可选,分别是
user :用户模式,限制最多,如果编译作为上市产品,那么就用这种模式,此模式就像是是正常的手机ROM那样,没有root权限,默认关闭了各种打印
userdebug :提供了root权限,也可以进行debug,适合内测。
eng 基本上开放了全部权限,而且还带了一些额外的debug工具,开发阶段当然选择此模式了。一般选择eng编译模式
lunch ,设置编译的平台。一般选择:aosp_arm64-eng (或lunch aosp_arm-eng:32位操作系统)
然后设定编译线程数量且真正开始编译,这里的-j4参数,这里是整个系统编译
make -j4
系统编译完成后,我们才能单独编译某个模块,也可以直接启动模拟器,检查系统编译后的效果
mm 或mmm packages/apps/Launcher2/
7,启动模拟器
系统编译完成后,就启动虚拟机,在虚拟机上安装的就是刚编译的系统了。
source build/envsetup.sh
lunch (选择刚才你设置的目标版本,比如这里了我选择的是2)
emulator
linux–Repo的介绍与安装和Android源码下载
1、在用户目录(/home/zhenglin/)下创建 AndroidSource 文件夹 mkdir AndroidSource ,然后进入AndroidSource 目录,在该目录下创建bin文件夹 mkdir bin
2、配置为临时环境变量(参考:设置环境变量的三种方法) PATH=/home/zhenglin/AndroidSource/bin:$PATH
3、下载repo,git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo 得到一个git-clone的文件夹
4、将git-repo中的repo文件复制到 1 创建的bin目录中 然后就可以删除git-repo这个文件夹了
5、对repo增加权限 chmod a+x ~/AndroidSource/bin/repo 目的可以用repo命令
6、在/home/zhenglin/AndroidSource 目录下mkdir sourceCode ,然后在sourceCode目录下 输入如下命令
repo init -u xxxxxxxxx -b xxxx
下载源码文件:
//# 末尾加了–depth=1会快很多 因为这样他不会把历史的代码记录给从头到尾克隆过来(只克隆最新一次提交记录),但是不建议这样
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-8.1.0_r1 --depth=1
下载源码的地址:
google地址:repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r34 --depth=1 谷歌下载地址国内下载非常慢而且还可能连接失败
国内镜像地址:
1,repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.0.1_r1
下载源码过程,有些文件可能会下载失败。可以单独对某些模块 直接更新。例如:更新package/apps/Launcher2.直接输入repo sync package/apps/Launcher2 。repo sync 后面直接带路径,表示同步这个路径下的模块
备注:如果第二步环境变量没起作用,将repo改为 …/bin/repo
7、开始同步,-j 设置多个线程同步,不会有影响
repo sync -j20 在这一步 可以看到源码在下载了。第一次repo sync会下载所有源码。如果不是第一次,则会断点续传,下载过的不再重新下载,
源码下载成功会提示:
repo sync has finished successfully.
SDK编译
SDK的编译和模块编译非常相似,其命令如下:
首先是初始化编译环境: source build/envsetup.sh
接下来是设定编译目标 :lunch sdk-eng
最后通过以下命令编译SDK : make sdk
编译完成,在out/host/linux-x86/sdk,看到sdk文件了。
编译后文件生成目录:
android.jar:/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
linux环境系统文件:./out/host/linux-x86/sdk/sdk/android-sdk_eng.root_linux-x86.zip
模块编译
除了通过make命令编译可以整个android源码外,还可以用mm,mmm命令。
1,首先要在源码根目录下初始化编译环境(source build/evensetup.sh),例如我的源码根目录:home/zhenglin/AndroidSource/sourceCode/
1
|
目的:将envsetup.sh里的所有用到的命令加载到环境变量里去
|
2,然后选择编译目标(lunch 8或者lunch aosp_arm64-eng),
3,再进入对应的模块代码下输入mm命令 或者mmm 模块路径
系统编译
:
第一次下载完成后,一定要直接编译整个系统
在源码根目录,make -j4 注意:make -j8指定线程过多,可能导致编译失败
Python3.8.1更新升级
1,下载python(附件中),可以直接下载到电脑中,然后拖动到虚拟机上,(目录:home/zhenglin/)然后解压。
2,解压:tar zxvf Python-3.8.1.tgz 得到 Python-3.8.1文件夹,然后进入该目录: cd Python-3.8.1
3,创建安装目录,mkdir /usr/local/python3.8/
4,配置安装路径:./configure --prefix=/usr/local/python3.8
4,安装:make
5,编译: make install
6,安装完成后,运行make clean:删除临时的无效文件。
7,建立Python3的软链接
安装完成后,建立软连接。如果/usr/bin/python3连接已经存在了,则删掉python3,然后再输入如下命令:
ln -s /usr/local/python3.8/bin/python3 /usr/bin/python3
ln -s /usr/local/python3.8/bin/pip3 /usr/bin/pip3
注意:bin后面是python3。自己没注意一直写bin/python3.8
8,检验:输入python3检查python版本是否更新,输入pip3看是否正常
输入python,确认python的指向。如果不是最新安装的,需要切换python连接。
切换python:
设置优先级, 数值越大, 优先级越高。优先级高 ,系统会自动选择优先级高的python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
9,python环境变量配置
将安装的python路径:/usr/local/python3.8/bin加入PATH(在/etc/profile文件下 添加)
最后,输入python3和python验证版本是否更新,将python和python3的软链接都最终指向最终升级后的python版本。
编译过程遇到的问题:
问题1:python文件报错,
[ 0% 1/89331] build out/target/common/obj/all-event-log-tags.txt
FAILED: out/target/common/obj/all-event-log-tags.txt
/bin/bash -c “build/tools/merge-event-log-tags.py -o out/target/common/obj/all-event-log-tags.txt
frameworks/base/core/java/android/app/admin/SecurityLogTags.logtags frameworks/base/core/java/android/content/EventLogTags.logtags
frameworks/base/core/java/android/net/EventLogTags.logtags frameworks/base/core/java/android/speech/tts/EventLogTags.logtags
frameworks/base/core/java/android/webkit/EventLogTags.logtags frameworks/base/core/java/com/android/internal/logging/EventLogTags.logtags
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/EventLogTags.logtags frameworks/base/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
frameworks/base/services/core/java/com/android/server/EventLogTags.logtags frameworks/base/services/core/java/com/android/server/am/EventLogTags.logtags
frameworks/ex/common/java/com/android/common/GoogleLogTags.logtags frameworks/native/services/surfaceflinger/EventLog/EventLogTags.logtags
frameworks/opt/telephony/src/java/com/android/internal/telephony/EventLogTags.logtags packages/apps/QuickSearchBox/src/com/android/quicksearchbox/EventLogTags.logtags
packages/apps/Settings/src/com/android/settings/EventLogTags.logtags packages/apps/TimeZoneUpdater/src/main/com/android/timezone/updater/EventLogTags.logtags
packages/providers/CalendarProvider/src/com/android/providers/calendar/EventLogTags.logtags packages/providers/ContactsProvider/src/com/android/providers/contacts/EventLogTags.logtags
packages/services/Telephony/src/com/android/phone/EventLogTags.logtags system/bt/main/…/EventLogTags.logtags system/core/liblog/event.logtags
system/core/libsysutils/EventLogTags.logtags system/core/logcat/event.logtags system/core/logd/event.logtags system/core/storaged/EventLogTags.log
tags”
File “build/tools/merge-event-log-tags.py”, line 51
except getopt.GetoptError, err:
^
SyntaxError: invalid syntax
[ 0% 6/89331] Ensuring Jack server is installed and started
Jack server already installed in “/root/.jack-server”
Server is already running
ninja: build stopped: subcommand failed.
15:18:11 ninja failed with: exit status 1
原因:python解析器出错,源码编译用python2,不能用python3编译源码 (下载源码:要用python3.6以上,才能下载源码成功)
解决方案:将python改成ubuntu系统自带的python2.7,不能用python3.6以上的编译。
查看python的软连接:
查看python的软连接:
cd /usr/bin/
ll |grep python
可以看到python python2 python3等软连接指向。
然后,修改popython2 python3的优先级。保证python指向优先级高的
如下,将popython2的优先级提高,从而让python指向python2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 150
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100
问题2:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 151: ordinal not in range(128)
错误原因:google用python3工具同步源码。而我虚拟机的python版本没有升级到3.6版本以上导致。
解决方案:安装python3.6以上的版本。然后设置python3为默认版本才能同步源码。
注意:python2.7系统自带的版本不建议删除,因为有些系统命令还是会用
问题3:Only an OpenJDK based JDK is supported:
意思:只有基于JDK的OpenJdk是支持源码编译的。所以需要安装OpenJDK
问题4:/usr/bin/python 软连接被删除?
解决方案:copy -r /usr/bin/python2 /usr/bin/python ,目的就是将python2软连接拷贝一份,重新命名为python。
如何配置软连接?
用如下命令, ln -s /usr/local/python3/bin/python3 /usr/bin/python3
解释:/usr/local/python3/bin/python3:代表的是真正的地址; /usr/bin/python3:代表的软连接 我们直接用的命令也是直接用软连接
问题5:编译过程报错信息:Build crash: ckati failed with: signal: killed
解决方案:增加虚拟机内存大小,至少8G
问题6:编译时出现out of memory错误解决办法
https://blog.csdn.net/u011784994/article/details/80990890
修改源码目录下的 prebuild/sdk/tools/jack-admin文件
JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME” # 改成下面这行,增加java堆大小。
JACK_SERVER_COMMAND=“java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx8000M -cp $LAUNCHER_JAR $LAUNCHER_NAME”
4096编译失败了,改成7000M试下,内存大小可以自己调整
问题7:Communication error with Jack server (56). Try ‘jack-diagnose’
ninja: build stopped: subcommand failed.
21:21:29 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target ‘run_soong_ui’ failed
make: *** [run_soong_ui] Error 1
原因: prebuild/sdk/tools/jack-admin jack-server服务器没有启动。
解决方案:prebuild/sdk/tools/jack-admin start-server
问题8:FAILED: out/target/common/docs/api-stubs-timestamp
/bin/bash out/target/common/docs/api-stubs-timestamp.rsp
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c3f00000, 86507520, 0) failed; error=‘无法分配内存’ (errno=12)
There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 86507520 bytes for committing reserved memory. # An error report file with more information is saved as: # /home/zhenglin/AndroidSource/sourceCode/hs_err_pid6208.log
ninja: build stopped: subcommand failed.
21:44:24 ninja failed with: exit status 1
build/core/main.mk:21: recipe for target ‘run_soong_ui’ failed
make: *** [run_soong_ui] Error 1
直接将虚拟机RAM内存提高到13G,之前out of memory 也是和这个有关。虚拟机内存不足。
所以导致编译多次失败。
问题9:系统编译过程中可能一次编译会失败。
可以重新 make -j8 编译,它不会重复编译
问题10:
FAILED: out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
Outputs: out/soong/build.ninja
Error: exited with code: 1
Command: out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
Output:
fatal error: runtime: out of memory
原因:虚拟机运行内存不足导致。查看free -h 运行内存
解决方案:需要重启虚拟机,或者手动kill占用内存的程序。
问题11:
development/build/sdk-linux-x86.atree:36: couldn’t locate source file: lib64/libaapt2_jni.so
development/build/sdk.atree:50: couldn’t locate source file: bin/dmtracedump
development/build/sdk.atree:51: couldn’t locate source file: bin/etc1tool
development/build/sdk.atree:81: couldn’t locate source file: bin/split-select
development/build/sdk.atree:86: couldn’t locate source file: bin/bcc_compat
development/build/sdk.atree:134: couldn’t locate source file: bin/apksigner
development/build/sdk.atree:135: couldn’t locate source file: framework/apksigner.jar
development/build/sdk.atree:138: couldn’t locate source file: bin/dx
development/build/sdk.atree:139: couldn’t locate source file: framework/dx.jar
development/build/sdk.atree:212: couldn’t locate source file: framework/layoutlib-legacy.jar
development/build/sdk.atree:456: couldn’t locate source file: system/app/EmulatorSmokeTests/EmulatorSmokeTests.apk
ninja: build stopped: subcommand failed.
01:15:15 ninja failed with: exit status 1
01:15:15 Unable to parse ninja entry “x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x0011162 13613 0 setup-jack-server 190b1380f220d49a”: strconv.Atoi: parsing “x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x0011162”: invalid syntax
failed to build some targets (01:31 (mm:ss))
解析:
编译失败:
couldn’t locate source file:这个导致编译失败
Unable to parse ninja entry:报错不会导致sdk编译失败。
couldn’t locate source file:都是无法在如下目录找到
~/AndroidSource/sourceCode/out/host/linux-x86/
1,把所有找不到的文件或文件夹 拷贝到对应的目录下,如果没有就手动创建一个放到对应目录下。然后再编译
python 中 出现 invalid syntax
1、在使用筛选时使用等号:例如data[‘car’]==2data[‘car’]==2写成data[‘car’]=2
2、换行时没有使用换行符,直接回车换行
hangzhou =
zhewan_score_original[zhewan_score_original.城市 == ‘杭州市’]
File “”, line 1
hangzhou =
^
SyntaxError: invalid syntax
#正确
hangzhou =
zhewan_score_original[zhewan_score_original.城市 == ‘杭州市’]
换行:两行是同一个声明。句子太长换行,需要添加符号
使用studio查看源码的时候,如果不生成.ipr .iml文件,查看的Java文件是无法索引到其他的文件的,需要一个一个的搜索,很不方便,而.ipr .iml文件就可以解决这部分问题,
而且它还可以控制你需要查看源码的内容,比如你不需要查看cpp库,你就可以在.ipr文件中去除对应的文件夹,使你的studio可以更快的打开。