1 #!/bin/bash 2 3 adb="adb" 4 if [[ $# -gt 0 ]]; then 5 adb="adb $*" # for setting -e, -d or -s <serial> 6 fi 7 8 function atexit() 9 { 10 local retval=$? 11 12 if [[ $retval -eq 0 ]]; then 13 rm $log 14 else 15 echo "There were errors, please check log at $log" 16 fi 17 } 18 19 log=$(mktemp) 20 trap "atexit" EXIT 21 22 function compile_module() 23 { 24 local android_mk="$1" 25 26 echo "Compiling .${android_mk:${#PWD}}" 27 ONE_SHOT_MAKEFILE="$android_mk" make -C "../../../../../" files | tee -a $log 28 if [[ ${PIPESTATUS[0]} -ne 0 ]]; then 29 exit 1 30 fi 31 } 32 33 function wait_for_boot_completed() 34 { 35 echo "Rebooting device" 36 $adb wait-for-device logcat -c 37 $adb wait-for-device logcat | grep -m 1 -e 'PowerManagerService.*bootCompleted' >/dev/null 38 } 39 40 function mkdir_if_needed() 41 { 42 local path="$1" 43 44 if [[ "${path:0:1}" != "/" ]]; then 45 echo "mkdir_if_needed: error: path '$path' does not begin with /" | tee -a $log 46 exit 1 47 fi 48 49 local basename=$(basename "$path") 50 local dirname=$(dirname "$path") 51 local t=$($adb shell ls -l $dirname | tr -d '\r' | grep -e "${basename}$" | grep -oe '^.') 52 53 case "$t" in 54 d) # File exists, and is a directory ... 55 # do nothing 56 ;; 57 l) # ... (or symbolic link possibly to a directory). 58 # do nothing 59 ;; 60 "") # File does not exist. 61 mkdir_if_needed "$dirname" 62 $adb shell mkdir "$path" 63 ;; 64 *) # File exists, but is not a directory. 65 echo "mkdir_if_needed: file '$path' exists, but is not a directory" | tee -a $log 66 exit 1 67 ;; 68 esac 69 } 70 71 function disable_overlay() 72 { 73 echo "Disabling overlay" 74 $adb shell rm /vendor/overlay/framework/framework-res.apk 75 $adb shell rm /data/resource-cache/vendor@overlay@framework@framework-res.apk@idmap 76 } 77 78 function enable_overlay() 79 { 80 echo "Enabling overlay" 81 mkdir_if_needed "/system/vendor" 82 mkdir_if_needed "/vendor/overlay/framework" 83 $adb shell ln -s /data/app/com.android.overlaytest.overlay.apk /vendor/overlay/framework/framework-res.apk 84 } 85 86 function instrument() 87 { 88 local class="$1" 89 90 echo "Instrumenting $class" 91 $adb shell am instrument -w -e class $class com.android.overlaytest/android.test.InstrumentationTestRunner | tee -a $log 92 } 93 94 function remount() 95 { 96 echo "Remounting file system writable" 97 $adb remount | tee -a $log 98 } 99 100 function sync() 101 { 102 echo "Syncing to device" 103 $adb sync data | tee -a $log 104 } 105 106 # some commands require write access, remount once and for all 107 remount 108 109 # build and sync 110 compile_module "$PWD/OverlayTest/Android.mk" 111 compile_module "$PWD/OverlayTestOverlay/Android.mk" 112 sync 113 114 # instrument test (without overlay) 115 $adb shell stop 116 disable_overlay 117 $adb shell start 118 wait_for_boot_completed 119 instrument "com.android.overlaytest.WithoutOverlayTest" 120 121 # instrument test (with overlay) 122 $adb shell stop 123 enable_overlay 124 $adb shell start 125 wait_for_boot_completed 126 instrument "com.android.overlaytest.WithOverlayTest" 127 128 # cleanup 129 exit $(grep -c -e '^FAILURES' $log) 130