VMware下Android编译流程

  • Post author:
  • Post category:其他




VMware下Android编译流程



一、环境

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多个坑,前前后后一个礼拜时间,成功了

image

必须要出现completeed successfully 才算成功



12、运行模拟器

由于之前lunch 配置了环境,所以编译完成后直接执行

emulator 就可以运行模拟器,这个模拟器会加载out/下的对应编译好的文件

image



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



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