1 #!/bin/bash 2 # 3 # android_setup.sh: Sets environment variables used by other Android scripts. 4 5 # Fail-fast if anything in the script fails. 6 set -e 7 8 BUILDTYPE=${BUILDTYPE-Debug} 9 10 while (( "$#" )); do 11 if [[ "$1" == "-d" ]]; then 12 DEVICE_ID=$2 13 shift 14 elif [[ "$1" == "-i" || "$1" == "--resourcePath" ]]; then 15 RESOURCE_PATH=$2 16 APP_ARGS=("${APP_ARGS[@]}" "${1}" "${2}") 17 shift 18 elif [[ "$1" == "-s" ]]; then 19 DEVICE_SERIAL="-s $2" 20 shift 21 elif [[ "$1" == "-t" ]]; then 22 BUILDTYPE=$2 23 shift 24 elif [[ "$1" == "--release" ]]; then 25 BUILDTYPE=Release 26 else 27 APP_ARGS=("${APP_ARGS[@]}" "${1}") 28 fi 29 shift 30 done 31 32 function verbose { 33 if [[ -n $VERBOSE ]]; then 34 echo $@ 35 fi 36 } 37 38 function exportVar { 39 NAME=$1 40 VALUE=$2 41 verbose export $NAME=\"$VALUE\" 42 export $NAME="$VALUE" 43 } 44 45 function absPath { 46 (cd $1; pwd) 47 } 48 49 SCRIPT_DIR=$(absPath "$(dirname "$BASH_SOURCE[0]}")") 50 51 if [ -z "$ANDROID_SDK_ROOT" ]; then 52 if ANDROID_SDK_ROOT="$(dirname $(which android))/.."; then 53 exportVar ANDROID_SDK_ROOT $ANDROID_SDK_ROOT 54 else 55 echo "No ANDROID_SDK_ROOT set and can't auto detect it from location of android binary." 56 exit 1 57 fi 58 fi 59 60 # check to see that gclient sync ran successfully 61 THIRD_PARTY_EXTERNAL_DIR=${SCRIPT_DIR}/../third_party/externals 62 if [ ! -d "$THIRD_PARTY_EXTERNAL_DIR" ]; then 63 echo "" 64 echo "ERROR: Unable to find the required third_party dependencies needed to build." 65 echo " To fix this add the following line to your .gclient file and run 'gclient sync'" 66 echo " target_os = ['android']" 67 echo "" 68 exit 1; 69 fi 70 71 # Helper function to configure the GYP defines to the appropriate values 72 # based on the target device. 73 setup_device() { 74 DEFINES="OS=android" 75 DEFINES="${DEFINES} host_os=$(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')" 76 DEFINES="${DEFINES} skia_os=android" 77 DEFINES="${DEFINES} android_base=$(absPath ${SCRIPT_DIR}/..)" 78 if [[ "$GYP_DEFINES" != *skia_shared_lib=* ]]; then 79 DEFINES="${DEFINES} skia_shared_lib=1" 80 fi 81 82 # Setup the build variation depending on the target device 83 TARGET_DEVICE="$1" 84 85 if [ -z "$TARGET_DEVICE" ]; then 86 if [ -f .android_config ]; then 87 TARGET_DEVICE=$(cat .android_config) 88 verbose "no target device (-d), using ${TARGET_DEVICE} from most recent build" 89 else 90 TARGET_DEVICE="arm_v7_thumb" 91 verbose "no target device (-d), using ${TARGET_DEVICE}" 92 fi 93 fi 94 95 case $TARGET_DEVICE in 96 nexus_s) 97 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 arm_version=7 arm_thumb=1" 98 DEFINES="${DEFINES} skia_resource_cache_mb_limit=24" 99 ANDROID_ARCH="arm" 100 ;; 101 nexus_4 | nexus_7 | nexus_10) 102 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 arm_version=7 arm_thumb=1" 103 ANDROID_ARCH="arm" 104 ;; 105 xoom) 106 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 arm_version=7 arm_thumb=1" 107 ANDROID_ARCH="arm" 108 ;; 109 galaxy_nexus) 110 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=1 arm_version=7 arm_thumb=1" 111 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 112 ANDROID_ARCH="arm" 113 ;; 114 intel_rhb | razr_i) 115 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 116 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 117 ANDROID_ARCH="x86" 118 ;; 119 x86) 120 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=32" 121 ANDROID_ARCH="x86" 122 ;; 123 x86_64 | x64) 124 DEFINES="${DEFINES} skia_arch_type=x86 skia_arch_width=64" 125 ANDROID_ARCH="x86_64" 126 ;; 127 arm_v7) 128 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 arm_version=7 arm_thumb=0" 129 ANDROID_ARCH="arm" 130 ;; 131 arm_v7_thumb | nvidia_logan | nexus_5) 132 DEFINES="${DEFINES} skia_arch_type=arm arm_neon_optional=1 arm_version=7 arm_thumb=1" 133 ANDROID_ARCH="arm" 134 ;; 135 arm) 136 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 arm_thumb=0" 137 ANDROID_ARCH="arm" 138 ;; 139 arm_thumb) 140 DEFINES="${DEFINES} skia_arch_type=arm arm_neon=0 arm_thumb=1" 141 ANDROID_ARCH="arm" 142 ;; 143 arm64) 144 DEFINES="${DEFINES} skia_arch_type=arm64 skia_arch_width=64" 145 ANDROID_ARCH="arm64" 146 ;; 147 mips) 148 DEFINES="${DEFINES} skia_arch_type=mips skia_arch_width=32" 149 DEFINES="${DEFINES} skia_resource_cache_mb_limit=32" 150 ANDROID_ARCH="mips" 151 ;; 152 mips_dsp2) 153 DEFINES="${DEFINES} skia_arch_type=mips skia_arch_width=32" 154 DEFINES="${DEFINES} mips_arch_variant=mips32r2 mips_dsp=2" 155 ANDROID_ARCH="mips" 156 ;; 157 mips64) 158 DEFINES="${DEFINES} skia_arch_type=mips skia_arch_width=64" 159 ANDROID_ARCH="mips64" 160 ;; 161 *) 162 if [ -z "$ANDROID_IGNORE_UNKNOWN_DEVICE" ]; then 163 echo "ERROR: unknown device $TARGET_DEVICE" 164 exit 1 165 fi 166 # If ANDROID_IGNORE_UNKNOWN_DEVICE is set, then ANDROID_TOOLCHAIN 167 # or ANDROID_ARCH should be set; Otherwise, ANDROID_ARCH 168 # defaults to 'arm' and the default ARM toolchain is used. 169 DEFINES="${DEFINES} skia_arch_type=${ANDROID_ARCH-arm}" 170 # If ANDROID_IGNORE_UNKNOWN_DEVICE is set, extra gyp defines can be 171 # added via ANDROID_GYP_DEFINES 172 DEFINES="${DEFINES} ${ANDROID_GYP_DEFINES}" 173 ;; 174 esac 175 176 verbose "The build is targeting the device: $TARGET_DEVICE" 177 exportVar DEVICE_ID $TARGET_DEVICE 178 179 # setup the appropriate cross compiling toolchains 180 source $SCRIPT_DIR/utils/setup_toolchain.sh 181 182 DEFINES="${DEFINES} android_toolchain=${TOOLCHAIN_TYPE}" 183 exportVar GYP_DEFINES "$DEFINES $GYP_DEFINES" 184 185 SKIA_SRC_DIR=$(cd "${SCRIPT_DIR}/../../.."; pwd) 186 DEFAULT_SKIA_OUT="${SKIA_SRC_DIR}/out/config/android-${TARGET_DEVICE}" 187 exportVar SKIA_OUT "${SKIA_OUT:-${DEFAULT_SKIA_OUT}}" 188 } 189 190 # adb_pull_if_needed(android_src, host_dst) 191 adb_pull_if_needed() { 192 193 # get adb location 194 source $SCRIPT_DIR/utils/setup_adb.sh 195 196 # read input params 197 ANDROID_SRC="$1" 198 HOST_DST="$2" 199 200 if [ -f $HOST_DST ]; 201 then 202 #get the MD5 for dst and src 203 ANDROID_MD5=`$ADB $DEVICE_SERIAL shell md5 $ANDROID_SRC` 204 if [ $(uname) == "Darwin" ]; then 205 HOST_MD5=`md5 -q $HOST_DST` 206 else 207 HOST_MD5=`md5sum $HOST_DST` 208 fi 209 210 if [ "${ANDROID_MD5:0:32}" != "${HOST_MD5:0:32}" ]; then 211 echo -n "$HOST_DST " 212 $ADB $DEVICE_SERIAL pull $ANDROID_SRC $HOST_DST 213 fi 214 else 215 echo -n "$HOST_DST " 216 $ADB $DEVICE_SERIAL pull $ANDROID_SRC $HOST_DST 217 fi 218 } 219 220 # adb_push_if_needed(host_src, android_dst) 221 adb_push_if_needed() { 222 223 # get adb location 224 source $SCRIPT_DIR/utils/setup_adb.sh 225 226 # read input params 227 local HOST_SRC="$1" 228 local ANDROID_DST="$2" 229 230 ANDROID_LS=`$ADB $DEVICE_SERIAL shell ls -ld $ANDROID_DST` 231 HOST_LS=`ls -ld $HOST_SRC` 232 if [ "${ANDROID_LS:0:1}" == "d" -a "${HOST_LS:0:1}" == "-" ]; 233 then 234 ANDROID_DST="${ANDROID_DST}/$(basename ${HOST_SRC})" 235 fi 236 237 238 ANDROID_LS=`$ADB $DEVICE_SERIAL shell ls -ld $ANDROID_DST` 239 if [ "${ANDROID_LS:0:1}" == "-" ]; then 240 #get the MD5 for dst and src 241 ANDROID_MD5=`$ADB $DEVICE_SERIAL shell md5 $ANDROID_DST` 242 if [ $(uname) == "Darwin" ]; then 243 HOST_MD5=`md5 -q $HOST_SRC` 244 else 245 HOST_MD5=`md5sum $HOST_SRC` 246 fi 247 248 if [ "${ANDROID_MD5:0:32}" != "${HOST_MD5:0:32}" ]; then 249 echo -n "$ANDROID_DST " 250 $ADB $DEVICE_SERIAL push $HOST_SRC $ANDROID_DST 251 fi 252 elif [ "${ANDROID_LS:0:1}" == "d" ]; then 253 for FILE_ITEM in `ls $HOST_SRC`; do 254 adb_push_if_needed "${HOST_SRC}/${FILE_ITEM}" "${ANDROID_DST}/${FILE_ITEM}" 255 done 256 else 257 HOST_LS=`ls -ld $HOST_SRC` 258 if [ "${HOST_LS:0:1}" == "d" ]; then 259 $ADB $DEVICE_SERIAL shell mkdir -p $ANDROID_DST 260 adb_push_if_needed $HOST_SRC $ANDROID_DST 261 else 262 echo -n "$ANDROID_DST " 263 $ADB $DEVICE_SERIAL shell mkdir -p "$(dirname "$ANDROID_DST")" 264 $ADB $DEVICE_SERIAL push $HOST_SRC $ANDROID_DST 265 fi 266 fi 267 } 268 269 setup_device "${DEVICE_ID}" 270