Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/auto_patcher b/auto_patcher
- index eb3a8c4..58358e8 100755
- --- a/auto_patcher
- +++ b/auto_patcher
- @@ -148,15 +148,16 @@
- # 2013.08.07. (v3.0.0) Support for Android-4.3 (Opendproid only- CM and AOSP).
- # 2013.08.09. (v3.0.1) Build date and patch date matching for multiple mods- all mods will now use best available match.
- # 2013.08.12. (v3.0.2) OpD support for Evervolv, PACman and PA and CM10 returns
- +# 2013.08.12. (v3.1.0) The big switch to SMALI.patch instead of JAR.patch. It begins...
- # SHELL PROGRAMMING NOTES:
- # [ -s FILE ]
- # [[ -n STRING ]] or [[ -z STRING ]]
- -VERSION="v3.0.21"
- +VERSION="v3.1.0"
- # PATCHES_VERSION needs to be incremented every time ANY changes occur to patches.
- -PATCHES_VERSION="20130814"
- +PATCHES_VERSION="20130827"
- CURRENT_ANDROID="4.3.0"
- # pass variables to children
- @@ -453,6 +454,7 @@ copy_prepatched_provisional () {
- prep_alternate_patch () {
- # Use alt.patch, if exists. Increment in case there are multiple alternates.
- + # DEPRECATED as of the upcoming 3.1.0
- mv -v $ALTERNATIVE_PATCH $PARB/${NAME}.patch >> "$LOG"
- ALT_PATCH_NUMBER=$(($ALT_PATCH_NUMBER + 1))
- @@ -513,7 +515,7 @@ establish_repo() {
- if ($NETWORK); then
- mv -v auto-patcher/".git" . >> "$LOG"
- rm -rf auto-patcher
- - git checkout -q master || auto_update_error
- + git checkout -q 3.1 || auto_update_error
- git reset --hard 2>&1 >> "$LOG"
- echo ""
- fi
- @@ -1246,7 +1248,7 @@ if [[ "$AUTO_UPDATE" == true ]] && [[ "$GIT" == true ]]; then
- if !("$NETWORK"); then
- printtask "Updater: not able to run auto_update."
- else
- - COMMITS_BEHIND=$(git rev-list HEAD..origin/master --count)
- + COMMITS_BEHIND=$(git rev-list HEAD..origin/3.1 --count)
- case "$COMMITS_BEHIND" in
- 0)
- printtask "Updater: Auto-Patcher is already up to date"
- @@ -1256,7 +1258,7 @@ if [[ "$AUTO_UPDATE" == true ]] && [[ "$GIT" == true ]]; then
- printtask "... Updater: update found ..."
- backup_script
- printtask "... Updating Auto-Patcher ..."
- - git merge --no-edit origin/master 2>&1 >> "$LOG" || auto_update_error
- + git merge --no-edit origin/3.1 2>&1 >> "$LOG" || auto_update_error
- export_log_and_variables
- printtask "### updated, now rerunning script with latest version ###"
- $0 "$@"
- @@ -1729,13 +1731,66 @@ for ((i=0; i < ${#PID[@]}; i++)); do
- echo "### jar patch $P/$A/$R/$B ###" >> "$LOG"
- # Iterate through jars and patch. If fails, try prepatched provisionals or look for alternative patch.
- +
- +context_editor (){
- + # This was originally planned to remove some unsused CM ContextImpl patches..but now it exists to force
- + # efficacy if CM patches are forced on an AOSP-based rom, or AOSP patches on a CM-based.
- +
- + # Counts the number of ContextImpl patches in the decompiled jar. Easy enough.
- + CONTEXT_FILES=(tmp/system/framework/framework.jar.out/smali/android/app/ContextImpl*)
- + if ( [ ${#CONTEXT_FILES[@]} == 48 ] ); then
- + # Indicates CM-based roms (PACman, CM)
- + print_to_log "CM-based ContextImpl matching implemented"
- + ROM_BASE=cm
- + elif ( [ ${#CONTEXT_FILES[@]} == 44 ] ); then
- + # Indicates AOSP-based roms (PA, AOSP, Slim, AOKP(?))
- + print_to_log "AOSP-based ContextImpl matching implemented"
- + ROM_BASE=aosp
- + else
- + # Alerts us we need to expand the model, but leaves QUEUES alone for now
- + print_to_log "There are ${#CONTEXT_FILES[@]} context files in this rom"
- + ROM_BASE=$RID
- + fi
- +
- + # Remove the, unlikely but possibly, mismatched ContextImpl patches from all Queues
- + FAILED_PATCH_QUEUE=( ${FAILED_PATCH_QUEUE[@]//*'ContextImpl'*} )
- + PATCH_QUEUE=( ${PATCH_QUEUE[@]//*'ContextImpl'*} )
- +
- + # Add the proper ContextImpl patches to the PATCH_QUEUE
- + PATCH_QUEUE+=(patches/$P/$A/$ROM_BASE/latest/*'ContextImpl'*.patch)
- +}
- +
- +patch_matcher () {
- + FAILED_FILE=${FAILED_PATCH##*/} # strip path from file
- + MATCHED_FILE=${FAILED_FILE##*_} # strip headers from file name (e.g.returns 'SipPhone.patch')
- + POSSIBLE_MATCHES=$( find patches/$P/$ANDR -name "*$MATCHED_FILE*" )
- +
- + # Somewhere here we need to test for empty and test for too large (100?) #TODO IMPORTANT!
- +
- + # MATCH_SUCCESS is solely used to provide a fail message to log. Is there another way?
- + MATCH_SUCCESS=false
- + for p in $POSSIBLE_MATCHES; do
- + rm -rf ${JAR}.log # needs to be cleared (AND moved to a useful function)
- + if ($PATCH_BINARY --dry-run -Nls -p1 -d tmp/${FILE}.out < $p 2>&1 >> ${JAR}.log ); then
- + # This below is temporary debug logging.
- + print_to_log "Succesful match found! Swapping $FAILED_PATCH for $p!!"
- + PATCH_QUEUE=( ${PATCH_QUEUE[@]//$FAILED_PATCH} )
- + PATCH_QUEUE+=( "$p" )
- + FAILED_PATCH_QUEUE=( ${FAILED_PATCH_QUEUE[@]//$FAILED_PATCH} )
- + MATCH_SUCCESS=true
- + break
- + fi
- + done
- + [ $MATCH_SUCCESS == true ] || print_to_log "We did not find a working patch for $p...looking for other solutions!"
- +}
- +
- for (( current_jar=0; current_jar < ${#JARS[@]}; current_jar++)); do
- FILE=${JARS[$current_jar]}
- JAR=${FILE##*/}
- if [[ $FILE == *".jar" ]]; then # allows for *.apks to be decompiled by baksmali
- NAME=${JAR%.jar}
- else
- - # check for abscense of any apks decompiled by baksmali (~* in files.txt). Missing jars will still error
- + # check for abscense of any apks decompiled by baksmali (~* in files.txt). Missing jar will still error
- if [ ! -d "tmp/${FILE}.out" ] ; then
- echo "No $JAR in your ROM. Not able to patch this file."
- echo "## No $JAR in ROM ###" >> "$LOG"
- @@ -1744,52 +1799,66 @@ for ((i=0; i < ${#PID[@]}; i++)); do
- fi
- NAME=$JAR # TODO: Maybe rename this, since it now encompases apks at times
- fi
- +
- printtask "... apply $NAME.patch ..."
- - # use globbing for the whole bit.
- - echo "name is $NAME" #debug
- - echo "full jar_patches is patches{/$P/$A/$R/$B/$NAME}"
- - declare -a JAR_PATCH=("patches/$P/$A/$R/$B/$NAME"_*patch)
- - echo "JAR_PATCH is ${JAR_PATCH[@]}" #debug
- - [ -f "patches/$P/$A/$R/$B/$NAME"-* ] && echo "DEBUGBUDEBUDE" && declare -a INCREMENTAL="patches/$P/$A/$R/$B/$NAME"-*
- - echo "incremental is ${INCREMENTAL[@]}"
- - declare -a FAILED_PATCH_QUEUE
- - declare -a PATCH_QUEUE=(${JAR_PATCH[@]} ${INCREMENTAL[@]})
- - # add preloaded to PATCH_QUEUE ### I think we can rename to framework_preloaded.patch
- - for ((k=0;k < ${#PATCH_QUEUE[@]}; k++)) do
- - echo "DEBUG *** Applying ${PATCH_QUEUE[$k]} ***"
- - # let's use dry-run until we build a completely succesful patch queue.
- - $PATCH_BINARY --dry-run -Nls -p1 -d tmp/${FILE}.out < ${PATCH_QUEUE[$k]} #2>&1 >> ${JAR}.log || FAILED_PATCH_QUEUE=( ${FAILED_PATCH_QUEUE[@]/$PATCH_QUEUE[$k]/} )
- - echo "DEBUG *** ${FAILED_PATCH_QUEUE[@]}"
- - done
- - # Lets note, FAILS is the name of the patch's name + target, so match from the patch.
- - # unset FAILS # still needed? Test
- - # also need to test if FAILS is set to usable output after changes.
- - FAILS=($(grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'))
- - for ff in ${FAILS[@]}; do echo $ff; done # debug
- - # patch_matcher needs to determine which unique string is in the failed patch
- +
- + # In a test, this failed when retitled framework_00_preloaded.patch and added to QUEUE. But why?
- + if ( [[ "$NAME" == "framework" ]] && [ -f $PARB/preloaded.patch ] ); then
- + printtask "... apply preloaded.patch ..."
- + $PATCH_BINARY -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
- + [[ $(grep FAILED preloaded.log) != "" ]] && print_error "failed preloaded.patch"
- + fi
- +
- +
- + declare -a PATCH_QUEUE=("patches/$P/$A/$R/$B/$NAME"_*patch)
- + [ -f "patches/$P/$A/$R/$B/$NAME"-* ] && declare -a INCREMENTAL=( "patches/$P/$A/$R/$B/$NAME"-* )
- + declare -a FAILED_PATCH_QUEUE
- + rm -rf {JAR}.log # Needed since we append the patch output now
- +
- + for ((k=0;k < ${#PATCH_QUEUE[@]}; k++)) do
- + # dry-run until we build a completely succesful patch queue. Add $k to FAILED upon failure
- + $PATCH_BINARY --dry-run -Nls -p1 -d tmp/${FILE}.out < ${PATCH_QUEUE[$k]} 2>&1 >> ${JAR}.log || FAILED_PATCH_QUEUE+=( ${PATCH_QUEUE[$k]} )
- + done
- +
- + FAILS=($(grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'))
- + [[ -n ${FAILED_PATCH_QUEUE[@]} ]] && [[ "$NAME" == "framework" ]] && context_editor
- + for FAILED_PATCH in ${FAILED_PATCH_QUEUE[@]}; do
- + patch_matcher
- + done
- + if [[ -n ${FAILED_PATCH_QUEUE[@]} ]]; then # while ?
- for FAILED_PATCH in ${FAILED_PATCH_QUEUE[@]}; do
- - patch_matcher || printerror "No patches for $FAILED_PATCH! Please upload the autopatcher log and a link to your rom!"
- - done
- - ALT_PATCH_NUMBER=2
- - if [[ -n ${FAILED_PATCH_QUEUE[@]} ]]; then
- - for FAILED_PATCH in ${FAILED_PATCH_QUEUE[@]}; do
- - PROVISIONAL="patches/$P/$ANDR/.provisionals/${FILE}.out/smali/${FAILED_PATCH}"
- - ALTERNATIVE_PATCH=$(ls $PARB/${NAME}*.patch$ALT_PATCH_NUMBER 2>/dev/null)
- - if [ ! -f "$PROVISIONAL" ]; then
- - if [ -f "$ALTERNATIVE_PATCH" ]; then
- - printtask "## trying alternative ${NAME} patch #$ALT_PATCH_NUMBER ###"
- - prep_alternate_patch
- - else
- - print_error "failed $FAILED_PATCH in $JAR cannot be remedied"
- - fi
- - else
- - echo "!!! patch error for $FAILED_PATCH !!!" >> "$LOG"
- - [[ ${SID[@]} =~ $FAILED_PATCH ]] && print_error "$FAILED_PATCH was already replaced before"
- - copy_prepatched_provisional
- - fi
- + # Mostly unartful workarounds so we can manipulate either the patch in FAIL or the FILE
- +
- + FAILED_FILE=${FAILED_PATCH##*/} #strip path from file
- + MATCHED_FILE=${FAILED_FILE##*_} #strip headers from file name
- +
- + # MATCH_PATTERN includes period (e.g. 'FILE.') to avoid globbing extra files (e.g.FILE$2)
- + MATCH_PATTERN=${MATCHED_FILE%patch}
- +
- + for ITEM in ${FAILS[@]}; do
- + [[ "$ITEM" =~ "${MATCH_PATTERN}" ]] && FAIL=$ITEM && break
- done
- - fi
- - rm -rf ${JAR}.log # needs to be cleared!
- +
- + PROVISIONAL="patches/$P/$ANDR/.provisionals/${FILE}.out/smali/${FAIL}"
- + if [ ! -f "$PROVISIONAL" ]; then
- + print_error $MATCH_PATTERN"patch in $JAR cannot be remedied"
- + else
- + print_to_log "!!! patch error for $FAIL !!!"
- + [[ ${SID[@]} =~ $MATCHED_FILE ]] && print_error "$MATCHED_FILE was already replaced before"
- + copy_prepatched_provisional
- + patch_matcher
- + # this includes the period (e.g. 'Instrumentation.') so it does not pick up extra files (e.g. Instrumentation$2
- + fi
- + done
- + fi
- + rm -rf ${JAR}.log # needs to be cleared and for the same reason as above
- +
- + # Actual application of patches occurs here!
- + for ((k=0;k < ${#PATCH_QUEUE[@]}; k++)) do
- + print_to_log " ...applying ${PATCH_QUEUE[$k]} ..."
- + $PATCH_BINARY -Nls -p1 -d tmp/${FILE}.out < ${PATCH_QUEUE[$k]} 2>&1 >> ${JAR}.log
- + done
- + # Incremental--use patch_matcher? (how, b/c dry-run...should INCREMENTAL be optional (or fail-possible?
- [[ $(grep FAILED ${JAR}.log) != "" ]] && print_error "failed $NAME.patch"
- garbage tmp/${FILE}.out
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement