Versioning update to 2.1.0
[auto-patcher.git] / auto_patcher
blob200ce18eca1812eb17b01e531b55e080c624d1d8
1 #!/bin/bash
3 # version: beta v2.1.0, patches 2012.09.13.
5 # PDroid created by svyat. Official PDroid thread is
6 # http://forum.xda-developers.com/showthread.php?t=1357056
8 # The Auto-Patcher created by pastime1971 and mateorod
9 # Thread and support for the Auto-Patcher can be found at
10 # http://forum.xda-developers.com/showthread.php?p=27589651#post27589651
12 # ChangeLog
13 # 2012.05.00. (v0.1)
14 # ...........
15 # 2012.05.12. (v0.2) allows user to specify a different version of patches
16 # 2012.05.13. (v0.3.0) force "patch -N", remove temp upon failure, generate log output
17 # 2012.05.13. (v0.3.1) revised the generation of updater-script (SGS2)
18 # 2012.05.15. added AOSP patches
19 # 2012.05.15. added crespo-aosp patches, added device-specific patching if patch exists
20 # 2012.05.15. remove restore.zip upon failure
21 # 2012.05.15. (v0.4.1) added CM7 (GB) patches
22 # 2012.05.18. (v0.4.2) added checking for tool commands
23 # 2012.05.21. (v0.4.3) apply device-specific patche only when it is specified
24 # 2012.05.26. added task title to log
25 # 2012.05.31. (v0.4.4) CM9 patches updated, crespo-aosp added
26 # 2012.06.04. (v0.4.5) added checking tools and rom, added aroma installer support, add patch outputs reroute
27 # 2012.06.15. CM9 patches updated
28 # 2012.06.16. (v0.4.6) AOKP patches updated, patch versions restructured
29 # 2012.06.17. (v0.5.0) patcher script reorganized, removed build.prop
30 # 2012.06.17. (v0.6.0) auto patcher script for pdroid and v6 patches
31 # 2012.06.19. (v0.6.1) add patches for CM7.2 Final
32 # 2012.06.20. (v0.6.2) updated CM 7.2 patches
33 # 2012.06.23. (v0.6.3) fix symlinks
34 # 2012.06.26. (v0.6.4) added 0618 patches for cm7 nightlies; removed 0619 cm7.2 final
35 # 2012.06.27. (v0.6.5) added new CM9 patches (20120626)
36 # 2012.06.27. (v0.6.6) added CM7 nightly patches (20120625) (finally!)
37 # 2012.07.02. (v0.7.0) Redid AOSP/AOKP; add Windows support (using Cygwin). Thanks kobik77!
38 # 2012.07.06. (v0.7.1) updated CM9 patches (20120706)
39 # 2012.07.08. (v0.7.2) updated AOKP (20120707) and CM9 (20120708) pdroid patches
40 # 2012.07.11. (v1.0.0) reworked script works on Linux, Mac OSX, and Windows (on Cygwin);
41 # added new ICS/JellyBean support for the new V6-Supercharger
42 # 2012.07.18. (v1.0.1) new CM7/CM9 Pdroid patches (20120718)
43 # 2012.07.23. (v1.0.2) updated CM9 patches (20120723)
44 # 2012.07.23. (v1.0.3) updated CM9 patches (20120724)
45 # 2012.08.06. (v1.5.0) updated smali/baksmali binaries to 1.33
46 # 2012.08.06. Added Pdroid/V6supercharger support for CM10 Jellybean!
47 # 2012.08.06. Improved PDroid stability and efficiency (Thanks CollegeDev)
48 # 2012.08.06. (v1.6.0) added aokp-jb patches for pdroid/v6supercharger, script update
49 # 2012.08.17. (v1.9.5) Added support for pdroid_addon, by CollegeDev.
50 # Added insecure boot.img mod
51 # Added support for aosp-jb (This needs testing, and may not be
52 # a wide patch due to large variation between AOSP roms.
53 # -Please report all experiences!
54 # Updated all v6supercharger patches w/new edits to ProcessList
55 # Major script overhaul in preparation for additional mods!
56 # 2012.08.20. (1.9.6) Conditional support for Official cm10 and aokp-jb builds
57 # 2012.08.23. (1.9.7) Final/confirmed pdroid support for Official CM10 and AOKP-JB
58 # 2012.09.04 (1.9.8) Bundled cygwin-compatible tools (original was corrupt).
59 # For Cygwin, replaced h2b function with simple bash math
60 # conversion (req'd for compat w/ Cygwin tools).
61 # 2012.08.26. (2.0.0) Added .apk patching
62 # Added 3G Dongle support for Nexus 7
63 # TabletUI support for Nexus 7 (maybe more)
64 # Google Voice support for Nexus 7
65 # mods are 3gdongle, tabletUI, voice, or nexus7suite (for all)
66 # Added provisional file copy menu to widen patching base
68 # 2012.09.11. (2.0.1) Cygwin support fixes
69 # 2012.09.11. (2.0.2) Bugfix for 3gdongle (all)
70 # 2012.09.16. (2.1.0) Significant restructuring of core operations; added edit text file
71 # fix for "method-cap" errors in pdroid.
73 # SHELL PROGRAMMING NOTES:
74 # [ -s FILE ]
75 # [[ -n STRING ]] or [[ -z STRING ]]
77 echo " "
78 echo "The Auto-Patcher v2.1.0"
79 echo " "
80 # by pastime1971 and mateorod
83 # pass variables to children
84 set -a
86 # function for converting hex to binary- for testing
87 #function h2b { echo "obase=2; ibase=16; $( echo "$*" | sed -e 's/0x//g' -e 's/\([a-z]\)/\u\1/g' )" | bc; }
89 printusage () {
90 echo "smali auto patcher v2.1.0"
91 echo " pdroid 1.32 patches 2012.09.13."
92 echo " v6supercharger patches 2012.08.17."
93 echo ""
94 echo "usage: $0 ROM.ZIP MODS [ROMTYPE] [PATCHDATE]"
95 echo ""
96 echo "MODS can be pdroid,v6supercharger or pdroid or v6supercharger"
97 echo "optional [ROMTYPE] can be cm9, aokp, etc."
98 echo "optional [PATCHDATE] can be specified to use older patch versions."
99 echo "try \"$0 ROM.ZIP -h\" to see what is available"
100 echo ""
101 exit
104 debug () {
105 echo "! please refer to $LOG for any debugging"
106 echo ""
107 echo "! patching failed."
108 echo "! it may be possible to patch $ROM using other patch version"
109 echo ""
110 [ -d "$TEMP" ] && \rm -rf "$TEMP"
111 printusage
114 printerror () {
115 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
116 echo "!!! error:" $@
117 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
118 echo ""
119 debug
122 printtask () {
123 echo "" >> "$LOG"
124 echo $@ | tee -a "$LOG"
127 copyfailed () {
128 echo ""
129 echo "These are the files for which patching failed:"
130 echo "---------------------------------------------"
131 echo ""
132 grep FAILED ${JAR}.log | sed -e "s/.*.\///"
133 echo ""
134 echo "---------------------------------------------"
135 echo ""
136 echo "We can try to add a premade copy of those files."
137 echo "This sometimes works."
138 echo ""
139 echo "But IT MAY NOT WORK!!!"
140 echo ""
141 echo ""
142 askconsent && return 0 || return 1
145 askconsent () {
146 sleep 1
147 echo -n "Do you want to proceed ? (YES/no) "
148 read PROCEED
149 case $PROCEED in
150 [Yy] | [Yy][Ee][Ss])
151 echo ""
154 return 1; # error
156 esac
157 echo -n "Are you sure ? (YES/no) "
158 read PROCEED
159 case $PROCEED in
160 [Yy] | [Yy][Ee][Ss])
161 return 0; # successful
164 return 1; # error
166 esac
169 abspath () {
170 case `uname -s` in
171 CYGWIN*)
172 echo $(cygpath -ua "$1")
174 Darwin)
175 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
176 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
178 Linux)
179 echo $(readlink -f "$1")
182 if [[ ${1:0:1} == "/" ]]; then
183 echo "$1"
184 elif [[ ${1:0:2} == "./" ]]; then
185 echo "$PWD/${1:2}"
186 else
187 echo "$PWD/$1"
190 esac
193 extpath () {
194 case `uname -s` in
195 CYGWIN*)
196 echo $(cygpath -da "$1")
199 echo $(abspath "$1")
201 esac
204 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
206 parse () { echo "${1%%_*}"; }
208 getbuildprop () {
209 if [ -f system/build.prop ]; then
210 result=(`grep $1 system/build.prop | tr '=' ' '`)
211 echo ${result[1]}
212 else
213 echo ""
217 proberom () {
218 VID=$(getbuildprop ro.build.version.release)
220 if [ "${VID%.*}" == "2.3" ]; then
221 RID=cm7;
222 elif [ "${VID%.*}" == "4.0" ]; then
223 MID=$(getbuildprop ro.rommanager.developerid)
224 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
225 DID=$(getbuildprop ro.product.device)
226 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
228 case "$MID" in
229 cm9|cm|cyanogenmod*)
230 RID=cm9;
232 aokp|teamkang)
233 RID=aokp;
235 # aosp|AOSP) # AOSP probing does not work yet
236 # RID=aosp;
237 # ;;
239 RID=aosp;
240 echo "!!! $MID is not supported yet, trying generic latest !!!"
242 esac
243 elif [ "${VID%.*}" == "4.1" ]; then
244 MID=$(getbuildprop ro.build.display.id)
245 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
246 DID=$(getbuildprop ro.product.device)
247 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
249 case "$MID" in
250 pa*|cm10|cm*|cyanogenmod*)
251 RID=cm10;
253 aokp*|teamkang)
254 RID=aokp-jb;
256 # aosp|AOSP) # AOSP probing does not work yet
257 # RID=aosp
258 # ;;
260 RID=aosp-jb;
261 echo "!!! $MID may not be supported yet, trying aosp-jb latest !!!"
263 esac
264 else
265 printerror "unknown ROM version $VID"
267 printtask "... result of ROM check: version= $VID rom= $RID ..."
270 proberil () {
271 RIL=$(getbuildprop ro.telephony.ril_class)
272 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
275 garbage () {
276 unset GARBAGE
277 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE=" ${GARBAGE[@]} >> "$LOG"
278 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE=" ${GARBAGE[@]} >> "$LOG"
281 [[ $# -lt 1 || $1 == "-h" || -z $1 ]] && printusage
283 ROOT=$(abspath `dirname "$0"`)
284 TOOL="$ROOT/patch_tools.tgz"
285 PTCH="$ROOT/patch_patches.tgz"
286 ROM=$(abspath "$1")
287 ROMX=$(extpath "$1")
289 if [[ $OSTYPE == "cygwin" ]]; then
290 EXE=".exe"
291 PGFORM="0x"
294 DATE=`date +%Y%m%d%H%M%S`
295 TEMP=$(abspath ./tmp$DATE)
296 LOG=$(abspath ./log$DATE)
297 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
298 echo "ROOT= $ROOT" >> "$LOG"
299 echo "TOOL= $TOOL" >> "$LOG"
300 echo "ROM= $ROM" >> "$LOG"
301 echo "ROMX= $ROMX" >> "$LOG"
303 \rm -f restore.zip update.zip
305 #CHK=$(getconf LONG_BIT)
306 #if [[ $CHK = "64" ]]; then
307 # BIT=64
308 #else [[ $BIT = "32" ]];
309 # BIT=32
311 #echo "*** You are using a $BIT bit OS ***" >> "$LOG"
312 #echo "### You are using $BIT bit OS ###"
314 printtask "### verify tools ###"
315 which patch >> "$LOG" || printerror "Missing \"patch diff tools\""
316 which tar >> "$LOG" || printerror "Missing \"tar zip tools\""
317 which jar >> "$LOG" || printerror "Missing \"jar (JDK)\""
318 which java >> "$LOG" || printerror "Missing \"java (JRE)\""
319 which cpio >> "$LOG" || printerror "Missing \"cpio (JRE)\""
320 [ -f "$TOOL" ] || printerror "patch tool is missing"
321 [ -f "$PTCH" ] || printerror "patch patches are missing"
322 printtask "### verify ROM ###"
323 [ -f "$ROM" ] || printerror "Cannot find $ROM"
324 echo "# running" $0 $@ >> "$LOG"
325 mkdir "$TEMP"
326 cd "$TEMP"
328 PATH="$TEMP:$PATH"
329 export PATH
330 echo "PATH= $PATH" >> "$LOG"
332 printtask "### unzip patch tools ###"
333 tar xvzf "$TOOL" >> "$LOG" 2>> "$LOG" || printerror "failed extracting tools !!!"
334 # workaround for the recent cygwin filename issue
335 \mv cygwin/aapt.exe .
336 \mv cygwin/*.exe boot/
337 \rm -rf cygwin
338 printtask "### unzip patch patches ###"
339 tar xvzf "$PTCH" > /dev/null || printerror "failed extracting patches !!!"
341 # build date
342 if [ $# -gt 3 ]; then
343 BID=$4
344 else
345 BID=latest
347 # rom type
348 if [ $# -gt 2 ]; then
349 RID=$3
350 else
351 printtask "### probe rom type ###"
352 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || printerror "failed extracting build.prop from $ROMX !!!"
353 proberom
355 # ril type
356 proberil
357 # patch type
358 if [ $# -gt 1 ]; then
359 PIL=${2//,/ }
360 else
361 #PIL=`ls patches/`
362 PIL="pdroid v6supercharger"
364 # a hack to make sure pdroid is the first mod
365 [[ ${PIL[@]} =~ pdroid ]] && PID=(pdroid)
366 for P in ${PIL[@]}; do
367 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
368 done
370 echo "# VID=" $VID >> "$LOG"
371 echo "# MID=" $MID >> "$LOG"
372 echo "# RID=" $RID >> "$LOG"
373 echo "# DID=" $DID >> "$LOG"
374 echo "# BID=" $BID >> "$LOG"
375 echo "# PID=" ${PID[@]} >> "$LOG"
377 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
378 echo "### supported patch candidates ###"
379 [ "$PID" != "-h" ] && PL=${PID[@]} || PL=`ls patches/`
380 for P in ${PL[@]}; do
381 [ "$PID" != "-h" -a "$RID" != "-h" ] && RL=${RID[@]} || RL=`ls patches/$P/`
382 for R in ${RL[@]} ; do
383 [ $R == "common" -o ! -d patches/$P/$R ] && continue
384 echo -n "$P : $R : "
385 \ls --ignore="*.sh" --ignore="*.txt" -r patches/$P/$R/
386 done
387 done
388 else
389 for P in ${PID[@]}; do
390 [ -d patches/$P ] || printerror "$P is not available"
392 [ -d patches/$P/$RID ] && R=$RID || R=generic
393 #[ -d patches/$P/$R/$BID ] && B=$BID || B=latest
395 unset FILES
396 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
397 [ -f patches/$P/$R/files.txt ] && FILES=$(cat patches/$P/$R/files.txt)
398 for FILE in ${FILES[@]}; do
399 case "$FILE" in
400 +system/*)
401 [[ ${CID[@]} =~ ${FILE:1} ]] && printerror "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
403 -system/*)
404 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
406 system/*.jar)
407 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
409 system/*.apk)
410 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
412 *.img)
413 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
415 system/*)
416 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
418 esac
419 done
420 done
421 echo "### DELETE FILES=" ${EID[@]} >> "$LOG"
422 echo "### COPY FILES=" ${CID[@]} >> "$LOG"
423 echo "### JAR FILES=" ${JID[@]} >> "$LOG"
424 echo "### APK FILES=" ${AID[@]} >> "$LOG"
425 echo "### IMG FILES=" ${IID[@]} >> "$LOG"
426 echo "### TXT FILES=" ${TID[@]} >> "$LOG"
428 printtask "### unzip rom ###"
429 # extract system files
430 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || printerror "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
431 #\cp -a system/ backup # only for debugging purpose
433 printtask "### create updater script ###"
434 jar -xvf "$ROMX" META-INF/com/google/android/updater-script META-INF/com/google/android/update-binary
435 jar -xvf "$ROMX" META-INF/com/google/android/update-binary-installer 1> /dev/null 2> /dev/null
436 if [ -f META-INF/com/google/android/update-binary-installer ]; then
437 printtask "... using Aroma installer ..."
438 \mv META-INF/com/google/android/update-binary-installer META-INF/com/google/android/update-binary
439 else
440 printtask "... using Clockworkmod installer ..."
442 if [ -f META-INF/com/google/android/update-binary ]; then
443 #echo "# original updater-script" >> "$LOG"
444 #cat META-INF/com/google/android/updater-script >> "$LOG"
446 cat META-INF/com/google/android/updater-script | grep ^mount | grep "/system" | head -n 1 > updater-script
447 [ -s updater-script ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" > updater-script
449 for FILE in ${EID[@]}; do
450 # restore the original
451 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
452 done
453 for FILE in ${CID[@]}; do
454 # replace with the original or delete it
455 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> updater-script
456 done
458 echo "package_extract_dir(\"system\", \"/system\");" >> updater-script
459 # add permission management
460 cat META-INF/com/google/android/updater-script | grep set_perm | grep "/system" >> updater-script
461 # TODO: remove if we don't need it any more
462 for P in ${PID[@]}; do
463 if [ -s patches/$P/set_perm.txt ]; then
464 echo "...adding permissions..."
465 cat patches/$P/set_perm.txt >> updater-script
467 done
469 cat META-INF/com/google/android/updater-script | grep ^unmount | grep "/system" | head -n 1 >> updater-script
471 [[ ${IID[@]} =~ boot.img ]] && cat META-INF/com/google/android/updater-script | grep "boot.img" >> updater-script
473 cat updater-script > META-INF/com/google/android/updater-script
475 echo "# generated updater-script" >> "$LOG"
476 cat updater-script >> "$LOG"
477 else
478 # this is not enough any more
479 jar -xvf update-template.zip META-INF/com/google/android/update-binary META-INF/com/google/android/updater-script
482 printtask "### create restore.zip ###"
483 #\rm -f system/build.prop # user may have modified it # now we handle build.prop as well
484 jar -cfv tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF >> "$LOG" 2>> "$LOG"
485 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip
486 \mv signed.zip restore.zip
487 \rm -f tmp.zip
489 printtask "### decompile system files ###"
490 # decompile system files
491 for FILE in ${JID[@]}; do
492 JAR=${FILE##*/}
493 printtask "... decompile $JAR ..."
494 java -jar baksmali.jar -b -a 15 -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
495 if [ $FILE == "system/framework/framework.jar" ]; then
496 printtask "... extract preloaded-classes ..."
497 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
498 \mv preloaded-classes tmp/${FILE}.out/
500 done
501 for FILE in ${AID[@]}; do
502 APK=${FILE##*/}
503 printtask "... decompile $APK ..."
504 if [ $FILE == "system/framework/framework-res.apk" ]; then
505 printtask "... installing framework files ..."
506 java -jar apktool.jar if $FILE
508 java -jar apktool.jar d -f $FILE tmp/$FILE.out
510 done
511 for FILE in ${IID[@]}; do
512 printtask "### unpacking $FILE ###"
513 case "$FILE" in
514 boot.img)
515 cd boot
516 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
518 mkdir ramdisk
519 cd ramdisk
520 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
521 cd ../../
524 printerror "cannot process $FILE"
526 esac
527 done
530 # apply system modification
531 for P in ${PID[@]}; do
532 [ -d patches/$P/$RID ] && R=$RID || R=generic
533 [ -d patches/$P/$R/$BID ] && B=$BID || B=latest
534 PR=patches/$P/$R
535 PRB=patches/$P/$R/$B
537 unset FILES COPY DELS JARS APKS IMGS TXTS
538 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
539 [ -f patches/$P/$R/files.txt ] && FILES=$(cat patches/$P/$R/files.txt)
540 for FILE in ${FILES[@]}; do
541 case $FILE in
542 +system/*)
543 COPY=(${COPY[@]} ${FILE:1})
545 -system/*)
546 DELS=(${DELS[@]} ${FILE:1})
548 system/*.jar)
549 JARS=(${JARS[@]} $FILE)
551 system/*.apk)
552 APKS=(${APKS[@]} $FILE)
554 *.img)
555 IMGS=(${IMGS[@]} $FILE)
557 system/*)
558 TXTS=(${TXTS[@]} $FILE)
560 esac
561 done
563 [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$R/$B ###"
564 for FILE in ${COPY[@]}; do
565 printtask "... copying $FILE ..."
566 DEST=${FILE%/*}
567 mkdir -p ./$DEST
568 if [ -e patches/$P/common/$FILE ]; then
569 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
570 \cp -a patches/$P/common/$FILE ./$DEST
571 else
572 printerror "$FILE is missing in the patch"
574 done
576 [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$R/$B ###"
577 for FILE in ${DELS[@]}; do
578 printtask "... deleting $FILE ..."
579 \rm -rf ./$FILE
580 done
582 [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$R/$B ###"
583 for FILE in ${JARS[@]}; do
584 JAR=${FILE##*/}
585 NAME=${JAR%.jar}
586 printtask "... apply $NAME.patch ..."
587 patch -Nls -p1 -d tmp/${FILE}.out < $PRB/${NAME}.patch 2>&1 > ${JAR}.log
588 cat ${JAR}.log | tee -a "$LOG"
589 case "$NAME" in
590 framework)
591 # patch preloaded-classes only if a patch exists
592 if [ -f $PRB/preloaded.patch ]; then
593 printtask "... apply preloaded.patch ..."
594 patch -Nls -p1 -d tmp/${FILE}.out < $PRB/preloaded.patch 2>&1 > preloaded.log
595 cat preloaded.log | tee -a "$LOG"
596 [[ `grep FAILED preloaded.log` != "" ]] && printerror "failed preloaded.patch"
600 echo -n "" # do nothing else
602 esac
603 # substitute failed smali with premade jar
604 FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'`)
605 if [[ -n ${FAILS[@]} ]]; then
606 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
607 for FAIL in ${FAILS[@]}; do
608 [[ ${SID[@]} =~ $FAIL ]] && printerror "$FAIL was already replaced before"
609 copyfailed || printerror "failed $NAME.patch"
610 printtask "... replace $FAIL ..."
611 \rm -rf tmp/${FILE}.out/smali/${FAIL}
612 \cp -a patches/$P/common/provisionals/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} || echo "FAILED to cp $FAIL" >> ${JAR}.log
613 #echo "### replacing ${FAILS[@]} from patches/$P/common/${FILE} ###" > ${JAR}.log
614 #java -jar baksmali.jar -b -a 15 -o pmp/${FILE}.out/smali patches/$P/common/provisionals/${FAIL} >> "$LOG" 2>> "$LOG" || echo "FAILED to baksmali $FILE" >> ${JAR}.log
615 #\cp -a pmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} || echo "FAILED to cp $FAIL" >> ${JAR}.log
616 SID=(${SID[@]} $FAIL)
617 done
619 [[ `grep FAILED ${JAR}.log` != "" ]] && printerror "failed $NAME.patch"
620 garbage tmp/${FILE}.out
621 if [ -f patches/$P/$R/${JAR}.sh ]; then
622 printtask "... apply $JAR.sh ..."
623 . patches/$P/$R/${JAR}.sh 2>&1 > ${JAR}.log
624 cat ${JAR}.log | tee -a "$LOG"
626 done
628 [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$R/$B ###"
629 for FILE in ${APKS[@]}; do
630 APK=${FILE##*/}
631 #NAME=${APK%.apk}
632 printtask "... apply $APK.patch ..."
633 patch -Nls -p2 -d tmp/${FILE}.out < $PRB/${APK}.patch 2>&1 >> ${APK}.log
634 cat ${APK}.log | tee -a "$LOG"
635 [[ `grep FAILED ${APK}.log` != "" ]] && printerror "failed $APK.patch"
636 garbage tmp/${FILE}.out
637 done
639 [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$R/$B ###"
640 for FILE in ${IMGS[@]}; do
641 IMG=${FILE##*/}
642 #NAME=${IMG%.img}
643 echo "... applying $IMG.patch ..."
644 patch -Nls -p1 -d boot/ramdisk < $PRB/${IMG}.patch || printerror "failed patching $FILE"
645 # Special Instructions- married to boot.img patching by necessity, not design. When
646 # added to it's own section, it only runs for one mod. WIP.
647 #if [ -f patches/$P/$R/special_instructions.sh ]; then
648 # . patches/$P/$R/special_instructions.sh
649 #elif [ -f patches/$P/special_instruction.sh ]; then
650 # . patches/$P/special_instructions.sh
652 done
654 [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$R/$B ###"
655 for FILE in ${TXTS[@]}; do
656 TXT=${FILE##*/}
657 if [[ -f $PRB/${TXT}.patch ]]; then
658 printtask "... apply $TXT.patch ..."
659 patch -Nls -p2 -d system/ < $PRB/${TXT}.patch 2>&1 > ${TXT}.log
660 #cat ${TXT}.log | tee -a "$LOG"
661 [[ `grep FAILED ${TXT}.log` != "" ]] && printerror "failed $TXT.patch"
663 if [[ -f $PR/${TXT}.awk ]]; then
664 printtask "... apply $TXT.awk ..."
665 awk -f $PR/${TXT}.awk $FILE > text || printerror "failed $TXT.awk"
666 mv text $FILE
668 if [[ -f $PR/${TXT}.sed ]]; then
669 printtask "... apply $TXT.sed ..."
670 sed -f $PR/${TXT}.sed $FILE > text || printerror "failed $TXT.sed"
671 mv text $FILE
673 if [[ -f $PR/${TXT}.sh ]]; then
674 printtask "... apply $TXT.sh ..."
675 . $PR/${TXT}.sh 2>&1 >> ${TXT}.log || printerror "failed $TXT.sh"
677 garbage system/
678 done
679 done
681 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
682 for FILE in ${JID[@]}; do
683 JAR=${FILE##*/}
684 printtask "... rebuild $JAR ..."
685 java -Xmx512M -jar smali.jar -a 15 tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
686 [ -f tmp/${FILE}.out/classes.dex ] || printerror "failed compiling $JAR !!!"
687 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
688 if [ $FILE == "system/framework/framework.jar" ]; then
689 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
691 done
693 [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
694 for FILE in ${AID[@]}; do
695 APK=${FILE##*/}
696 printtask "... rebuild $APK ..."
697 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || printerror "failed compiling $FILE !!!"
698 jar -ufv $FILE -C tmp/${FILE}.out/build/apk/ . >> "$LOG" 2>> "$LOG"
699 #\rm -r tmp/${FILE}.out
700 done
702 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
703 for FILE in ${IID[@]}; do
704 printtask "### rebuild $FILE ###"
705 case $FILE in
706 boot.img)
707 # Rebuilding boot.img
708 cd boot
709 printtask "... rebuilding ramdisk ..."
710 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
712 printtask "... composing boot.img ..."
713 BASE=$(cat boot.img-base)
714 # convert hex to decimal in cygwin by prefixing "0x" and C-style arithmetic
715 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
716 CMDLINE=$(cat boot.img-cmdline)
717 echo "cmdline = no_console_suspend=1 console=null" $CMDLINE >> "$LOG"
718 echo "pagesize =" $PGSIZE >> "$LOG"
719 echo "base =" $BASE >> "$LOG"
721 printtask "... rebuilding boot.img ..."
722 ./mkbootimg$EXE --kernel boot.img-zImage --ramdisk ramdisk-new.gz --cmdline "no_console_suspend=1 console=null $CMDLINE" --base "$BASE" --pagesize "$PGSIZE" -o ../boot.img || printerror "failed building boot.img"
723 cd ..
726 printerror "cannot process $FILE"
728 esac
729 done
731 printtask "### create update.zip ###"
732 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
733 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip update.zip
734 \rm -f tmp.zip
736 #echo "# miscellaneous log" >> "$LOG"
738 \mv restore.zip update.zip ..
739 echo "### finished ###"
740 echo "flash update.zip to install the modified"
741 echo "flash restore.zip to restore the original"
743 # add announcement
744 for P in ${PID[@]}; do
745 [ -d patches/$P/$RID ] && R=$RID || R=generic
746 if [ -f patches/$P/$R/README.txt ]; then
747 cat patches/$P/$R/README.txt
748 elif [ -f patches/$P/README.txt ]; then
749 cat patches/$P/README.txt
751 done
753 cd ..
754 \rm -rf "$TEMP"