android_setup.sh revision 7578b3efc63539cb8140d1f4f5b2773ee9d17c5f
1#!/bin/bash 2# 3# android_setup.sh: Sets environment variables used by other Android scripts. 4 5# Parse the arguments for a DEVICE_ID. 6DEVICE_ID="" 7DEVICE_SERIAL="" 8while (( "$#" )); do 9 if [[ $(echo "$1" | grep "^-d$") != "" ]]; 10 then 11 DEVICE_ID=$2 12 shift 13 elif [[ "$1" == "-s" ]]; 14 then 15 if [[ $# -lt 2 ]]; 16 then 17 echo "ERROR: missing serial number" 18 exit 1; 19 fi 20 DEVICE_SERIAL="-s $2" 21 shift 22 else 23 APP_ARGS=("${APP_ARGS[@]}" "${1}") 24 fi 25 26 shift 27done 28 29function verbose { 30 if [[ -n $SKIA_ANDROID_VERBOSE_SETUP ]]; then 31 echo $@ 32 fi 33} 34 35function exportVar { 36 NAME=$1 37 VALUE=$2 38 verbose export $NAME=\"$VALUE\" 39 export $NAME="$VALUE" 40} 41 42SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 43 44# A valid Android SDK installation is required to build the sample app. 45if [ -z "$ANDROID_SDK_ROOT" ]; then 46 ANDROID_TOOL=$(which android 2>/dev/null) 47 if [ -z "$ANDROID_TOOL" ]; then 48 echo "ERROR: Please define ANDROID_SDK_ROOT in your environment to point" 49 echo " to a valid Android SDK installation." 50 exit 1 51 fi 52 ANDROID_SDK_ROOT=$(cd $(dirname "$ANDROID_TOOL")/.. && pwd) 53 exportVar ANDROID_SDK_ROOT "$ANDROID_SDK_ROOT" 54fi 55 56# ant is required to be installed on your system and in your PATH 57ant -version &> /dev/null 58if [[ "$?" != "0" ]]; then 59 echo "ERROR: Unable to find ant. Please install it before proceeding." 60 exit 1 61fi 62 63# check to see that gclient sync ran successfully 64THIRD_PARTY_EXTERNAL_DIR=${SCRIPT_DIR}/../third_party/externals 65if [ ! -d "$THIRD_PARTY_EXTERNAL_DIR" ]; then 66 echo "" 67 echo "ERROR: Unable to find the required third_party dependencies needed to build." 68 echo " To fix this add the following line to your .gclient file and run 'gclient sync'" 69 echo " target_os = ['android']" 70 echo "" 71 exit 1; 72fi 73 74# Helper function to determine and download the toolchain that we will be using. 75setup_toolchain() { 76 API_LEVEL=14 77 78 if [[ -z "$NDK_REV" ]]; 79 then 80 NDK_REV="8e" 81 fi 82 83 if [[ -z "$ANDROID_ARCH" ]]; 84 then 85 ANDROID_ARCH="arm" 86 fi 87 88 TOOLCHAIN_DIR=${SCRIPT_DIR}/../toolchains 89 if [ $(uname) == "Linux" ]; then 90 verbose "Using Linux toolchain." 91 TOOLCHAIN_TYPE=ndk-r$NDK_REV-$ANDROID_ARCH-linux_v$API_LEVEL 92 elif [ $(uname) == "Darwin" ]; then 93 verbose "Using Mac toolchain." 94 TOOLCHAIN_TYPE=ndk-r$NDK_REV-$ANDROID_ARCH-mac_v$API_LEVEL 95 else 96 verbose "Could not automatically determine toolchain! Defaulting to Linux." 97 TOOLCHAIN_TYPE=ndk-r$NDK_REV-$ANDROID_ARCH-linux_v$API_LEVEL 98 fi 99 exportVar ANDROID_TOOLCHAIN ${TOOLCHAIN_DIR}/${TOOLCHAIN_TYPE}/bin 100 101 # if the toolchain doesn't exist on your machine then we need to fetch it 102 if [ ! -d "$ANDROID_TOOLCHAIN" ]; then 103 # create the toolchain directory if needed 104 if [ ! -d "$TOOLCHAIN_DIR" ]; then 105 mkdir $TOOLCHAIN_DIR 106 fi 107 # enter the toolchain directory then download, unpack, and remove the tarball 108 pushd $TOOLCHAIN_DIR 109 TARBALL=ndk-r$NDK_REV-v$API_LEVEL.tgz 110 111 echo "Downloading $TARBALL ..." 112 ${SCRIPT_DIR}/download_toolchains.py http://chromium-skia-gm.commondatastorage.googleapis.com/android-toolchains/$TARBALL $TOOLCHAIN_DIR/$TARBALL 113 if [[ "$?" != "0" ]]; then 114 echo "ERROR: Unable to download toolchain $TARBALL." 115 exit 1 116 fi 117 118 echo "Untarring $TOOLCHAIN_TYPE from $TARBALL." 119 tar -xzf $TARBALL $TOOLCHAIN_TYPE 120 echo "Removing $TARBALL" 121 rm $TARBALL 122 popd 123 fi 124 125 if [ ! -d "$ANDROID_TOOLCHAIN" ]; then 126 echo "ERROR: unable to download/setup the required toolchain (${TOOLCHAIN_TYPE})" 127 return 1; 128 fi 129 130 verbose "The build is targeting NDK API level $API_LEVEL for use on Android 4.0 (NDK Revision $NDK_REV) and above" 131 132 LS="/bin/ls" # Use directly to avoid any 'ls' alias that might be defined. 133 GCC=$($LS $ANDROID_TOOLCHAIN/*-gcc | head -n1) 134 if [ -z "$GCC" ]; then 135 echo "ERROR: Could not find Android cross-compiler in: $ANDROID_TOOLCHAIN" 136 return 1 137 fi 138 139 # Remove the '-gcc' at the end to get the full toolchain prefix 140 ANDROID_TOOLCHAIN_PREFIX=${GCC%%-gcc} 141 142 if [[ -z "$ANDROID_MAKE_CCACHE" ]]; then 143 export CC="$ANDROID_TOOLCHAIN_PREFIX-gcc" 144 export CXX="$ANDROID_TOOLCHAIN_PREFIX-g++" 145 export LINK="$ANDROID_TOOLCHAIN_PREFIX-gcc" 146 else 147 export CC="$ANDROID_MAKE_CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" 148 export CXX="$ANDROID_MAKE_CCACHE $ANDROID_TOOLCHAIN_PREFIX-g++" 149 export LINK="$ANDROID_MAKE_CCACHE $ANDROID_TOOLCHAIN_PREFIX-gcc" 150 fi 151 export AR="$ANDROID_TOOLCHAIN_PREFIX-ar" 152 export RANLIB="$ANDROID_TOOLCHAIN_PREFIX-ranlib" 153 export OBJCOPY="$ANDROID_TOOLCHAIN_PREFIX-objcopy" 154 export STRIP="$ANDROID_TOOLCHAIN_PREFIX-strip" 155} 156 157# Helper function to configure the GYP defines to the appropriate values 158# based on the target device. 159setup_device() { 160 DEFINES="OS=android" 161 DEFINES="${DEFINES} host_os=$(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')" 162 DEFINES="${DEFINES} skia_os=android" 163 DEFINES="${DEFINES} android_base=${SCRIPT_DIR}/.." 164 DEFINES="${DEFINES} skia_shared_lib=1" 165 166 # Setup the build variation depending on the target device 167 TARGET_DEVICE="$1" 168 169 if [ -z "$TARGET_DEVICE" ]; then 170 if [ -f .android_config ]; then 171 TARGET_DEVICE=$(cat .android_config) 172 verbose "INFO: no target device was specified so using the device (${TARGET_DEVICE}) from the most recent build" 173 else 174 TARGET_DEVICE="arm_v7_thumb" 175 verbose "INFO: no target device type was specified so using the default '${TARGET_DEVICE}'" 176 fi 177 fi 178 179 case $TARGET_DEVICE in 180 nexus_s) 181 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 arm_version=7 arm_thumb=1" 182 DEFINES="${DEFINES} skia_resource_cache_mb_limit=24" 183 ANDROID_ARCH="arm" 184 ;; 185 nexus_4 | nexus_7 | nexus_10) 186 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 arm_version=7 arm_thumb=1" 187 ANDROID_ARCH="arm" 188 ;; 189 xoom) 190 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 arm_version=7 arm_thumb=1" 191 ANDROID_ARCH="arm" 192 ;; 193 galaxy_nexus) 194 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 arm_version=7 arm_thumb=1" 195 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 196 ANDROID_ARCH="arm" 197 ;; 198 intel_rhb) 199 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 200 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 201 ANDROID_ARCH="x86" 202 ;; 203 razr_i) 204 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 205 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 206 ANDROID_ARCH="x86" 207 ;; 208 arm_v7) 209 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 arm_version=7 arm_thumb=0" 210 ANDROID_ARCH="arm" 211 ;; 212 arm_v7_thumb | nvidia_logan) 213 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 arm_version=7 arm_thumb=1" 214 ANDROID_ARCH="arm" 215 ;; 216 arm) 217 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 arm_thumb=0" 218 ANDROID_ARCH="arm" 219 ;; 220 arm_thumb) 221 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 arm_thumb=1" 222 ANDROID_ARCH="arm" 223 ;; 224 x86) 225 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 226 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 227 ANDROID_ARCH="x86" 228 ;; 229 *) 230 echo -n "ERROR: unknown device specified ($TARGET_DEVICE), valid values: " 231 echo "nexus_[s,4,7,10] xoom galaxy_nexus razr_i arm arm_thumb arm_v7 arm_v7_thumb x86" 232 return 1; 233 ;; 234 esac 235 236 verbose "The build is targeting the device: $TARGET_DEVICE" 237 export DEVICE_ID="$TARGET_DEVICE" 238 239 # Set up the toolchain. 240 setup_toolchain 241 if [[ "$?" != "0" ]]; then 242 return 1 243 fi 244 DEFINES="${DEFINES} android_toolchain=${TOOLCHAIN_TYPE}" 245 246 exportVar GYP_DEFINES "$DEFINES $GYP_DEFINES" 247 exportVar SKIA_OUT "out/config/android-${TARGET_DEVICE}" 248} 249 250# adb_pull_if_needed(android_src, host_dst) 251adb_pull_if_needed() { 252 253 # get adb location 254 source $SCRIPT_DIR/utils/setup_adb.sh 255 256 # read input params 257 ANDROID_SRC="$1" 258 HOST_DST="$2" 259 260 if [ -d $HOST_DST ]; 261 then 262 HOST_DST="${HOST_DST}/$(basename ${ANDROID_SRC})" 263 fi 264 265 echo "HOST: $HOST_DST" 266 267 if [ -f $HOST_DST ]; 268 then 269 #get the MD5 for dst and src 270 ANDROID_MD5=`$ADB $DEVICE_SERIAL shell md5 $ANDROID_SRC` 271 if [ $(uname) == "Darwin" ]; then 272 HOST_MD5=`md5 -q $HOST_DST` 273 else 274 HOST_MD5=`md5sum $HOST_DST` 275 fi 276 277 if [ "${ANDROID_MD5:0:32}" != "${HOST_MD5:0:32}" ]; 278 then 279 $ADB $DEVICE_SERIAL pull $ANDROID_SRC $HOST_DST 280# else 281# echo "md5 match of android [$ANDROID_SRC] and host [$HOST_DST]" 282 fi 283 else 284 $ADB $DEVICE_SERIAL pull $ANDROID_SRC $HOST_DST 285 fi 286} 287 288# adb_push_if_needed(host_src, android_dst) 289adb_push_if_needed() { 290 291 # get adb location 292 source $SCRIPT_DIR/utils/setup_adb.sh 293 294 # read input params 295 HOST_SRC="$1" 296 ANDROID_DST="$2" 297 298 ANDROID_LS=`$ADB $DEVICE_SERIAL shell ls -ld $ANDROID_DST` 299 if [ "${ANDROID_LS:0:1}" == "d" ]; 300 then 301 ANDROID_DST="${ANDROID_DST}/$(basename ${HOST_SRC})" 302 fi 303 304 echo "ANDROID: $ANDROID_DST" 305 306 ANDROID_LS=`$ADB $DEVICE_SERIAL shell ls -ld $ANDROID_DST` 307 if [ "${ANDROID_LS:0:1}" == "-" ]; 308 then 309 #get the MD5 for dst and src 310 ANDROID_MD5=`$ADB $DEVICE_SERIAL shell md5 $ANDROID_DST` 311 if [ $(uname) == "Darwin" ]; then 312 HOST_MD5=`md5 -q $HOST_SRC` 313 else 314 HOST_MD5=`md5sum $HOST_SRC` 315 fi 316 317 if [ "${ANDROID_MD5:0:32}" != "${HOST_MD5:0:32}" ]; 318 then 319 $ADB $DEVICE_SERIAL push $HOST_SRC $ANDROID_DST 320# else 321# echo "md5 match of android [${ANDROID_DST}] and host [${HOST_SRC}]" 322 fi 323 else 324 $ADB $DEVICE_SERIAL push $HOST_SRC $ANDROID_DST 325 fi 326} 327 328# Set up the device. 329setup_device "${DEVICE_ID}" 330if [[ "$?" != "0" ]]; then 331 exit 1 332fi 333