VMware下Android编译流程
文章目录
- VMware下Android编译流程
- 一、环境
- 二、流程
- 三、Android 编译错误集合
- 1、Ubuntu18.04报错:system/tools/aidl/aidl_language_y.yy: error: define variable ‘api.pure‘ is not used
- 2、Ubuntu18.04报错:bin/bash: prebuilts/misc/linux-x86/bison/bison: cannot execute binary file解决
- 3、`ftruncate(fd_out, GetSize()): Invalid argument`
- 4、Note: Some input files use or override a deprecated API.
- 5、报错如下
- 6、JACK错误 SSL error when connecting to the Jack server. Try 'jack-diagnose'
- 7、GC overhead limit exceeded.Try increasing heap size with java option '-Xmx'.
- 8、错误记录
一、环境
1、Window10下的VMware环境 镜像:Ubuntu18.04LTS
2、Android 7.1.2
二、流程
1、下载VMware,然后一路安装,配置Ubuntu18.04LTS的镜像,镜像下载地址
2、进入ubuntu的命令行中
配置jdk,android 7.x.x 需要openjdk 8 来配置
清除工作
sudo apt-get purge openjdk-* icedtea-* icedtea6-*
配置jdk
sudo apt-get update
sudo apt-get install openjdk-8-jdk
java -version
估计要打印这样:
java version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-0ubuntu4~14.04-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
3、配置相关工具
sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip liblz4-tool python curl vim
注意zlib1g 中的第5个字母是1 数字
4、配置repo,
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
5、建一个工作目录
目录位置随意
mkdir ~/android_aosp
cd ~/android_aosp
6、初始化仓库,用了
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
7、如果需要特定版本
https://android.googlesource.com/platform/manifest 是Google
替换为 git://mirrors.ustc.edu.cn/aosp/platform/manifest
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-7.1.2_r36
跑了这个应该会报错 让你配置git的全局账号
配置git 用户名
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
这个随便设置个就可以了 比如你的github号
配置后再执行上面那个repo init …
8、同步源码
repo sync
9、等了几个小时,下载完成了,必须有success的字样才可以,不然后面编译会出错
在android的源码目录 初始化环境配置
source build/envsetup.sh 或者 . build/envsetup.sh
10、选择要编译的版本
lunch
执行后,要编译什么版本 就输入数字 然后就可以配置了
11、编译
make -j16
16是线程的数量 不是越多越好,这个值最好等于电脑的cpu最大线程数x2
然后结果各种编译错误,各种坑,我至少填了12多个坑,前前后后一个礼拜时间,成功了
必须要出现completeed successfully 才算成功
12、运行模拟器
由于之前lunch 配置了环境,所以编译完成后直接执行
emulator 就可以运行模拟器,这个模拟器会加载out/下的对应编译好的文件
13、如果以后要改模块呢?怎么编译呢
这个肯定不能每次全部编译,
m:整个系统的全编译 这个卸载build/envsetup.sh 里 ,对make的简单封装
mm:编译某个模块,要cd到这个模块下,这个模块里有.mk 文件,如果没有会往上层目录找,直到找到为止,然后执行编译
mmm: 后面可以跟路径 还有更多参数 这个也是来编译某个模块的
比如某个app改了就可以
mmm packages/apps/Camera2/ 对系统的相机修改代码 然后重新编译 打包个apk
然后执行make snod 就会把这个app包含到system.img 然后烧录 或者启动模拟器都可以,就更新了
当然改了某个app 也可以直接adb install -r … 安装也可以 更快了
14、sdk的编译
如果要使用自己的sdk
就执行make sdk
此外这个的编译结果 只能在模拟器上跑,如果要真机 还要编译对应的厂家驱动
三、Android 编译错误集合
下面这些是我编译过程中遇到的错误,仅供参考
1、Ubuntu18.04报错:system/tools/aidl/aidl_language_y.yy: error: define variable ‘api.pure‘ is not used
解决:
# vim system/tools/aidl/aidl_language_y.yy
将以下注释掉:
%pure-parser
修改后:
/*
%pure-parser
*/
2、Ubuntu18.04报错:bin/bash: prebuilts/misc/linux-x86/bison/bison: cannot execute binary file解决
报错原因:在x86 64位系统执行32位程序
# sudo cp /usr/bin/bison prebuilts/misc/linux-x86/bison
3、ftruncate(fd_out, GetSize()): Invalid argument
[ 45% 37395/82723] Generating TOC: out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc
FAILED: out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc
/bin/bash -c "(ASAN_OPTIONS=detect_leaks=0 prebuilts/build-tools/linux-x86/bin/ijar out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc.tmp ) && (if cmp -s out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc.tmp out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc ; then rm out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc.tmp ; else mv out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc.tmp out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc ; fi )"
ftruncate(fd_out, GetSize()): Invalid argument
/bin/bash: line 1: 7485 Aborted (core dumped) ( ASAN_OPTIONS=detect_leaks=0 prebuilts/build-tools/linux-x86/bin/ijar out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar out/target/common/obj/JAVA_LIBRARIES/sdk_v9_intermediates/classes.jar.toc.tmp )
[ 45% 37418/82723] target Java: core-all (out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/classes)
ninja: build stopped: subcommand failed.
12:18:11 ninja failed with: exit status 1
————————————————
解决:build/tools/ijar/zip.cc 修改
去掉zip.cc文件的936行:
int OutputZipFile::Finish() {
if (fd_out > 0) {
WriteCentralDirectory();
//if (ftruncate(fd_out, GetSize()) < 0) {
// return error("ftruncate(fd_out, GetSize()): %s", strerror(errno));
//}
if (close(fd_out) < 0) {
return error("close(fd_out): %s", strerror(errno));
}
fd_out = -1;
}
return 0;
}
4、Note: Some input files use or override a deprecated API.
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
解决办法:进入android目录,执行 make update-api
5、报错如下
flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? ‘cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ ???
Aborted (core dumped)
[ 4% 4832/99272] target C++: libapplypatch <= bootable/recovery/applypatch/bspatch.cpp
解决办法:
在~/.bashrc最后添加export LC_ALL=C
然后 source ~/.bashrc
解答: 添加export LC_ALL=C是去除本地C化,使得Android的编译工具与本地工具不冲突。然后重新编译
6、JACK错误 SSL error when connecting to the Jack server. Try ‘jack-diagnose’
运行 ./jack-diagnose 结果
error: process ID list syntax error
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
//端口被占用了 需要改端口
Port 8077 is used by another process (pid=), please ensure to free the port or change port configuration in '/home/tian/.jack-settings' and '/home/tian/.jack-server/config.properties'
error: process ID list syntax error
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
Port 8076 is used by another process (pid=), please ensure to free the port or change port configuration in '/home/tian/.jack-settings' and '/home/tian/.jack-server/config.properties'
根据上面的提示需要改’/home/tian/.jack-settings’ ‘/home/tian/.jack-server/config.properties’
两个文件端口
vim ~/.jack-settings
# Server settings
SERVER_HOST=127.0.0.1
SERVER_PORT_SERVICE=27755
SERVER_PORT_ADMIN=27765
# Internal, do not touch
SETTING_VERSION=4
把SERVER_PORT_SERVICE 还有SERVER_PORT_ADMIN 这个是改后的结果了,这个可以根据自己端口查询 哪些是可以用
esc 后 输入冒号 wq保存可以了
同理更改 vim ~/.jack-server/config.properties
#
#Sun Nov 14 19:11:35 PST 2021
jack.server.max-jars-size=104857600
jack.server.max-service=4
jack.server.service.port=8076 //这个也要改成之前那个 27755
jack.server.max-service.by-mem=1\=2147483648\:2\=3221225472\:3\=4294967296
jack.server.admin.port=8077 //这个也要改成之前那个 27765
jack.server.config.version=2
jack.server.time-out=7200
~
~
~
更改config.properties的权限为600
chmod 600 ~/.jack-server/config.properties
运行:./jack-admin kill-server ./jack-admin start-server
如果错误依旧,应该是其他的问题
编辑/etc/java-8-openjdk/security/java.security
找到TLSv1这行,把TLSv1, TLSv1.1,删除后保存
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
切换到Android编译源码项目目录:prebuilts/sdk/tools/
运行:./jack-admin kill-server ./jack-admin start-server
7、GC overhead limit exceeded.Try increasing heap size with java option ‘-Xmx’.
-
1.找到如下语句:
JACK_SERVER_COMMAND=“java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME”
-
2.将上述语句修改为:
JACK_SERVER_COMMAND=“java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME”
-
主要是添加了-Xmx4096m参数,接下来在源码目录下执行如下命令重启jack-admin服务:
./prebuilts/sdk/tools/jack-admin stop-server./prebuilts/sdk/tools/jack-admin start-server
-
重启完jack-admin服务后,此时再重新执行编译命令就能编译通过ninja了
8、错误记录
[ 84% 27299/32477] target Package: Set...PS/Settings_intermediates/package.apk)
nothing matches overlay file suw_navbar_ic_back.xml, for flavor anydpi-v21
nothing matches overlay file suw_navbar_ic_more.xml, for flavor anydpi-v21
nothing matches overlay file suw_navbar_ic_next.xml, for flavor anydpi-v21
nothing matches overlay file suw_progress_bar.xml, for flavor v21
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1
修改文件 build/core/combo/HOST_darwin-x86.mk
需要把最后替换为:
# $(1): The file to check
define get-file-size
GSTAT=$(which gstat) ; \
if [ ! -z "$GSTAT" ]; then \
gstat -c "%s" $(1) ; \
else \
stat -f "%z" $(1) ; \
fi
endef