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