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