1e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# 2e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# Copyright (C) 2012 The Android Open Source Project 3e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# 4e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# Licensed under the Apache License, Version 2.0 (the "License"); 5e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# you may not use this file except in compliance with the License. 6e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# You may obtain a copy of the License at 7e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# 8e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# http://www.apache.org/licenses/LICENSE-2.0 9e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# 10e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# Unless required by applicable law or agreed to in writing, software 11e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# distributed under the License is distributed on an "AS IS" BASIS, 12e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# See the License for the specific language governing permissions and 14e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# limitations under the License. 15e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# 166ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# Script to start "uiautomator" on the device 17e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# 186ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# The script does a couple of things: 196ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# * Use an alternative dalvik cache when running as non-root. Jar file needs 206ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# to be dexopt'd to run in Dalvik. For plain jar files, this is done at first 216ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# use. shell user does not have write permission to default system Dalvik 226ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# cache so we redirect to an alternative cache 236ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# * special processing for subcommand 'runtest': 246ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# * '--nohup' allows process continue to run even if parent process that 256ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# started it has already terminated. We parse for this parameter and set 266ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# signal trap. This is useful for testing with USB disconnected 276ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# * all jar files that the test classes resides in, or dependent on are 286ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# provided on command line and exported to CLASSPATH environment variable 296ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# before starting the Java code. This offloads the task of class loading 306ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# and resolving of cross jar class dependency to Dalvik 316ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# * all other subcommand or options are directly passed into Java code for 326ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# further parsing 33e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 34e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuexport run_base=/data/local/tmp 35e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuexport base=/system 36e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 37e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu# if not running as root, trick dalvik into using an alternative dex cache 386ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuif [ ${USER_ID} -ne 0 ]; then 39e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu tmp_cache=${run_base}/dalvik-cache 40e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 416ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu if [ ! -d ${tmp_cache} ]; then 426ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu mkdir -p ${tmp_cache} 43e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu fi 44e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 45e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu export ANDROID_DATA=${run_base} 46e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhufi 47e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 486ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# take first parameter as the command 496ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhucmd=${1} 50e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 516ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuif [ -z "${1}" ]; then 526ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu cmd="help" 53e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhufi 54e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 556ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# strip the command parameter 566ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuif [ -n "${1}" ]; then 576ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu shift 58e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhufi 59e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 60d2ca8e4c32020b465c8443a3d006b0af5a5b2befGuang ZhuCLASSPATH=/system/framework/android.test.runner.jar:${base}/framework/uiautomator.jar 61e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 626ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# eventually args will be what get passed down to Java code 636ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuargs= 646ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu 656ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu# special case pre-processing for 'runtest' command 666ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuif [ "${cmd}" == "runtest" ]; then 676ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # first parse the jar paths 686ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu while [ true ]; do 69517824a1704b10944f2fb07e5ea53e85e8b44aa7Guang Zhu if [ -z "${1}" ]; then 70517824a1704b10944f2fb07e5ea53e85e8b44aa7Guang Zhu echo "Error: more parameters expected for runtest; please see usage for details" 71517824a1704b10944f2fb07e5ea53e85e8b44aa7Guang Zhu cmd="help" 72517824a1704b10944f2fb07e5ea53e85e8b44aa7Guang Zhu break 73517824a1704b10944f2fb07e5ea53e85e8b44aa7Guang Zhu fi 746ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu jar=${1} 756ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu if [ "${1:0:1}" = "-" ]; then 766ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # we are done with jars, starting with parameters now 776ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu break 786ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu fi 796ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # if relative path, append the default path prefix 806ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu if [ "${1:0:1}" != "/" ]; then 816ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu jar=${run_base}/${1} 826ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu fi 836ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # about to add the file to class path, check if it's valid 846ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu if [ ! -f ${jar} ]; then 856ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu echo "Error: ${jar} does not exist" 866ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # force to print help message 876ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu cmd="help" 886ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu break 896ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu fi 906ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu CLASSPATH=${CLASSPATH}:${jar} 916ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # done processing current arg, moving on 926ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu shift 936ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu done 946ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # look for --nohup: if found, consume it and trap SIG_HUP, otherwise just 956ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # append the arg to args 966ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu while [ -n "${1}" ]; do 976ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu if [ "${1}" = "--nohup" ]; then 986ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu trap "" HUP 996ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu shift 1006ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu else 1016ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu args="${args} ${1}" 1026ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu shift 1036ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu fi 1046ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu done 1056ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuelse 1066ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu # if cmd is not 'runtest', just take the rest of the args 1076ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu args=${@} 1086ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhufi 1096ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhu 1106ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuargs="${cmd} ${args}" 111e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu 112e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuexport CLASSPATH 1136ac3f28e72bc05dce35a3f8d2b6b095a3f4056daGuang Zhuexec app_process ${base}/bin com.android.commands.uiautomator.Launcher ${args} 114