打造自己的Android源码学习环境之五:编译Android源代码
下载android源代码之后,可以开始编译了。
当前目录是执行repo init
时所在的目录。
或者
$ source build/envsetup.sh$ source build/envsetup.shincluding device/asus/fugu/vendorsetup.shincluding device/generic/mini-emulator-arm64/vendorsetup.shincluding device/generic/mini-emulator-armv7-a-neon/vendorsetup.shincluding device/generic/mini-emulator-mips64/vendorsetup.shincluding device/generic/mini-emulator-mips/vendorsetup.shincluding device/generic/mini-emulator-x86_64/vendorsetup.shincluding device/generic/mini-emulator-x86/vendorsetup.shincluding device/google/dragon/vendorsetup.shincluding device/google/marlin/vendorsetup.shincluding device/htc/flounder/vendorsetup.shincluding device/huawei/angler/vendorsetup.shincluding device/lge/bullhead/vendorsetup.shincluding device/linaro/hikey/vendorsetup.shincluding device/moto/shamu/vendorsetup.shincluding sdk/bash_completion/adb.bash执行lunch
,选择默认的aosp_arm-eng。
也可以直接执行lunch aosp_arm-eng
执行make
。大概编译5~6个小时。
编译完成之后,Android源码目录占用空间,大概85GB: 其中代码20GB,.repo目录占用34GB,out目录占用31GB。
如果安装了openjdk-8,但是编译的是Android 6.0.1的代码(或者之前的版本),会报如下错误:
Checking build tools versions...************************************************************You are attempting to build with the incorrect version of java.Your version is: openjdk version "1.8.0_91" OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14) OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode).The required version is: "1.7.x"Please follow the machine setup instructions at https://source.android.com/source/initializing.html************************************************************build/core/main.mk:171: *** stop。 停止。#### make failed to build some targets (5 seconds) ####解决方法:
sudo apt-get install openjdk-7-jdksudo apt-get install openjdk-7-jre没有剩余空间了,这是由于之前分配给虚拟系统的硬盘空间太少了。 一个缓解此问题的方法是,删除.repo目录。.repo目录大概占用34GB左右的空间。
问题log如下:
[ 35% 12670/35623] build out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jackFAILED: /bin/bash -c "(mkdir -p out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jack.tmpjill.res ) && (unzip -qo prebuilts/sdk/15/android.jar -d out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jack.tmpjill.res ) && (find out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jack.tmpjill.res -iname /"*.class/" -delete ) && (JACK_VERSION=3.36.CANDIDATE out/host/linux-x86/bin/jack @build/core/jack-default.args --verbose error -D jack.import.resource.policy=keep-first -D jack.import.type.policy=keep-first -D jack.android.min-api-level=1 --import prebuilts/sdk/15/android.jar --import-resource out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jack.tmpjill.res --output-jack out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jack ) && (rm -rf out/target/common/obj/JAVA_LIBRARIES/sdk_v15_intermediates/classes.jack.tmpjill.res )"Communication error with Jack server (56). Try 'jack-diagnose'[ 35% 12670/35623] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dexFAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rspCommunication error with Jack server (56). Try 'jack-diagnose'ninja: build stopped: subcommand failed.build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failedmake: *** [ninja_wrapper] Error 1解决方法,可以试试执行如下命令:
$ jack-admin start-serverLaunching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/galian/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher解决方法: 上面已经给出提示:Try increasing heap size with java option '-Xmx<size>'
。 【注意】:以下执行jack-admin的环境是刚才出现编译错误的Terminal。如果是在新的Terminal中执行jack-admin,需要先执行source build/envsetup.sh
和lunch
。
当前已经有jack-server在运行:
$ jack-admin list-servergalian 31645 java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/galian/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher所以,具体的修改方法如下:
第一步,停止Server:jack-admin stop-server
。
第二步,添加-Xmx2048m
或者-Xmx2g
,当然也可以设置更大的内存,例如-Xmx3g
。 打开prebuilts/sdk/tools/jack-admin
文件,有2种修改方式,选其一即可,我采用的是方式2,设置的是-Xmx3g
: 方式1: 修改29行 JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation}"
,改为JACK_SERVER_VM_ARGUMENTS="-Xmx2g -Dfile.encoding=UTF-8 -XX:+TieredCompilation"
。注意:这里不再使用${parameter:=default}
的语法,直接给JACK_SERVER_VM_ARGUMENTS赋值。
方式2: 修改454行 JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
,改为JACK_SERVER_COMMAND="java -Xmx2g -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
。
第三步, 重新编译。可以看到log,里面有-Xmx3g
:
(1) http://source.android.com/source/building.html
———————– 分 割 线 ———————– 本系列文章如下:
(1)《打造自己的Android源码学习环境之一:序》(2)《打造自己的Android源码学习环境之二:在虚拟机中安装Ubuntu(上)》(3)《打造自己的Android源码学习环境之三:在虚拟机中安装Ubuntu(下)》(4)《打造自己的Android源码学习环境之四:下载Android源码》(5)《打造自己的Android源码学习环境之五:编译Android源码》(6)《打造自己的Android源码学习环境之六:运行Android模拟器》新闻热点
疑难解答