1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
|
#! /bin/bash
#
# Copyright (C) 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
shopt -s failglob
if [ ! -d art ]; then
echo "Script needs to be run at the root of the android tree"
exit 1
fi
TARGET_ARCH=$(source build/envsetup.sh > /dev/null; get_build_var TARGET_ARCH)
# Logic for setting out_dir from build/make/core/envsetup.mk:
if [[ -z $OUT_DIR ]]; then
if [[ -z $OUT_DIR_COMMON_BASE ]]; then
out_dir=out
else
out_dir=${OUT_DIR_COMMON_BASE}/${PWD##*/}
fi
else
out_dir=${OUT_DIR}
fi
java_libraries_dir=${out_dir}/target/common/obj/JAVA_LIBRARIES
common_targets="vogar core-tests apache-harmony-jdwp-tests-hostdex jsr166-tests libartpalette-system mockito-target"
# These build targets have different names on device and host.
specific_targets="libjavacoretests libjdwp libwrapagentproperties libwrapagentpropertiesd"
build_host="no"
build_target="no"
installclean="no"
j_arg="-j$(nproc)"
showcommands=
make_command=
while true; do
if [[ "$1" == "--host" ]]; then
build_host="yes"
shift
elif [[ "$1" == "--target" ]]; then
build_target="yes"
shift
elif [[ "$1" == "--installclean" ]]; then
installclean="yes"
shift
elif [[ "$1" == -j* ]]; then
j_arg=$1
shift
elif [[ "$1" == "--showcommands" ]]; then
showcommands="showcommands"
shift
elif [[ "$1" == "" ]]; then
break
else
echo "Unknown options $@"
exit 1
fi
done
# If neither was selected, build both by default.
if [[ $build_host == "no" ]] && [[ $build_target == "no" ]]; then
build_host="yes"
build_target="yes"
fi
# Allow to build successfully in master-art.
extra_args="SOONG_ALLOW_MISSING_DEPENDENCIES=true"
# Switch the build system to unbundled mode in the reduced manifest branch.
if [ ! -d frameworks/base ]; then
extra_args="$extra_args TARGET_BUILD_UNBUNDLED=true"
fi
apexes=(
"com.android.art.testing"
"com.android.conscrypt"
"com.android.i18n"
"com.android.runtime"
"com.android.tzdata"
"com.android.os.statsd"
)
make_command="build/soong/soong_ui.bash --make-mode $j_arg $extra_args $showcommands $common_targets"
if [[ $build_host == "yes" ]]; then
make_command+=" build-art-host-tests"
make_command+=" dx-tests junit-host"
for LIB in ${specific_targets} ; do
make_command+=" $LIB-host"
done
fi
if [[ $build_target == "yes" ]]; then
if [[ -z "${ANDROID_PRODUCT_OUT}" ]]; then
echo 'ANDROID_PRODUCT_OUT environment variable is empty; did you forget to run `lunch`?'
exit 1
fi
make_command+=" build-art-target-tests"
make_command+=" libnetd_client-target toybox sh libtombstoned_client"
make_command+=" debuggerd su gdbserver"
# vogar requires the class files for conscrypt and ICU.
make_command+=" conscrypt core-icu4j"
make_command+=" ${ANDROID_PRODUCT_OUT#"${ANDROID_BUILD_TOP}/"}/system/etc/public.libraries.txt"
# Targets required to generate a linker configuration for device within the
# chroot environment. The *.libraries.txt targets are required by
# the source linkerconfig but not included in the prebuilt one.
make_command+=" linkerconfig conv_linker_config sanitizer.libraries.txt vndkcorevariant.libraries.txt"
# Additional targets needed for the chroot environment.
make_command+=" event-log-tags"
# Needed to extract prebuilt APEXes.
make_command+=" deapexer"
# Build/install the required APEXes.
make_command+=" ${apexes[*]}"
make_command+=" ${specific_targets}"
fi
if [[ $installclean == "yes" ]]; then
echo "Perform installclean"
ANDROID_QUIET_BUILD=true build/soong/soong_ui.bash --make-mode $extra_args installclean
else
echo "WARNING: Missing --installclean argument to buildbot-build.sh"
echo "WARNING: This is usually ok, but may cause rare odd failures."
echo ""
fi
echo "Executing $make_command"
# Disable path restrictions to enable luci builds using vpython.
eval "$make_command"
if [[ $build_target == "yes" ]]; then
if [[ -z "${ANDROID_HOST_OUT}" ]]; then
echo "ANDROID_HOST_OUT environment variable is empty; using $out_dir/host/linux-x86"
ANDROID_HOST_OUT=$out_dir/host/linux-x86
fi
# Extract prebuilt APEXes.
debugfs=$ANDROID_HOST_OUT/bin/debugfs_static
for apex in ${apexes[@]}; do
dir="$ANDROID_PRODUCT_OUT/system/apex/${apex}"
file="$ANDROID_PRODUCT_OUT/system/apex/${apex}.apex"
if [ -f "${file}" ]; then
echo "Extracting APEX file: ${apex}"
rm -rf $dir
mkdir -p $dir
$ANDROID_HOST_OUT/bin/deapexer --debugfs_path $debugfs extract $file $dir
fi
done
# Replace stub libraries with implemenation libraries: because we do chroot
# testing, we need to install an implementation of the libraries (and cannot
# rely on the one already installed on the device, if the device is post R and
# has it).
implementation_libs=(
"heapprofd_client_api.so"
"libartpalette-system.so"
"liblog.so"
)
if [ -d prebuilts/runtime/mainline/platform/impl ]; then
if [[ $TARGET_ARCH = arm* ]]; then
arch32=arm
arch64=arm64
else
arch32=x86
arch64=x86_64
fi
for so in ${implementation_libs[@]}; do
if [ -d "$ANDROID_PRODUCT_OUT/system/lib" ]; then
cmd="cp -p prebuilts/runtime/mainline/platform/impl/$arch32/$so $ANDROID_PRODUCT_OUT/system/lib/$so"
echo "Executing $cmd"
eval "$cmd"
fi
if [ -d "$ANDROID_PRODUCT_OUT/system/lib64" ]; then
cmd="cp -p prebuilts/runtime/mainline/platform/impl/$arch64/$so $ANDROID_PRODUCT_OUT/system/lib64/$so"
echo "Executing $cmd"
eval "$cmd"
fi
done
fi
# Create canonical name -> file name symlink in the symbol directory for the
# Testing ART APEX.
#
# This mimics the logic from `art/Android.mk`. We made the choice not to
# implement this in `art/Android.mk`, as the Testing ART APEX is a test artifact
# that should never ship with an actual product, and we try to keep it out of
# standard build recipes
#
# TODO(b/141004137, b/129534335): Remove this, expose the Testing ART APEX in
# the `art/Android.mk` build logic, and add absence checks (e.g. in
# `build/make/core/main.mk`) to prevent the Testing ART APEX from ending up in a
# system image.
target_out_unstripped="$ANDROID_PRODUCT_OUT/symbols"
link_name="$target_out_unstripped/apex/com.android.art"
link_command="mkdir -p $(dirname "$link_name") && ln -sf com.android.art.testing \"$link_name\""
echo "Executing $link_command"
eval "$link_command"
# Temporary fix for libjavacrypto.so dependencies in libcore and jvmti tests (b/147124225).
conscrypt_dir="$ANDROID_PRODUCT_OUT/system/apex/com.android.conscrypt"
conscrypt_libs="libjavacrypto.so libcrypto.so libssl.so"
if [ ! -d "${conscrypt_dir}" ]; then
echo -e "Missing conscrypt APEX in build output: ${conscrypt_dir}"
exit 1
fi
if [ ! -f "${conscrypt_dir}/javalib/conscrypt.jar" ]; then
echo -e "Missing conscrypt jar in build output: ${conscrypt_dir}"
exit 1
fi
for l in lib lib64; do
if [ ! -d "$ANDROID_PRODUCT_OUT/system/$l" ]; then
continue
fi
for so in $conscrypt_libs; do
src="${conscrypt_dir}/${l}/${so}"
dst="$ANDROID_PRODUCT_OUT/system/${l}/${so}"
if [ "${src}" -nt "${dst}" ]; then
cmd="cp -p \"${src}\" \"${dst}\""
echo "Executing $cmd"
eval "$cmd"
fi
done
done
# TODO(b/159355595): Ensure there is a tzdata in system to avoid warnings on
# stderr from Bionic.
if [ ! -f $ANDROID_PRODUCT_OUT/system/usr/share/zoneinfo/tzdata ]; then
mkdir -p $ANDROID_PRODUCT_OUT/system/usr/share/zoneinfo
cp $ANDROID_PRODUCT_OUT/system/apex/com.android.tzdata/etc/tz/tzdata \
$ANDROID_PRODUCT_OUT/system/usr/share/zoneinfo/tzdata
fi
# Create system symlinks for the Runtime APEX. Normally handled by
# installSymlinkToRuntimeApex in soong/cc/binary.go, but we have to replicate
# it here since we don't run the install rules for the Runtime APEX.
for b in linker{,_asan}{,64}; do
echo "Symlinking /apex/com.android.runtime/bin/$b to /system/bin"
ln -sf /apex/com.android.runtime/bin/$b $ANDROID_PRODUCT_OUT/system/bin/$b
done
for d in $ANDROID_PRODUCT_OUT/system/apex/com.android.runtime/lib{,64}/bionic; do
if [ -d $d ]; then
for p in $d/*; do
lib_dir=$(expr $p : '.*/\(lib[0-9]*\)/.*')
lib_file=$(basename $p)
src=/apex/com.android.runtime/${lib_dir}/bionic/${lib_file}
dst=$ANDROID_PRODUCT_OUT/system/${lib_dir}/${lib_file}
echo "Symlinking $src into /system/${lib_dir}"
mkdir -p $(dirname $dst)
ln -sf $src $dst
done
fi
done
# Create linker config files. We run linkerconfig on host to avoid problems
# building it statically for device in an unbundled tree.
# temporary root for linkerconfig
linkerconfig_root=$ANDROID_PRODUCT_OUT/art_linkerconfig_root
rm -rf $linkerconfig_root
# Linkerconfig reads files from /system/etc
mkdir -p $linkerconfig_root/system
cp -r $ANDROID_PRODUCT_OUT/system/etc $linkerconfig_root/system
# For linkerconfig to pick up the APEXes correctly we need to make them
# available in $linkerconfig_root/apex.
mkdir -p $linkerconfig_root/apex
for apex in ${apexes[@]}; do
src="$ANDROID_PRODUCT_OUT/system/apex/${apex}"
if [[ $apex == com.android.art.* ]]; then
dst="$linkerconfig_root/apex/com.android.art"
else
dst="$linkerconfig_root/apex/${apex}"
fi
echo "Copying APEX directory from $src to $dst"
rm -rf $dst
cp -r $src $dst
done
# Linkerconfig also looks at /apex/apex-info-list.xml to check for system APEXes.
apex_xml_file=$linkerconfig_root/apex/apex-info-list.xml
echo "Creating $apex_xml_file"
cat <<EOF > $apex_xml_file
<?xml version="1.0" encoding="utf-8"?>
<apex-info-list>
EOF
for apex in ${apexes[@]}; do
[[ $apex == com.android.art.* ]] && apex=com.android.art
cat <<EOF >> $apex_xml_file
<apex-info moduleName="${apex}" modulePath="/system/apex/${apex}.apex" preinstalledModulePath="/system/apex/${apex}.apex" versionCode="1" versionName="" isFactory="true" isActive="true">
</apex-info>
EOF
done
cat <<EOF >> $apex_xml_file
</apex-info-list>
EOF
system_linker_config_pb=$linkerconfig_root/system/etc/linker.config.pb
# This list needs to be synced with provideLibs in system/etc/linker.config.pb
# in the targeted platform image.
# TODO(b/186649223): Create a prebuilt for it in platform-mainline-sdk.
system_provide_libs=(
heapprofd_client_api.so
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libGLESv3.so
libOpenMAXAL.so
libOpenSLES.so
libRS.so
libaaudio.so
libadbd_auth.so
libadbd_fs.so
libamidi.so
libandroid.so
libandroid_net.so
libartpalette-system.so
libbinder_ndk.so
libc.so
libcamera2ndk.so
libcgrouprc.so
libclang_rt.asan-i686-android.so
libclang_rt.asan-x86_64-android.so
libdl.so
libdl_android.so
libft2.so
libincident.so
libjnigraphics.so
liblog.so
libm.so
libmediametrics.so
libmediandk.so
libnativewindow.so
libneuralnetworks_packageinfo.so
libselinux.so
libstdc++.so
libsync.so
libvndksupport.so
libvulkan.so
libz.so
)
echo "Encoding linker.config.json to $system_linker_config_pb"
$ANDROID_HOST_OUT/bin/conv_linker_config proto -s $ANDROID_BUILD_TOP/system/core/rootdir/etc/linker.config.json -o $system_linker_config_pb
$ANDROID_HOST_OUT/bin/conv_linker_config append -s $system_linker_config_pb -o $system_linker_config_pb --key "provideLibs" --value "${system_provide_libs[*]}"
# To avoid warnings from linkerconfig when it checks following two partitions
mkdir -p $linkerconfig_root/product
mkdir -p $linkerconfig_root/system_ext
platform_version=$(build/soong/soong_ui.bash --dumpvar-mode PLATFORM_VERSION)
linkerconfig_out=$ANDROID_PRODUCT_OUT/linkerconfig
echo "Generating linkerconfig in $linkerconfig_out"
rm -rf $linkerconfig_out
mkdir -p $linkerconfig_out
$ANDROID_HOST_OUT/bin/linkerconfig --target $linkerconfig_out --root $linkerconfig_root --vndk $platform_version
fi
|