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