New aokp-jb patches
[auto-patcher.git] / auto_patcher
blobca9312d74c64a00c94366654b54e8bf6a498944b
1 #!/bin/bash
3 # version: beta v2.1.5, patches 2012.010.03.
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.
72 # 2012.09.20. (2.1.1) Fix for Phone FC's; OSX support finalized; ContentResolver resolved
73 # 2012.09.28. (2.1.2) Hotfix for failed pdroid patching. Logging improvements.
74 # 2012.10.07. (2.1.5) Final pdroid support for CM7.2 Official Releases
75 # Added aosp-mod patches for pdroid patching of AOSP kangs
76 # Switched to Chainfire's (f)aapt for speed/space reasons
78 # SHELL PROGRAMMING NOTES:
79 # [ -s FILE ]
80 # [[ -n STRING ]] or [[ -z STRING ]]
82 VERSION="Auto-Patcher v2.1.5"
84 echo ""
85 echo "The $VERSION"
86 echo ""
87 # by pastime1971 and mateorod
90 # pass variables to children
91 set -a
93 # function for converting hex to binary- for testing
94 #function h2b { echo "obase=2; ibase=16; $( echo "$*" | sed -e 's/0x//g' -e 's/\([a-z]\)/\u\1/g' )" | bc; }
96 printusage () {
97 echo " The $VERSION"
98 echo " pdroid 1.32 patches 2012.09.13."
99 echo " v6supercharger patches 2012.08.17."
100 echo ""
101 echo "usage: $0 ROM.ZIP MODS [ROMTYPE] [PATCHDATE]"
102 echo ""
103 echo "MODS can be pdroid,v6supercharger or pdroid or v6supercharger"
104 echo "optional [ROMTYPE] can be cm9, aokp, etc."
105 echo "optional [PATCHDATE] can be specified to use older patch versions."
106 echo "try \"$0 ROM.ZIP -h\" to see what is available"
107 echo ""
108 exit
111 debug () {
112 echo "! please refer to $LOG for any debugging"
113 echo ""
114 echo "! patching failed."
115 echo "! it may be possible to patch $ROM using other patch version"
116 echo ""
117 [ -d "$TEMP" ] && \rm -rf "$TEMP"
118 printusage
121 printerror () {
122 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
123 echo "!!! error: $@"
124 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
125 echo ""
126 debug
129 printtask () {
130 echo "" >> "$LOG"
131 echo $@ | tee -a "$LOG"
134 copyfailed () {
135 echo ""
136 echo "File for which patching failed:"
137 echo "---------------------------------------------"
138 echo ""
139 echo "${FAIL##*/}"
140 echo ""
141 echo "---------------------------------------------"
142 echo ""
143 echo "We can try to add a premade copy of those files."
144 echo "This sometimes works."
145 echo ""
146 echo "But IT MAY NOT WORK!!!"
147 echo ""
148 echo ""
149 askconsent && return 0 || return 1
152 askconsent () {
153 sleep 1
154 echo -n "Do you want to proceed ? (YES/no) "
155 read PROCEED
156 echo "askconsent intial = ${PROCEED}" >> "$LOG"
157 case $PROCEED in
158 [Yy] | [Yy][Ee][Ss])
159 echo ""
162 return 1; # error
164 esac
165 echo -n "Are you sure ? (YES/no) "
166 read PROCEED
167 echo "askconsent final = ${PROCEED}: for $FAIL" >> "$LOG"
168 case $PROCEED in
169 [Yy] | [Yy][Ee][Ss])
170 return 0; # successful
173 return 1; # error
175 esac
178 abspath () {
179 case `uname -s` in
180 CYGWIN*)
181 echo $(cygpath -ua "$1")
183 Darwin)
184 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
185 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
187 Linux)
188 echo $(readlink -f "$1")
191 if [[ ${1:0:1} == "/" ]]; then
192 echo "$1"
193 elif [[ ${1:0:2} == "./" ]]; then
194 echo "$PWD/${1:2}"
195 else
196 echo "$PWD/$1"
199 esac
202 extpath () {
203 case `uname -s` in
204 CYGWIN*)
205 echo $(cygpath -da "$1")
208 echo $(abspath "$1")
210 esac
213 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
215 parse () { echo "${1%%_*}"; }
217 getbuildprop () {
218 if [ -f system/build.prop ]; then
219 result=(`grep $1 system/build.prop | tr '=' ' '`)
220 echo "${result[1]}"
221 else
222 echo ""
226 proberom () {
227 VID=$(getbuildprop ro.build.version.release)
229 if [ "${VID%.*}" == "2.3" ]; then
230 ANDR=gingerbread
231 RID=cm7;
232 elif [ "${VID%.*}" == "4.0" ]; then
233 ANDR=ics
234 MID=$(getbuildprop ro.rommanager.developerid)
235 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
236 DID=$(getbuildprop ro.product.device)
237 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
239 case "$MID" in
240 pa|cm9|cm|cyanogenmod*)
241 RID=cm9;
243 aokp|teamkang)
244 RID=aokp;
246 # aosp|AOSP) # AOSP probing does not work yet
247 # RID=aosp;
248 # ;;
250 RID=aosp;
251 echo "!!! $MID is not supported yet, trying generic latest !!!"
253 esac
254 elif [ "${VID%.*}" == "4.1" ]; then
255 ANDR=jellybean
256 MID=$(getbuildprop ro.build.display.id)
257 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
258 DID=$(getbuildprop ro.product.device)
259 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
261 case "$MID" in
262 pa*|cm10|cm*|cyanogenmod*)
263 RID=cm10;
265 aokp*|teamkang)
266 RID=aokp-jb;
268 # aosp|AOSP) # AOSP probing does not work yet
269 # RID=aosp
270 # ;;
272 RID=aosp-jb;
273 echo "!!! $MID may not be supported: default is aosp-jb latest !!!"
275 esac
276 else
277 printerror "unknown ROM version $VID"
279 echo "... result of ROM check: version= $VID rom= $RID ..."
281 # Adding build date query
282 UTC=$(getbuildprop ro.build.date.utc)
283 BDID=`date -d "1970-01-01 UTC $UTC seconds" +"%Y-%m-%d"`
286 proberil () {
287 RIL=$(getbuildprop ro.telephony.ril_class)
288 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
291 garbage () {
292 unset GARBAGE
293 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
294 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
297 rominfo () {
298 echo "# VER= $VERSION" >> "$LOG"
299 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
300 echo "# VID= $VID" >> "$LOG"
301 echo "# MID= $MID" >> "$LOG"
302 echo "# RID= $RID" >> "$LOG"
303 echo "# BDID= $BDID" >> "$LOG"
304 echo "# DID= $DID" >> "$LOG"
305 echo "# BID= $BID" >> "$LOG"
306 echo "# PID= ${PID[@]}" >> "$LOG"
309 [[ $# -lt 1 || $1 == "-h" || -z $1 ]] && printusage
311 ROOT=$(abspath `dirname "$0"`)
312 TOOL="$ROOT/patch_tools.tgz"
313 PTCH="$ROOT/patch_patches.tgz"
314 ROM=$(abspath "$1")
315 ROMX=$(extpath "$1")
317 if [[ $OSTYPE == "cygwin" ]]; then
318 EXE=".exe"
319 PGFORM="0x"
322 DATE=`date +%Y%m%d%H%M%S`
323 TEMP=$(abspath ./tmp$DATE)
324 LOG=$(abspath ./log$DATE)
325 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
326 echo "ROOT= $ROOT" >> "$LOG"
327 echo "TOOL= $TOOL" >> "$LOG"
328 echo "ROM= $ROM" >> "$LOG"
329 echo "ROMX= $ROMX" >> "$LOG"
331 \rm -f restore.zip update.zip
333 CHK=$(getconf LONG_BIT)
334 if [[ $CHK = "64" ]]; then
335 BIT=64
336 else [[ $BIT = "32" ]];
337 BIT=32
341 printtask "### verify tools ###"
342 which patch >> "$LOG" || printerror "Missing \"patch diff command\""
343 which tar >> "$LOG" || printerror "Missing \"tar archive command\""
344 which jar >> "$LOG" || printerror "Missing \"jar (JDK)\""
345 which java >> "$LOG" || printerror "Missing \"java (JRE)\""
346 which cpio >> "$LOG" || printerror "Missing \"cpio archive command\""
347 [ -f "$TOOL" ] || printerror "patch tool is missing"
348 [ -f "$PTCH" ] || printerror "patch patches are missing"
349 printtask "### verify ROM ###"
350 [ -f "$ROM" ] || printerror "Cannot find $ROM"
351 echo "### running $0 $@" >> "$LOG"
352 mkdir "$TEMP"
353 cd "$TEMP"
355 PATH="$TEMP:$PATH"
356 export PATH
357 echo "PATH= $PATH" >> "$LOG"
359 printtask "### unzip patch tools ###"
360 tar xvzf "$TOOL" > /dev/null || printerror "failed extracting tools !!!"
362 # Get OS specific tools
363 case `uname -s` in
364 CYGWIN*)
365 \mv cygwin/aapt.exe .
366 \mv cygwin/*.exe boot/
367 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
369 [Dd]arwin)
370 \mv mac/aapt .
372 [Ll]inux)
373 \mv linux/aapt .
376 \mv linux/aapt .
378 esac
380 printtask "### unzip patch patches ###"
381 tar xvzf "$PTCH" > /dev/null || printerror "failed extracting patches !!!"
383 # we need build.prop for both RIL probing and ROM probing
384 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || printerror "failed extracting build.prop from $ROMX !!!"
385 # ril type
386 proberil
387 printtask "### probe rom type ###"
388 proberom
389 \rm -f system/build.prop
390 # build date
391 if [ $# -gt 3 ]; then
392 BID=$4
393 else
394 BID=latest
396 # rom type
397 if [ $# -gt 2 ]; then
398 RID=$3
399 echo "... Using $RID patches ..."
400 else
401 echo "... Using results of ROM check ..."
404 # patch type
405 if [ $# -gt 1 ]; then
406 PIL=${2//,/ }
407 else
408 #PIL=`ls patches/`
409 PIL="pdroid v6supercharger"
411 # a hack to make sure pdroid is the first mod
412 [[ ${PIL[@]} =~ pdroid ]] && PID=(pdroid)
413 for P in ${PIL[@]}; do
414 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
415 done
417 # echo ROM info
418 rominfo
420 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
421 echo "### supported patch candidates ###"
422 [ "$PID" != "-h" ] && PL=${PID[@]} || PL=`ls patches/`
423 for P in ${PL[@]}; do
424 [ "$PID" != "-h" -a "$RID" != "-h" ] && RL=${RID[@]} || RL=`ls patches/$P/`
425 for R in ${RL[@]} ; do
426 [ $R == "common" -o ! -d patches/$P/$R ] && continue
427 echo -n "$P : $R : "
428 \ls --ignore="*.sh" --ignore="*.txt" -r patches/$P/$R/
429 done
430 done
431 else
432 for P in ${PID[@]}; do
433 [ -d patches/$P ] || printerror "$P is not available"
435 [ -d patches/$P/$RID ] && R=$RID || R=generic
436 #[ -d patches/$P/$R/$BID ] && B=$BID || B=latest
438 unset FILES
439 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
440 [ -f patches/$P/$R/files.txt ] && FILES=$(cat patches/$P/$R/files.txt)
441 for FILE in ${FILES[@]}; do
442 case "$FILE" in
443 +system/*)
444 [[ ${CID[@]} =~ ${FILE:1} ]] && printerror "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
446 -system/*)
447 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
449 system/*.jar)
450 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
452 system/*.apk)
453 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
455 *.img)
456 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
458 system/*)
459 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
461 esac
462 done
463 done
464 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
465 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
466 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
467 echo "### APK FILES= ${AID[@]}" >> "$LOG"
468 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
469 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
471 printtask "### unzip rom ###"
472 # extract system files
473 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || printerror "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
474 #\cp -a system/ backup # only for debugging purpose
476 printtask "### create updater script ###"
477 jar -xvf "$ROMX" META-INF/com/google/android/updater-script META-INF/com/google/android/update-binary
478 jar -xvf "$ROMX" META-INF/com/google/android/update-binary-installer 1> /dev/null 2> /dev/null
479 if [ -f META-INF/com/google/android/update-binary-installer ]; then
480 printtask "... using Aroma installer ..."
481 \mv META-INF/com/google/android/update-binary-installer META-INF/com/google/android/update-binary
482 else
483 printtask "... using Clockworkmod installer ..."
485 if [ -f META-INF/com/google/android/update-binary ]; then
486 #echo "# original updater-script" >> "$LOG"
487 #cat META-INF/com/google/android/updater-script >> "$LOG"
489 cat META-INF/com/google/android/updater-script | grep ^mount | grep "/system" | head -n 1 > updater-script
490 [ -s updater-script ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" > updater-script
492 for FILE in ${EID[@]}; do
493 # restore the original
494 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
495 done
496 for FILE in ${CID[@]}; do
497 # replace with the original or delete it
498 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> updater-script
499 done
501 echo "package_extract_dir(\"system\", \"/system\");" >> updater-script
502 # add permission management
503 cat META-INF/com/google/android/updater-script | grep set_perm | grep "/system" >> updater-script
504 # TODO: remove if we don't need it any more
505 for P in ${PID[@]}; do
506 if [ -s patches/$P/set_perm.txt ]; then
507 echo "...adding permissions..."
508 cat patches/$P/set_perm.txt >> updater-script
510 done
512 cat META-INF/com/google/android/updater-script | grep ^unmount | grep "/system" | head -n 1 >> updater-script
514 [[ ${IID[@]} =~ boot.img ]] && cat META-INF/com/google/android/updater-script | grep "boot.img" >> updater-script
516 cat updater-script > META-INF/com/google/android/updater-script
518 echo "# generated updater-script" >> "$LOG"
519 cat updater-script >> "$LOG"
520 else
521 # this is not enough any more
522 jar -xvf update-template.zip META-INF/com/google/android/update-binary META-INF/com/google/android/updater-script
525 printtask "### create restore.zip ###"
526 jar -cfv tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
527 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
528 \mv signed.zip restore.zip
529 \rm -f tmp.zip
531 printtask "### decompile system files ###"
532 # decompile system files
533 for FILE in ${JID[@]}; do
534 JAR=${FILE##*/}
535 printtask "... decompile $JAR ..."
536 java -jar baksmali.jar -b -a 15 -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
537 if [ $FILE == "system/framework/framework.jar" ]; then
538 printtask "... extract preloaded-classes ..."
539 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
540 \mv preloaded-classes tmp/${FILE}.out/
542 done
543 for FILE in ${AID[@]}; do
544 APK=${FILE##*/}
545 printtask "... decompile $APK ..."
546 if [ $FILE == "system/framework/framework-res.apk" ]; then
547 printtask "... installing framework files ..."
548 java -jar apktool.jar if $FILE
550 java -jar apktool.jar d -f $FILE tmp/$FILE.out
552 done
553 for FILE in ${IID[@]}; do
554 printtask "### unpacking $FILE ###"
555 case "$FILE" in
556 boot.img)
557 cd boot
558 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
560 mkdir ramdisk
561 cd ramdisk
562 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
563 cd ../../
566 printerror "cannot process $FILE"
568 esac
569 done
572 # apply system modification
573 for P in ${PID[@]}; do
574 [ -d patches/$P/$RID ] && R=$RID || R=generic
575 [ -d patches/$P/$R/$BID ] && B=$BID || B=latest
576 PR=patches/$P/$R
577 PRB=patches/$P/$R/$B
579 unset FILES COPY DELS JARS APKS IMGS TXTS
580 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
581 [ -f patches/$P/$R/files.txt ] && FILES=$(cat patches/$P/$R/files.txt)
582 for FILE in ${FILES[@]}; do
583 case $FILE in
584 +system/*)
585 COPY=(${COPY[@]} ${FILE:1})
587 -system/*)
588 DELS=(${DELS[@]} ${FILE:1})
590 system/*.jar)
591 JARS=(${JARS[@]} $FILE)
593 system/*.apk)
594 APKS=(${APKS[@]} $FILE)
596 *.img)
597 IMGS=(${IMGS[@]} $FILE)
599 system/*)
600 TXTS=(${TXTS[@]} $FILE)
602 esac
603 done
605 [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$R/$B ###"
606 for FILE in ${COPY[@]}; do
607 printtask "... copying $FILE ..."
608 DEST=${FILE%/*}
609 mkdir -p ./$DEST
610 if [ -e patches/$P/common/$FILE ]; then
611 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
612 \cp -a patches/$P/common/$FILE ./$DEST
613 else
614 printerror "$FILE is missing in the patch"
616 done
618 # unconditional smali copying
619 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
620 [ -f patches/$P/$R/smali.txt ] && SMALI=$(cat patches/$P/$R/smali.txt)
621 [ -f patches/$P/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$R/$B/smali.txt)
622 MOVE=${SMALI##*/}
623 for SMALI in ${SMALI[@]}; do
624 printtask "... overwriting $MOVE ..."
625 \cp -av patches/$P/$ANDR/provisionals/$SMALI tmp/$SMALI >> "$LOG"
626 done
629 [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$R/$B ###"
630 for FILE in ${DELS[@]}; do
631 printtask "... deleting $FILE ..."
632 \rm -rf ./$FILE
633 done
635 [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$R/$B ###"
636 for FILE in ${JARS[@]}; do
637 JAR=${FILE##*/}
638 NAME=${JAR%.jar}
639 printtask "... apply $NAME.patch ..."
640 patch -Nls -p1 -d tmp/${FILE}.out < $PRB/${NAME}.patch 2>&1 > ${JAR}.log
641 cat ${JAR}.log | tee -a "$LOG"
642 case "$NAME" in
643 framework)
644 # patch preloaded-classes only if a patch exists
645 if [ -f $PRB/preloaded.patch ]; then
646 printtask "... apply preloaded.patch ..."
647 patch -Nls -p1 -d tmp/${FILE}.out < $PRB/preloaded.patch 2>&1 > preloaded.log
648 cat preloaded.log | tee -a "$LOG"
649 [[ `grep FAILED preloaded.log` != "" ]] && printerror "failed preloaded.patch"
653 echo -n "" # do nothing else
655 esac
656 # substitute failed smali with premade jar
657 unset FAILS
658 FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'`)
659 if [[ -n ${FAILS[@]} ]]; then
660 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
661 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
662 for FAIL in ${FAILS[@]}; do
663 echo "!!! patch error for $FAIL !!!" >> "$LOG"
664 #cat tmp/$FILE.out/smali/${FAIL}.rej >> "$LOG"
665 [[ ${SID[@]} =~ $FAIL ]] && printerror "$FAIL was already replaced before"
666 [ -f patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} ] || printerror "failed $FAIL in $JAR cannot be remedied"
667 copyfailed || printerror "failed $NAME.patch"
668 printtask "... replace $FAIL ..."
669 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
670 \cp -av patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} >> "$LOG" || echo "FAILED to cp $FAIL" >> ${JAR}.log
671 #echo "### replacing ${FAILS[@]} from patches/$P/common/${FILE} ###" > ${JAR}.log
672 #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
673 #\cp -a pmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} || echo "FAILED to cp $FAIL" >> ${JAR}.log
674 SID=(${SID[@]} $FAIL)
675 done
677 [[ `grep FAILED ${JAR}.log` != "" ]] && printerror "failed $NAME.patch"
678 garbage tmp/${FILE}.out
679 if [ -f patches/$P/$R/${JAR}.sh ]; then
680 printtask "... apply $JAR.sh ..."
681 . patches/$P/$R/${JAR}.sh 2>&1 > ${JAR}.log
682 cat ${JAR}.log | tee -a "$LOG"
684 done
686 [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$R/$B ###"
687 for FILE in ${APKS[@]}; do
688 APK=${FILE##*/}
689 #NAME=${APK%.apk}
690 printtask "... apply $APK.patch ..."
691 patch -Nls -p2 -d tmp/${FILE}.out < $PRB/${APK}.patch 2>&1 >> ${APK}.log
692 cat ${APK}.log | tee -a "$LOG"
693 [[ `grep FAILED ${APK}.log` != "" ]] && printerror "failed $APK.patch"
694 garbage tmp/${FILE}.out
695 done
697 [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$R/$B ###"
698 for FILE in ${IMGS[@]}; do
699 IMG=${FILE##*/}
700 #NAME=${IMG%.img}
701 echo "... applying $IMG.patch ..."
702 patch -Nls -p1 -d boot/ramdisk < $PRB/${IMG}.patch >> "$LOG" || printerror "failed patching $FILE"
703 # Special Instructions- married to boot.img patching by necessity, not design. When
704 # added to it's own section, it only runs for one mod. WIP.
705 #if [ -f patches/$P/$R/special_instructions.sh ]; then
706 # . patches/$P/$R/special_instructions.sh
707 #elif [ -f patches/$P/special_instruction.sh ]; then
708 # . patches/$P/special_instructions.sh
710 done
712 [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$R/$B ###"
713 for FILE in ${TXTS[@]}; do
714 TXT=${FILE##*/}
715 if [[ -f $PRB/${TXT}.patch ]]; then
716 printtask "... apply $TXT.patch ..."
717 patch -Nls -p2 -d system/ < $PRB/${TXT}.patch 2>&1 > ${TXT}.log
718 #cat ${TXT}.log | tee -a "$LOG"
719 [[ `grep FAILED ${TXT}.log` != "" ]] && printerror "failed $TXT.patch"
721 if [[ -f $PR/${TXT}.awk ]]; then
722 printtask "... apply $TXT.awk ..."
723 awk -f $PR/${TXT}.awk $FILE > text || printerror "failed $TXT.awk"
724 mv text $FILE
726 if [[ -f $PR/${TXT}.sed ]]; then
727 printtask "... apply $TXT.sed ..."
728 sed -f $PR/${TXT}.sed $FILE > text || printerror "failed $TXT.sed"
729 mv text $FILE
731 if [[ -f $PR/${TXT}.sh ]]; then
732 printtask "... apply $TXT.sh ..."
733 . $PR/${TXT}.sh 2>&1 >> ${TXT}.log || printerror "failed $TXT.sh"
735 garbage system/
736 done
737 done
739 # Rebuilding system files
741 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
742 for FILE in ${JID[@]}; do
743 JAR=${FILE##*/}
744 printtask "... rebuild $JAR ..."
745 java -Xmx512M -jar smali.jar -a 15 tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
746 [ -f tmp/${FILE}.out/classes.dex ] || printerror "failed compiling $JAR !!!"
747 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
748 if [ $FILE == "system/framework/framework.jar" ]; then
749 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
751 done
753 [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
754 for FILE in ${AID[@]}; do
755 APK=${FILE##*/}
756 printtask "... rebuild $APK ..."
757 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || printerror "failed compiling $FILE !!!"
758 jar -ufv $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
759 #\rm -r tmp/${FILE}.out
760 done
762 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
763 for FILE in ${IID[@]}; do
764 printtask "### rebuild $FILE ###"
765 case $FILE in
766 boot.img)
767 # Rebuilding boot.img
768 cd boot
769 printtask "... rebuilding ramdisk ..."
770 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
772 printtask "... composing boot.img ..."
773 BASE=$(cat boot.img-base)
774 # convert hex to decimal in cygwin by prefixing "0x" and C-style arithmetic
775 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
776 CMDLINE=$(cat boot.img-cmdline)
777 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
778 echo "pagesize = $PGSIZE" >> "$LOG"
779 echo "base = $BASE" >> "$LOG"
781 printtask "... rebuilding boot.img ..."
782 ./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"
783 cd ..
786 printerror "cannot process $FILE"
788 esac
789 done
791 printtask "### create update.zip ###"
792 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
793 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip update.zip 2>> "$LOG"
794 #\rm -f tmp.zip
796 #echo "# miscellaneous log" >> "$LOG"
798 \mv restore.zip update.zip ..
799 echo "### finished ###"
800 echo "flash update.zip to install the modified"
801 echo "flash restore.zip to restore the original"
803 # add announcement
804 for P in ${PID[@]}; do
805 [ -d patches/$P/$RID ] && R=$RID || R=generic
806 if [ -f patches/$P/$R/README.txt ]; then
807 cat patches/$P/$R/README.txt
808 elif [ -f patches/$P/README.txt ]; then
809 cat patches/$P/README.txt
811 done
813 cd ..
814 \rm -rf "$TEMP"