1 #!/system/bin/sh 2 3 # 4 # Copyright (C) 2016 The Android Open Source Project 5 # 6 # Licensed under the Apache License, Version 2.0 (the "License"); 7 # you may not use this file except in compliance with the License. 8 # You may obtain a copy of the License at 9 # 10 # http://www.apache.org/licenses/LICENSE-2.0 11 # 12 # Unless required by applicable law or agreed to in writing, software 13 # distributed under the License is distributed on an "AS IS" BASIS, 14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 # See the License for the specific language governing permissions and 16 # limitations under the License. 17 # 18 19 # This script will run as a postinstall step to drive otapreopt. 20 21 TARGET_SLOT="$1" 22 STATUS_FD="$2" 23 24 # Maximum number of packages/steps. 25 MAXIMUM_PACKAGES=1000 26 27 # First ensure the system is booted. This is to work around issues when cmd would 28 # infinitely loop trying to get a service manager (which will never come up in that 29 # mode). b/30797145 30 BOOT_PROPERTY_NAME="dev.bootcomplete" 31 32 BOOT_COMPLETE=$(getprop $BOOT_PROPERTY_NAME) 33 if [ "$BOOT_COMPLETE" != "1" ] ; then 34 echo "Error: boot-complete not detected." 35 # We must return 0 to not block sideload. 36 exit 0 37 fi 38 39 40 # Compute target slot suffix. 41 # TODO: Once bootctl is not restricted, we should query from there. Or get this from 42 # update_engine as a parameter. 43 if [ "$TARGET_SLOT" = "0" ] ; then 44 TARGET_SLOT_SUFFIX="_a" 45 elif [ "$TARGET_SLOT" = "1" ] ; then 46 TARGET_SLOT_SUFFIX="_b" 47 else 48 echo "Unknown target slot $TARGET_SLOT" 49 exit 1 50 fi 51 52 53 PREPARE=$(cmd otadexopt prepare) 54 # Note: Ignore preparation failures. Step and done will fail and exit this. 55 # This is necessary to support suspends - the OTA service will keep 56 # the state around for us. 57 58 PROGRESS=$(cmd otadexopt progress) 59 print -u${STATUS_FD} "global_progress $PROGRESS" 60 61 i=0 62 while ((i<MAXIMUM_PACKAGES)) ; do 63 DEXOPT_PARAMS=$(cmd otadexopt next) 64 65 /system/bin/otapreopt_chroot $STATUS_FD $TARGET_SLOT_SUFFIX $DEXOPT_PARAMS >&- 2>&- 66 67 PROGRESS=$(cmd otadexopt progress) 68 print -u${STATUS_FD} "global_progress $PROGRESS" 69 70 DONE=$(cmd otadexopt done) 71 if [ "$DONE" = "OTA incomplete." ] ; then 72 sleep 1 73 i=$((i+1)) 74 continue 75 fi 76 break 77 done 78 79 DONE=$(cmd otadexopt done) 80 if [ "$DONE" = "OTA incomplete." ] ; then 81 echo "Incomplete." 82 else 83 echo "Complete or error." 84 fi 85 86 print -u${STATUS_FD} "global_progress 1.0" 87 cmd otadexopt cleanup 88 89 exit 0 90