xref: /aosp_15_r20/art/tools/buildbot-setup-device.sh (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#!/bin/bash
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project
4*795d594fSAndroid Build Coastguard Worker#
5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*795d594fSAndroid Build Coastguard Worker#
11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*795d594fSAndroid Build Coastguard Worker# limitations under the License.
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker# The work does by this script is (mostly) undone by tools/buildbot-teardown-device.sh.
18*795d594fSAndroid Build Coastguard Worker# Make sure to keep these files in sync.
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker. "$(dirname $0)/buildbot-utils.sh"
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Workerif [ "$1" = --verbose ]; then
23*795d594fSAndroid Build Coastguard Worker  verbose=true
24*795d594fSAndroid Build Coastguard Workerelse
25*795d594fSAndroid Build Coastguard Worker  verbose=false
26*795d594fSAndroid Build Coastguard Workerfi
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Worker# Testing on a Linux VM requires special setup.
29*795d594fSAndroid Build Coastguard Workerif [[ -n "$ART_TEST_ON_VM" ]]; then
30*795d594fSAndroid Build Coastguard Worker  [[ -d "$ART_TEST_VM_DIR" ]] || { msgfatal "no VM found in $ART_TEST_VM_DIR"; }
31*795d594fSAndroid Build Coastguard Worker  $ART_SSH_CMD "true" || { msgerror "no VM (tried \"$ART_SSH_CMD true\""; }
32*795d594fSAndroid Build Coastguard Worker  $ART_SSH_CMD "
33*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT
34*795d594fSAndroid Build Coastguard Worker
35*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/apex
36*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/bin
37*795d594fSAndroid Build Coastguard Worker    mkdir -p $ART_TEST_CHROOT/data/local/tmp
38*795d594fSAndroid Build Coastguard Worker    mkdir -p $ART_TEST_CHROOT/data/misc/trace
39*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/dev
40*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/etc
41*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/lib
42*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/linkerconfig
43*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/proc
44*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/sys
45*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/system
46*795d594fSAndroid Build Coastguard Worker    mkdir $ART_TEST_CHROOT/tmp
47*795d594fSAndroid Build Coastguard Worker    mkdir -p $ART_TEST_CHROOT/usr/lib
48*795d594fSAndroid Build Coastguard Worker    mkdir -p $ART_TEST_CHROOT/usr/share/gdb
49*795d594fSAndroid Build Coastguard Worker
50*795d594fSAndroid Build Coastguard Worker    sudo mount -t proc /proc $ART_TEST_CHROOT_BASENAME/proc
51*795d594fSAndroid Build Coastguard Worker    sudo mount -t sysfs /sys $ART_TEST_CHROOT_BASENAME/sys
52*795d594fSAndroid Build Coastguard Worker    sudo mount --bind /dev $ART_TEST_CHROOT_BASENAME/dev
53*795d594fSAndroid Build Coastguard Worker    sudo mount --bind /bin $ART_TEST_CHROOT_BASENAME/bin
54*795d594fSAndroid Build Coastguard Worker    sudo mount --bind /lib $ART_TEST_CHROOT_BASENAME/lib
55*795d594fSAndroid Build Coastguard Worker    sudo mount --bind /lib $ART_TEST_CHROOT_BASENAME/usr/lib
56*795d594fSAndroid Build Coastguard Worker    sudo mount --bind /usr/share/gdb $ART_TEST_CHROOT_BASENAME/usr/share/gdb
57*795d594fSAndroid Build Coastguard Worker    $ART_CHROOT_CMD echo \"Hello from chroot! I am \$(uname -a).\"
58*795d594fSAndroid Build Coastguard Worker  "
59*795d594fSAndroid Build Coastguard Worker  exit 0
60*795d594fSAndroid Build Coastguard Workerfi
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker# Regular Android device. Setup as root, as some actions performed here require it.
63*795d594fSAndroid Build Coastguard Workeradb version
64*795d594fSAndroid Build Coastguard Workeradb root
65*795d594fSAndroid Build Coastguard Workeradb wait-for-device
66*795d594fSAndroid Build Coastguard Worker
67*795d594fSAndroid Build Coastguard Workermsginfo "Date on host"
68*795d594fSAndroid Build Coastguard Workerdate
69*795d594fSAndroid Build Coastguard Worker
70*795d594fSAndroid Build Coastguard Workermsginfo "Date on device"
71*795d594fSAndroid Build Coastguard Workeradb shell date
72*795d594fSAndroid Build Coastguard Worker
73*795d594fSAndroid Build Coastguard Workerhost_seconds_since_epoch=$(date -u +%s)
74*795d594fSAndroid Build Coastguard Worker
75*795d594fSAndroid Build Coastguard Worker# Get the device time in seconds, but filter the output as some
76*795d594fSAndroid Build Coastguard Worker# devices emit CRLF at the end of the command which then breaks the
77*795d594fSAndroid Build Coastguard Worker# time comparisons in this script (Hammerhead, MRA59G 2457013).
78*795d594fSAndroid Build Coastguard Workerdevice_seconds_since_epoch=$(adb shell date -u +%s | tr -c -d '[:digit:]')
79*795d594fSAndroid Build Coastguard Worker
80*795d594fSAndroid Build Coastguard Workerabs_time_difference_in_seconds=$(expr $host_seconds_since_epoch - $device_seconds_since_epoch)
81*795d594fSAndroid Build Coastguard Workerif [ $abs_time_difference_in_seconds -lt 0 ]; then
82*795d594fSAndroid Build Coastguard Worker  abs_time_difference_in_seconds=$(expr 0 - $abs_time_difference_in_seconds)
83*795d594fSAndroid Build Coastguard Workerfi
84*795d594fSAndroid Build Coastguard Worker
85*795d594fSAndroid Build Coastguard Workerseconds_per_hour=3600
86*795d594fSAndroid Build Coastguard Worker
87*795d594fSAndroid Build Coastguard Worker# b/187295147 : Disable live-lock kill daemon.
88*795d594fSAndroid Build Coastguard Worker# It can confuse long running processes for issues and kill them.
89*795d594fSAndroid Build Coastguard Worker# This usually manifests as temporarily lost adb connection.
90*795d594fSAndroid Build Coastguard Workermsginfo "Killing llkd, seen killing adb"
91*795d594fSAndroid Build Coastguard Workeradb shell setprop ctl.stop llkd-0
92*795d594fSAndroid Build Coastguard Workeradb shell setprop ctl.stop llkd-1
93*795d594fSAndroid Build Coastguard Worker
94*795d594fSAndroid Build Coastguard Workerproduct_name=$(adb shell getprop ro.build.product)
95*795d594fSAndroid Build Coastguard Worker
96*795d594fSAndroid Build Coastguard Workerif [ "x$product_name" = xfugu ]; then
97*795d594fSAndroid Build Coastguard Worker  # Kill logd first, so that when we set the adb buffer size later in this file,
98*795d594fSAndroid Build Coastguard Worker  # it is brought up again.
99*795d594fSAndroid Build Coastguard Worker  msginfo "Killing logd, seen leaking on fugu/N"
100*795d594fSAndroid Build Coastguard Worker  adb shell pkill -9 -U logd logd && msginfo "...logd killed"
101*795d594fSAndroid Build Coastguard Workerfi
102*795d594fSAndroid Build Coastguard Worker
103*795d594fSAndroid Build Coastguard Worker# Update date on device if the difference with host is more than one hour.
104*795d594fSAndroid Build Coastguard Workerif [ $abs_time_difference_in_seconds -gt $seconds_per_hour ]; then
105*795d594fSAndroid Build Coastguard Worker  msginfo "Update date on device"
106*795d594fSAndroid Build Coastguard Worker  adb shell date -u @$host_seconds_since_epoch
107*795d594fSAndroid Build Coastguard Workerfi
108*795d594fSAndroid Build Coastguard Worker
109*795d594fSAndroid Build Coastguard Workermsginfo "Turn off selinux"
110*795d594fSAndroid Build Coastguard Workeradb shell setenforce 0
111*795d594fSAndroid Build Coastguard Worker$verbose && adb shell getenforce
112*795d594fSAndroid Build Coastguard Worker
113*795d594fSAndroid Build Coastguard Workermsginfo "Setting local loopback"
114*795d594fSAndroid Build Coastguard Workeradb shell ifconfig lo up
115*795d594fSAndroid Build Coastguard Worker$verbose && adb shell ifconfig
116*795d594fSAndroid Build Coastguard Worker
117*795d594fSAndroid Build Coastguard Workerif $verbose; then
118*795d594fSAndroid Build Coastguard Worker  msginfo "List properties"
119*795d594fSAndroid Build Coastguard Worker  adb shell getprop
120*795d594fSAndroid Build Coastguard Worker
121*795d594fSAndroid Build Coastguard Worker  msginfo "Uptime"
122*795d594fSAndroid Build Coastguard Worker  adb shell uptime
123*795d594fSAndroid Build Coastguard Worker
124*795d594fSAndroid Build Coastguard Worker  msginfo "Battery info"
125*795d594fSAndroid Build Coastguard Worker  adb shell dumpsys battery
126*795d594fSAndroid Build Coastguard Workerfi
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Worker# Fugu only handles buffer size up to 16MB.
129*795d594fSAndroid Build Coastguard Workerif [ "x$product_name" = xfugu ]; then
130*795d594fSAndroid Build Coastguard Worker  buffer_size=16MB
131*795d594fSAndroid Build Coastguard Workerelse
132*795d594fSAndroid Build Coastguard Worker  buffer_size=32MB
133*795d594fSAndroid Build Coastguard Workerfi
134*795d594fSAndroid Build Coastguard Worker
135*795d594fSAndroid Build Coastguard Workermsginfo "Setting adb buffer size to ${buffer_size}"
136*795d594fSAndroid Build Coastguard Workeradb logcat -G ${buffer_size}
137*795d594fSAndroid Build Coastguard Worker$verbose && adb logcat -g
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Workermsginfo "Removing adb spam filter"
140*795d594fSAndroid Build Coastguard Workeradb logcat -P ""
141*795d594fSAndroid Build Coastguard Worker$verbose && adb logcat -p
142*795d594fSAndroid Build Coastguard Worker
143*795d594fSAndroid Build Coastguard Workermsginfo "Kill stalled dalvikvm processes"
144*795d594fSAndroid Build Coastguard Worker# 'ps' on M can sometimes hang.
145*795d594fSAndroid Build Coastguard Workertimeout 5s adb shell "ps" >/dev/null
146*795d594fSAndroid Build Coastguard Workerif [[ $? == 124 ]] && [[ "$ART_TEST_RUN_ON_ARM_FVP" != true ]]; then
147*795d594fSAndroid Build Coastguard Worker  msginfo "Rebooting device to fix 'ps'"
148*795d594fSAndroid Build Coastguard Worker  adb reboot
149*795d594fSAndroid Build Coastguard Worker  adb wait-for-device root
150*795d594fSAndroid Build Coastguard Workerelse
151*795d594fSAndroid Build Coastguard Worker  processes=$(adb shell "ps" | grep dalvikvm | awk '{print $2}')
152*795d594fSAndroid Build Coastguard Worker  for i in $processes; do adb shell kill -9 $i; done
153*795d594fSAndroid Build Coastguard Workerfi
154*795d594fSAndroid Build Coastguard Worker
155*795d594fSAndroid Build Coastguard Worker# Chroot environment.
156*795d594fSAndroid Build Coastguard Worker# ===================
157*795d594fSAndroid Build Coastguard Worker
158*795d594fSAndroid Build Coastguard Workerif [[ -n "$ART_TEST_CHROOT" ]]; then
159*795d594fSAndroid Build Coastguard Worker  # Prepare the chroot dir.
160*795d594fSAndroid Build Coastguard Worker  msginfo "Prepare the chroot dir in $ART_TEST_CHROOT"
161*795d594fSAndroid Build Coastguard Worker
162*795d594fSAndroid Build Coastguard Worker  # Check that ART_TEST_CHROOT is correctly defined.
163*795d594fSAndroid Build Coastguard Worker  [[ "x$ART_TEST_CHROOT" = x/* ]] || { echo "$ART_TEST_CHROOT is not an absolute path"; exit 1; }
164*795d594fSAndroid Build Coastguard Worker
165*795d594fSAndroid Build Coastguard Worker  # Create chroot.
166*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT"
167*795d594fSAndroid Build Coastguard Worker
168*795d594fSAndroid Build Coastguard Worker  # Provide property_contexts file(s) in chroot.
169*795d594fSAndroid Build Coastguard Worker  # This is required to have Android system properties work from the chroot.
170*795d594fSAndroid Build Coastguard Worker  # Notes:
171*795d594fSAndroid Build Coastguard Worker  # - In Android N, only '/property_contexts' is expected.
172*795d594fSAndroid Build Coastguard Worker  # - In Android O+, property_context files are expected under /system and /vendor.
173*795d594fSAndroid Build Coastguard Worker  # (See bionic/libc/bionic/system_properties.cpp or
174*795d594fSAndroid Build Coastguard Worker  # bionic/libc/system_properties/contexts_split.cpp for more information.)
175*795d594fSAndroid Build Coastguard Worker  property_context_files="/property_contexts \
176*795d594fSAndroid Build Coastguard Worker    /system/etc/selinux/plat_property_contexts \
177*795d594fSAndroid Build Coastguard Worker    /vendor/etc/selinux/nonplat_property_context \
178*795d594fSAndroid Build Coastguard Worker    /plat_property_contexts \
179*795d594fSAndroid Build Coastguard Worker    /nonplat_property_contexts"
180*795d594fSAndroid Build Coastguard Worker  for f in $property_context_files; do
181*795d594fSAndroid Build Coastguard Worker    adb shell test -f "$f" \
182*795d594fSAndroid Build Coastguard Worker      "&&" mkdir -p "$ART_TEST_CHROOT$(dirname $f)" \
183*795d594fSAndroid Build Coastguard Worker      "&&" cp -f "$f" "$ART_TEST_CHROOT$f"
184*795d594fSAndroid Build Coastguard Worker  done
185*795d594fSAndroid Build Coastguard Worker
186*795d594fSAndroid Build Coastguard Worker  # Create directories required for ART testing in chroot.
187*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/tmp"
188*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/data/dalvik-cache"
189*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/data/local/tmp"
190*795d594fSAndroid Build Coastguard Worker
191*795d594fSAndroid Build Coastguard Worker  # Populate /etc in chroot with required files.
192*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/system/etc"
193*795d594fSAndroid Build Coastguard Worker  adb shell test -L "$ART_TEST_CHROOT/etc" \
194*795d594fSAndroid Build Coastguard Worker    || adb shell ln -s system/etc "$ART_TEST_CHROOT/etc"
195*795d594fSAndroid Build Coastguard Worker
196*795d594fSAndroid Build Coastguard Worker  # Provide /proc in chroot.
197*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/proc"
198*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q "^proc on $ART_TEST_CHROOT/proc type proc " \
199*795d594fSAndroid Build Coastguard Worker    || adb shell mount -t proc proc "$ART_TEST_CHROOT/proc"
200*795d594fSAndroid Build Coastguard Worker
201*795d594fSAndroid Build Coastguard Worker  # Provide /sys in chroot.
202*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/sys"
203*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q "^sysfs on $ART_TEST_CHROOT/sys type sysfs " \
204*795d594fSAndroid Build Coastguard Worker    || adb shell mount -t sysfs sysfs "$ART_TEST_CHROOT/sys"
205*795d594fSAndroid Build Coastguard Worker  # Provide /sys/kernel/debug in chroot.
206*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q "^debugfs on $ART_TEST_CHROOT/sys/kernel/debug type debugfs " \
207*795d594fSAndroid Build Coastguard Worker    || adb shell mount -t debugfs debugfs "$ART_TEST_CHROOT/sys/kernel/debug"
208*795d594fSAndroid Build Coastguard Worker  # Provide /sys/kernel/tracing in chroot. Using a bind mount is important,
209*795d594fSAndroid Build Coastguard Worker  # otherwise mounting tracefs multiple times confuses the
210*795d594fSAndroid Build Coastguard Worker  # android.hardware.atrace service.
211*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q "^tracefs on $ART_TEST_CHROOT/sys/kernel/tracing type tracefs " \
212*795d594fSAndroid Build Coastguard Worker    || adb shell mount -o bind /sys/kernel/tracing "$ART_TEST_CHROOT/sys/kernel/tracing"
213*795d594fSAndroid Build Coastguard Worker
214*795d594fSAndroid Build Coastguard Worker  # Provide /dev in chroot.
215*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/dev"
216*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q "^tmpfs on $ART_TEST_CHROOT/dev type tmpfs " \
217*795d594fSAndroid Build Coastguard Worker    || adb shell mount -o bind /dev "$ART_TEST_CHROOT/dev"
218*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q "^devpts on $ART_TEST_CHROOT/dev/pts type devpts " \
219*795d594fSAndroid Build Coastguard Worker    || adb shell mount -o bind /dev/pts "$ART_TEST_CHROOT/dev/pts"
220*795d594fSAndroid Build Coastguard Worker  adb shell mount | grep -q " on $ART_TEST_CHROOT/dev/cpuset type cgroup " \
221*795d594fSAndroid Build Coastguard Worker    || adb shell mount -o bind /dev/cpuset "$ART_TEST_CHROOT/dev/cpuset"
222*795d594fSAndroid Build Coastguard Worker
223*795d594fSAndroid Build Coastguard Worker  # Create /apex directory in chroot.
224*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/apex"
225*795d594fSAndroid Build Coastguard Worker
226*795d594fSAndroid Build Coastguard Worker  # Create /linkerconfig directory in chroot.
227*795d594fSAndroid Build Coastguard Worker  adb shell mkdir -p "$ART_TEST_CHROOT/linkerconfig"
228*795d594fSAndroid Build Coastguard Worker
229*795d594fSAndroid Build Coastguard Worker  # Create /bin symlink for shebang compatibility.
230*795d594fSAndroid Build Coastguard Worker  adb shell test -L "$ART_TEST_CHROOT/bin" \
231*795d594fSAndroid Build Coastguard Worker    || adb shell ln -s system/bin "$ART_TEST_CHROOT/bin"
232*795d594fSAndroid Build Coastguard Workerfi
233