Great tab-off of 2013---complete?
[auto-patcher.git] / auto_patcher
blob41dfbe4dccc5e01c8421b7abd41c37b489c418fe
1 #!/bin/bash
3 # version: beta v2.4.7, patches 2012.011.02.
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; 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 patches 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
27 # add patch outputs reroute
28 # 2012.06.15. CM9 patches updated
29 # 2012.06.16. (v0.4.6) AOKP patches updated, patch versions restructured
30 # 2012.06.17. (v0.5.0) patcher script reorganized, removed build.prop
31 # 2012.06.17. (v0.6.0) auto patcher script for pdroid and v6 patches
32 # 2012.06.19. (v0.6.1) add patches for CM7.2 Final
33 # 2012.06.20. (v0.6.2) updated CM 7.2 patches
34 # 2012.06.23. (v0.6.3) fix symlinks
35 # 2012.06.26. (v0.6.4) added 0618 patches for cm7 nightlies; removed 0619 cm7.2 final
36 # 2012.06.27. (v0.6.5) added new CM9 patches (20120626)
37 # 2012.06.27. (v0.6.6) added CM7 nightly patches (20120625) (finally!)
38 # 2012.07.02. (v0.7.0) Redid AOSP/AOKP; add Windows support (using Cygwin). Thanks kobik77!
39 # 2012.07.06. (v0.7.1) updated CM9 patches (20120706)
40 # 2012.07.08. (v0.7.2) updated AOKP (20120707) and CM9 (20120708) pdroid patches
41 # 2012.07.11. (v1.0.0) reworked script works on Linux, Mac OSX, and Windows (on Cygwin);
42 # added new ICS/JellyBean support for the new V6-Supercharger
43 # 2012.07.18. (v1.0.1) new CM7/CM9 Pdroid patches (20120718)
44 # 2012.07.23. (v1.0.2) updated CM9 patches (20120723)
45 # 2012.07.23. (v1.0.3) updated CM9 patches (20120724)
46 # 2012.08.06. (v1.5.0) updated smali/baksmali binaries to 1.33
47 # 2012.08.06. Added Pdroid/V6supercharger support for CM10 Jellybean!
48 # 2012.08.06. Improved PDroid stability and efficiency (Thanks CollegeDev)
49 # 2012.08.06. (v1.6.0) added aokp-jb patches for pdroid/v6supercharger, script update
50 # 2012.08.17. (v1.9.5) Added support for pdroid_addon, by CollegeDev.
51 # Added insecure boot.img mod
52 # Added support for aosp-jb (This needs testing, and may not be
53 # a wide patch due to large variation between AOSP roms.
54 # -Please report all experiences!
55 # Updated all v6supercharger patches w/new edits to ProcessList
56 # Major script overhaul in preparation for additional mods!
57 # 2012.08.20. (v1.9.6) Conditional support for Official cm10 and aokp-jb builds
58 # 2012.08.23. (v1.9.7) Final/confirmed pdroid support for Official CM10 and AOKP-JB
59 # 2012.09.04 (v1.9.8) Bundled cygwin-compatible tools (original was corrupt).
60 # For Cygwin, replaced h2b function with simple bash math
61 # conversion (req'd for compat w/ Cygwin tools).
62 # 2012.08.26. (v2.0.0) Added .apk patching
63 # Added 3G Dongle support for Nexus 7
64 # TabletUI support for Nexus 7 (maybe more)
65 # Google Voice support for Nexus 7
66 # mods are 3gdongle, tabletUI, voice, or nexus7suite (for all)
67 # Added provisional file copy menu to widen patching base
68 # 2012.09.11. (v2.0.1) Cygwin support fixes
69 # 2012.09.11. (v2.0.2) Bugfix for 3gdongle (all)
70 # 2012.09.16. (v2.1.0) Significant restructuring of core operations; added edit text file
71 # fix for "method-cap" errors in pdroid.
72 # 2012.09.20. (v2.1.1) Fix for Phone FC's; OSX support finalized; ContentResolver resolved
73 # 2012.09.28. (v2.1.2) Hotfix for failed pdroid patching. Logging improvements.
74 # 2012.10.07. (v2.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
77 # 2012.10.13. (v2.1.6) New PDroid patches for aokp-jb and cm10 4.1.2
78 # Revert (f)aapt- temporary due to reported issues
79 # 2012.10.15. (v2.17) New (again) CM10 pdroid patches.
80 # Move files to be copied into $p/$R/$B
81 # -This required a bunch of file moving-report broken symlinks.
82 # Some error check on the old RIL delete functions (thanks bundrik)
83 # 2012.10.16. (v2.1.7.5) Fix FC on phone with CM10 pdroid patches
84 # 2012.10.19. (v2.1.9) Testing CM10 support for PDroid Extension by CollegeDev.
85 # 2012.10.22. (v2.2.0) aosp/aokp and cm10 support for pdroid extension by CollegeDev
86 # MAJOR reworking of patches and improved query. only 4 mod types:
87 # cm, aokp, aosp, and pa. See our OP for details.
88 # 2012.10.26. (v2.3.0) Final (LTS) version. Stable for now until upstream breaks any patches
89 # Thanks to KicknGuitar for the OSX testing!
90 # 2012.11.01. (v2.3.1) Fix for pdroid RIL deletion for older roms
91 # Better Build query logic and help messages
92 # 2012.11.02. (v2.3.5) Add Evervolv support for all mods- Thanks to new maintainer poncik!
93 # Fix method cap for pdroid/pd2.0 for AOKP and kangs
94 # 2012.11.06. (v2.4.0) Update pd2.0 patches to latest pd2.0 release- all except Evervolv
95 # add GsmService to smali.txt; improve rom probe
96 # 2012.11.08. (v2.4.2) Add Evervolv support for pd2.0; Device-specific scripts
97 # Will display error if using a mod on an inapplicable rom
98 # 2012.11.09. (v2.4.5) Error catch for random method issues, fix pd2.0 Evervolv and aosp-jb
99 # 2012.11.17. (v2.4.6) Fix pdroid for CM7. FINALLY!.
100 # 2012.11.17. (v2.4.7) Internal debugging improvements
102 # SHELL PROGRAMMING NOTES:
103 # [ -s FILE ]
104 # [[ -n STRING ]] or [[ -z STRING ]]
106 VERSION="v2.4.7"
107 CURRENT_ANDROID="4.2.1"
109 # pass variables to children
110 set -a
112 printusage_help () {
113 usage_help
114 exit
117 usage_help () {
118 # This could REALLY use some better formatting. Even I find it intimidating looking.
119 echo " The Auto-Patcher $VERSION"
120 echo ""
121 echo "usage: $0 [ROMNAME].zip [MODS] [ROMTYPE] [PATCHDATE]"
122 echo ""
123 echo "* [MODS] can be pdroid, pd2.0, v6supercharger, tabletUI, etc..."
124 echo "MODS can be combined by separating them with a comma and NO SPACES!!!"
125 echo ""
126 echo "* [ROMTYPE] can be cm, aokp, aosp or pa [recommended]"
127 echo "* [PATCHDATE] will select older patch versions, e.g 20121030 [optional]"
128 echo ""
129 echo " try \"$0 ROM.ZIP -h\" to see what is available"
130 echo ""
133 usage_more_help () {
134 usage_help
135 echo ""
136 echo "press 'q' to see a list of available patches or CTRL-c to quit the help menu"
139 display_help () {
140 cd patches
141 echo ""
142 echo "AVAILABLE PATCHES"
143 echo ""
144 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
145 echo "The Auto-Patcher will automatically slot if you need aosp-jb or aosp-mod"
146 echo ""
147 echo "*******************************************************************"
148 echo ""
149 echo "Please keep in mind the Android version covers a range {2.3+, 4.0+,...etc.}"
150 echo " is there only for your information and is not needed on the command line"
151 echo ""
152 find -H * -name 2012* | more -d -10
153 echo ""
154 echo "*****************************************************************"
155 echo ""
156 echo "All listed mods are currently supported. So if you only see older patches,"
157 echo "that simply means those early patches are still working for current roms."
158 echo ""
159 cleanup
160 printusage_help
163 debug_help () {
164 # From print_error. For problems decompiling or patching mostly.
165 echo "! please refer to $LOG for any debugging"
166 echo ""
167 echo "! patching failed."
168 echo "! it may be possible to patch $ROM using other patch version"
169 echo ""
170 cleanup
171 printusage_help
174 romtype_help () {
175 # From rom_error (bad romtype) and date_error (patch date w/o specifying romtype)
176 echo ""
177 echo "!!!There are only four supported ROMTYPES: 1) cm 2) aokp 3) aosp 4) pa"
178 echo ""
179 echo "Find out which of the above ROMTYPES your rom is based on and try again!"
180 echo "**********************************************"
181 echo ""
182 cleanup
183 printusage_help
186 cleanup () {
187 [ -d "$TEMP" ] && \rm -rf "$TEMP"
190 garbage () {
191 unset GARBAGE
192 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
193 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
197 print_error () {
198 # General purpose error. Used for errors in main, as opposed to probe or set-up.
199 echo ""
200 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
201 printtask "!!! error: $@"
202 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
203 echo ""
204 debug_help
207 smali_error () {
208 # Smali binary error. Problem often goes away on second run.
209 echo ""
210 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
211 printtask "!!! error: $@"
212 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
213 echo ""
214 if [[ `grep 'method index is too large' "$LOG"` != "" ]]; then
215 printtask "!!! Problem with method cap !!!"
216 printtask "... attempting fix ..."
217 . patches/common/framework.jar.sh 2>&1 > ${JAR}.log
218 printtask "... rebuild framework.jar ..."
219 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
220 [ -f tmp/${FILE}.out/classes.dex ] || print_error "Could not resolve method cap issue- please submit log"
221 else
222 printtask "!!! This error is generally due to an unknown bug in the smali binary!"
223 echo "In our experience, it goes away if you run the patcher a second time."
224 echo " Please run the Auto-Patcher with the same command once again."
225 echo ""
226 echo "If after the third attempt the same thing happens,"
227 echo " please upload your logfile to our support thread!"
228 echo ""
229 cleanup
230 exit
234 mismatch_error () {
235 # Function that exposes attempts to apply a mod to an upsupported Android version
236 echo ""
237 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
238 printtask "!!! error: $@"
239 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
240 echo ""
241 cleanup
242 printusage_help
245 date_error () {
246 # Remind users to include a romtype if they are going to specify a patch date
247 echo ""
248 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
249 printtask "!!! error: $@"
250 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
251 echo ""
252 echo "Please put a ROMTYPE before the patch date and run again!!"
253 romtype_help
256 rom_error () {
257 # For when an unsupported romtype is manually entered on the command-line
258 echo ""
259 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
260 printtask "!!! error: $@"
261 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
262 romtype_help
265 misspatch_error () {
266 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
267 printtask "!! error: $@ "
268 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
269 echo ""
270 printtask "!! The Auto-Patcher could not find its patches and/or tools!"
271 echo ""
272 echo "* Did you run ./batch.sh first?"
273 echo ""
274 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
275 echo " one way or another..."
276 echo ""
277 cleanup
278 printusage_help
281 misstools_error () {
282 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
283 printtask "!! error: $@ "
284 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
285 printtask "Your set-up is missing a dependency."
286 echo "We require JDK, patch and cpio."
287 echo ""
288 echo ""
289 echo "Each distro is different"
290 echo "but you must ensure you have them all installed and try again."
291 echo ""
292 cleanup
293 printusage_help
296 printtask () {
297 echo "" >> "$LOG"
298 echo $@ | tee -a "$LOG"
301 copyfailed () {
302 echo ""
303 printtask "File for which patching failed:"
304 printtask "---------------------------------------------"
305 echo ""
306 printtask "${FAIL##*/}"
307 echo ""
308 echo "---------------------------------------------"
309 echo ""
310 echo "We can try to add a premade copy of those files."
311 echo "This sometimes works."
312 echo ""
313 echo "But IT MAY NOT WORK!!!"
314 echo ""
315 echo ""
316 askconsent && return 0 || return 1
319 askconsent () {
320 sleep 1
321 echo -n "Do you want to proceed ? (YES/no) "
322 read PROCEED
323 echo "askconsent final = ${PROCEED}: for $FAIL" >> "$LOG"
324 case $PROCEED in
325 [Yy] | [Yy][Ee][Ss])
326 return 0; # successful:
327 echo "*** You (or ApG) have elected to use a prepatched copy of $FAIL ***" >> "$LOG"
330 return 1; # error
331 echo "*** You have declined to insert $FAIL by not answering 'yes' at the prompt. ***" >> "$LOG"
333 esac
336 replace_updater () {
338 # Function for devices that use SDcard installs. Also to be tested for CM7
339 # since CM7 seems to use an updater-script that wipes EMMC. Testing
341 UPDIR=META-INF/com/google/android
342 \rm $UPDIR/updater-script
343 \cp patches/common/$UPDIR/updater-script $UPDIR
344 echo "run_program(\"/sbin/busybox\", \"umount\", \"/system\");" >> UPDATE.txt
345 cat UPDATE.txt >> $UPDIR/updater-script
346 echo ""
347 echo "New updater-script being used:" >> "$LOG"
348 echo "-----------------------------" >> "$LOG"
349 cat $UPDIR/updater-script >> "$LOG"
352 abspath () {
353 case `uname -s` in
354 CYGWIN*)
355 echo $(cygpath -ua "$1")
357 Darwin)
358 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
359 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
361 Linux)
362 echo $(readlink -f "$1")
365 if [[ ${1:0:1} == "/" ]]; then
366 echo "$1"
367 elif [[ ${1:0:2} == "./" ]]; then
368 echo "$PWD/${1:2}"
369 else
370 echo "$PWD/$1"
373 esac
376 mods_info () {
377 CEILING=$CURRENT_ANDROID # Default is that everything works...we'll see.
378 case $PID in
379 mods)
380 echo ""
381 echo "The Auto-Patcher $VERSION"
382 echo "*************************************"
383 echo ""
384 echo "The available mods are"
385 echo "**************************************************"
386 echo "* pdroid opd pd2.0 v6supercharger *"
387 echo "* voice insecure secure external_internal *"
388 echo "* tabletUI 3gdongle voice *"
389 echo "**************************************************"
390 echo ""
391 echo "To find out more about any mod, simply enter:"
392 echo " ./auto_patcher -h <MODNAME>"
393 echo ""
394 echo " For usage info: ./auto_patcher -h"
395 echo ""
396 exit
398 auto*)
399 echo ""
400 echo "**************************************"
401 echo "The Auto-Patcher ate a kitten once..."
402 echo "**************************************"
403 printusage_help
405 voice)
406 FLOOR=4.0.0
407 DESC="Use on wifi-only tablets to have the software register as 'voice-enabled'. Allows VOIP like Google Voice to function."
409 v6supercharger)
410 FLOOR=4.0.0
411 CEILING=4.2.1
412 DESC="A memory-management tool. It requires smali edits for Android roms 4.0+."
413 DESC1="The Auto-Patcher applies all 56 edits recommended by the dev."
414 DEV="Zeppelinrox"
415 DEPENDENCY="The V6 Supercharger Script. Get it at http://forum.xda-developers.com/showthread.php?t=991276/"
417 pdroid)
418 FLOOR=2.3.7
419 CEILING=4.1.2
420 DESC="Security Software that blocks permissions w/o causing FC's. No longer under development.Try the open-source expansion of this program, PDroid Manager."
421 DESC1="Run the 'opd' mod within the Auto-Patcher."
422 DEV="Svyat"
423 DEPENDENCY="The Pdroid app. You can get it at http://forum.xda-developers.com/showthread.php?t=1923576"
425 pd2.0)
426 FLOOR=4.1.2
427 CEILING=4.1.2
428 DESC="A closed-source expansion of the PDroid application."
429 DEV="CollegeDev"
430 DEPENDENCY="The PDroid2.0 app available at http://forum.xda-developers.com/showthread.php?t=1923576"
432 external_internal)
433 FLOOR=2.3.3
434 DESC="Swap internal and external storage."
436 insecure)
437 FLOOR=2.3.3
438 DESC="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
440 secure)
441 FLOOR=2.3.3
442 DESC="Make any boot.img secure."
444 3gdongle)
445 FLOOR=4.1.0
446 CEILING=4.2.1
447 DESC="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
448 DEV="trevd"
449 DEPENDENCY="None, but read the troubleshooting guide at http://forum.xda-developers.com/showthread.php?t=1798631"
451 tabletUI)
452 FLOOR=4.1.0
453 CEILING=4.1.2
454 DESC="Changes the user interface of Phones and Phablets to the popular Tablet UI."
455 DEV="barmullio"
457 esac
458 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
459 NVID=${VID//[.]/}
460 COMPATF=${FLOOR//[.]/}
461 COMPATC=${CEILING//[.]/}
464 apk_check () {
465 if [ -f patches/$P/$A/$R/$B/$FILE ]; then
466 echo "... Patching $APK failed, but we will copy over a prepatched file ..."
467 \cp -av patches/$P/$A/$R/$B/$FILE $FILE >> "$LOG"
468 else
469 print_error "failed patching $APK!!!"
472 compat_check () {
473 for P in ${PID[@]}; do
474 mods_info
475 if [[ "$NVID" -lt "$COMPAT" ]]; then
476 mismatch_error "Your Android $VID rom is too old! The minimum for $P is Android $FLOOR!"
478 if [[ "$NVID" -gt "$COMPATC" ]]; then
479 mismatch_error "Sorry, $P has not been made available for Android $VID yet!"
481 done
483 extpath () {
484 case `uname -s` in
485 CYGWIN*)
486 echo $(cygpath -da "$1")
489 echo $(abspath "$1")
491 esac
494 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
496 parse () { echo "${1%%_*}"; }
498 getbuildprop () {
499 if [ -f system/build.prop ]; then
500 result=(`grep $1 system/build.prop | tr -d '\r' | tr '=' ' '`)
501 echo "${result[1]}"
502 else
503 echo ""
508 aosp_mod_check() {
509 jar -xvf "$ROMX" system/framework/framework2.jar >> $LOG
510 if [ -s system/framework/framework2.jar ]; then
511 ever_check
512 else
513 AOSP=aosp-jb
517 ever_check() {
518 MID=$(getbuildprop ro.build.romversion)
519 if [[ "$MID" == "Evervolv"* ]]; then
520 AOSP=aosp-ever
521 else
522 MID=$(getbuildprop ro.build.display.id)
523 if [[ "$MID" == "ev"* ]]; then
524 AOSP=aosp-ever
525 else
526 AOSP=aosp-mod
531 pa_check() {
532 CMID=$(getbuildprop ro.modversion)
533 PAID=$(getbuildprop ro.pa.version)
534 MID=$(getbuildprop ro.build.display.id)
535 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
536 DID=$(getbuildprop ro.product.device)
537 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
538 if [[ -n $PAID ]]; then
539 RID=pa
540 else
541 case $CMID in
542 [Pp][Aa]*)
543 RID=pa;
546 RID=cm;
548 esac
552 proberom () {
553 VID=$(getbuildprop ro.build.version.release)
554 ANDR="${VID%.*}" # Cut flavor to 1 significant digit to cover specific range or release.
555 if [ "$ANDR" == "2.3" ]; then
556 FLAVR=gingerbread
557 API=10
558 RID=cm;
559 elif [ "$ANDR" == "4.0" ]; then
560 FLAVR=ics
561 API=15
562 MID=$(getbuildprop ro.rommanager.developerid)
563 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
564 DID=$(getbuildprop ro.product.device)
565 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
567 case "$MID" in
568 pa|cm9|cm|cyanogenmod*)
569 RID=cm;
571 aokp|teamkang)
572 RID=aokp;
574 aosp*)
575 RID=aosp;
578 echo "!!! $MID is not supported yet, trying generic latest !!!"
580 esac
581 elif [ "$ANDR" == "4.1" ]; then
582 FLAVR=jellybean
583 API=16
584 CMID=$(getbuildprop ro.cm.version)
585 if [[ -n $CMID ]]; then
586 pa_check
587 else
588 MID=$(getbuildprop ro.build.display.id)
589 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
590 DID=$(getbuildprop ro.product.device)
591 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
592 case "$MID" in
593 cm10|cm*|cyanogenmod*)
594 RID=cm;
596 aokp*|teamkang)
597 RID=aokp;
599 pa*)
600 RID=pa;
602 ev*)
603 RID=aosp-ever;
606 RID=`aosp_mod_check`;
608 esac
610 elif [ "$ANDR" == "4.2" ]; then
611 FLAVR=jellybean
612 API=17
613 CMID=$(getbuildprop ro.cm.version)
614 if [[ -n $CMID ]]; then
615 pa_check
616 else
617 MID=$(getbuildprop ro.build.display.id)
618 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
619 DID=$(getbuildprop ro.product.device)
620 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
622 case "$MID" in
623 cm10|cm*|cyanogenmod*)
624 RID=cm;
626 aokp*|teamkang)
627 RID=aokp;
629 pa*)
630 RID=pa;
633 RID=aosp;
635 esac
637 else
638 print_error "unknown ROM version $VID"
640 echo "... result of ROM check: version= $VID rom= $RID ..."
643 # Advanced build date query
644 # This should set the patch date automatically.
646 buildquery() {
647 UTC=$(getbuildprop ro.build.date.utc)
649 # Difference in how OS X and Linux/Cygwin handles 'date' utility
650 case `uname -s` in
651 [Dd]arwin)
652 BDID=`date -r $UTC +%Y%m%d`
653 echo "#### Darwin Build Query used ####" >> "$LOG"
656 BDID=`date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d"`
657 echo "#### Standard Build Query ####" >> "$LOG"
659 esac
661 # If patch date is specified on CLI, use that patch date
662 if [ $# -gt 3 ]; then
663 BID=${4//,/ };
665 # Multiple mods all default to latest- this isn't ideal. We should institute $BID array
666 # In python, we would use dictionary. Not sure about best for shell. A GUI would fix.
667 elif [[ ${#PID[@]} -gt 1 ]];then
668 BID=latest;
669 else
670 case $ANDR in
671 gingerbread)
672 # CM7 roms do not have UTC time stamp- so no build query.
673 BID=latest;
674 echo "*** CM7 roms default to latest patches. If using an older rom ***"
675 echo "*** specify patch date on command line. Use -h to see available patches ***"
678 for P in ${PID[@]}; do
679 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
680 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
681 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
682 PAR=patches/$P/$A/$R
683 PARB=patches/$P/$A/$R/$B
684 DATES=`ls patches/$P/$A/$R/ | grep '201*'`
685 # Intialize variable - High so as to determine lowest in first loop.
686 BID=20201231
687 # find earliest available patch date
688 for i in $DATES; do
689 if [[ $i -lt $BID ]]; then
690 BID=$i
692 done
693 # Check if earliest patches are from before build date. Else use earliest
695 # If older than earliest patch set, then find best match
696 if [[ $(($BID-$BDID)) -lt 0 ]]; then
697 for g in $DATES; do
698 # use any patch that matches $UTC
699 if [[ $(($BDID-$g)) -eq 0 ]]; then
700 BID=$g
701 break
702 # Set highest $BID w/o going over $UTC
703 elif [[ $(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
704 BID=$g
706 done
708 echo "... $PID patch date has been set to: $BID..."
709 B=$BID
710 done
712 esac
716 proberil () {
717 RIL=$(getbuildprop ro.telephony.ril_class)
718 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
721 rominfo () {
722 echo "# VER= $VERSION" >> "$LOG"
723 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
724 echo "# VID= $VID" >> "$LOG"
725 echo "# PID= ${PID[@]}" >> "$LOG"
726 echo "# MID= $MID" >> "$LOG"
727 echo "# RID= $RID" >> "$LOG"
728 echo "# ANDR= $ANDR" >> "$LOG"
729 echo "# BDID= $BDID" >> "$LOG"
730 echo "# DID= $DID" >> "$LOG"
731 echo "# BID= $BID" >> "$LOG"
735 if [[ $1 == -h ]]; then
736 if [ $# -gt 1 ]; then
737 PID=$2
738 mods_info
739 echo ""
740 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
741 echo "*************************************************"
742 echo ""
743 echo "Mod Name: $PID"
744 echo ""
745 echo " $DESC"
746 echo "$DESC1"
747 echo ""
748 echo "Developer: $DEV"
749 echo "Dependancies: $DEPENDENCY"
750 echo ""
751 echo "Works on Android ROMs from $FLOOR to $CEILING"
752 echo
753 exit
757 [[ $# -lt 1 || -z $1 ]] && printusage_help
758 [[ $1 == "-h" ]] && usage_more_help | less && display_help
760 echo ""
761 echo "The Auto-Patcher $VERSION"
762 echo ""
763 # by pastime1971 and mateorod
765 ROOT=$(abspath `dirname "$0"`)
766 TOOL="$ROOT/patch_tools.tgz"
767 PTCH="$ROOT/patch_patches.tgz"
768 ROM=$(abspath "$1")
769 ROMX=$(extpath "$1")
771 if [[ $OSTYPE == "cygwin" ]]; then
772 EXE=".exe"
773 PGFORM="0x"
776 DATE=`date +%Y%m%d%H%M%S`
777 TEMP=$(abspath ./tmp$DATE)
778 LOG=$(abspath ./log$DATE.txt)
779 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
780 echo "ROOT= $ROOT" >> "$LOG"
781 echo "TOOL= $TOOL" >> "$LOG"
782 echo "ROM= $ROM" >> "$LOG"
783 echo "ROMX= $ROMX" >> "$LOG"
785 \rm -f restore.zip update.zip
787 CHK=$(getconf LONG_BIT)
788 if [[ $CHK = "64" ]]; then
789 BIT=64
790 else [[ $BIT = "32" ]];
791 BIT=32
795 printtask "### verify tools ###"
796 which patch >> "$LOG" || misstools_error "Missing \"patch diff command\""
797 which tar >> "$LOG" || misstools_error "Missing \"tar archive command\""
798 which jar >> "$LOG" || misstools_error "Missing \"jar (JDK)\""
799 which java >> "$LOG" || misstools_error "Missing \"java (JRE)\""
800 which cpio >> "$LOG" || misstools_error "Missing \"cpio archive command\""
801 [ -f "$TOOL" ] || misspatch_error "patch tool is missing"
802 [ -f "$PTCH" ] || misspatch_error "patch patches are missing"
803 printtask "### verify ROM ###"
804 [ -f "$ROM" ] || print_error "Cannot find $ROM"
805 echo "### running $0 $@" >> "$LOG"
806 mkdir "$TEMP"
807 cd "$TEMP"
809 PATH="$TEMP:$PATH"
810 export PATH
811 echo "PATH= $PATH" >> "$LOG"
813 printtask "### unzip patch tools ###"
814 tar xzf "$TOOL" > /dev/null || print_error "failed extracting tools !!!"
816 # Get OS specific tools
817 case `uname -s` in
818 CYGWIN*)
819 \mv cygwin/aapt.exe .
820 \mv cygwin/*.exe boot/
821 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
823 [Dd]arwin)
824 \mv mac/aapt .
826 [Ll]inux)
827 \mv linux/aapt .
830 \mv linux/aapt .
832 esac
833 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
834 chmod a+x aapt$EXE
836 printtask "### unzip patch patches ###"
837 tar xzf "$PTCH" > /dev/null || print_error "failed extracting patches !!!"
839 # we need build.prop for both RIL probing and ROM probing
840 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || print_error "failed extracting build.prop from $ROMX !!!"
842 # rom + ril type
843 proberil
844 printtask "### probe rom type ###"
845 proberom
847 # rom type
848 if [ $# -gt 1 ]; then
849 PIT=$2
850 if [[ "$PIT" = "-h" ]]; then
851 display_help
854 if [ $# -gt 2 ]; then
855 RID=$3
856 case "$RID" in
857 cm10|cm*|cyanogenmod*)
859 aokp*|teamkang)
860 RID=aokp;
862 pa*)
863 RID=pa;
865 aosp-ever)
866 RID=aosp-ever;
868 aosp*)
869 case "ANDR" in
870 4.1)
871 RID=`aosp_mod_check`;
874 RID=aosp
876 esac
878 201*)
879 date_error "You must specify ROMTYPE if designating a patch date!!"
882 rom_error "$RID is not a valid ROMTYPE!!"
884 esac
885 echo "... Using $RID patches ..."
886 else
887 echo "... Using results of ROM check ..."
890 # patch type
891 if [ $# -gt 1 ]; then
892 PIL=${2//,/ }
893 else
894 #PIL=`ls patches/`
895 PIL="pdroid v6supercharger"
896 echo "No mods selected. Defaulting to the v6 and Pdroid, just because we can."
898 # a hack to make sure pdroid is the first mod
899 [[ ${PIL[@]} =~ pdroid ]] && PID=(pdroid)
900 for P in ${PIL[@]}; do
901 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
902 done
904 # Check to make sure selected roms are available for the Android version of patched ROM
905 compat_check
907 # Build date
908 if [ $# -gt 3 ]; then
909 BID=$4
910 # even here, we should try and create a function that matches as close to the above
911 # BID as possible. Now, a bad match (user error) defaults to latest
912 echo "... $PID patch date set manually to $BID ..."
913 else
914 buildquery
917 # echo ROM info
918 rominfo
920 # I think I finally may have rendered this VERY long if statement obsolete...CHECK!
921 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
922 display_help
923 else
925 #Begin cycle
927 for P in ${PID[@]}; do
928 [ -d patches/$P ] || print_error "$P is not available"
929 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
930 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
931 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
933 unset FILES
934 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
935 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
936 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
937 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
938 for FILE in ${FILES[@]}; do
939 case "$FILE" in
940 +system/*)
941 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
943 -system/*)
944 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
946 system/*.jar)
947 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
948 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
950 system/*.apk)
951 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
952 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
954 *.img)
955 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
957 system/*)
958 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
960 esac
961 done
962 done
963 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
964 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
965 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
966 echo "### APK FILES= ${AID[@]}" >> "$LOG"
967 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
968 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
970 printtask "### unzip rom ###"
971 # extract system files
972 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || print_error "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
974 printtask "### create updater script ###"
975 jar -xvf "$ROMX" META-INF/com/google/android/updater-script META-INF/com/google/android/update-binary
976 jar -xvf "$ROMX" META-INF/com/google/android/update-binary-installer 1> /dev/null 2> /dev/null
977 if [ -f META-INF/com/google/android/update-binary-installer ]; then
978 printtask "... using Aroma installer ..."
979 \mv META-INF/com/google/android/update-binary-installer META-INF/com/google/android/update-binary
980 else
981 printtask "... using Clockworkmod installer ..."
983 if [ -f META-INF/com/google/android/update-binary ]; then
984 cat META-INF/com/google/android/updater-script | grep ^mount | grep "/system" | head -n 1 > updater-script
985 [ -s updater-script ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" > updater-script
986 for FILE in ${EID[@]}; do
987 # restore the original
988 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
989 done
990 for FILE in ${CID[@]}; do
991 # replace with the original or delete it
992 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> updater-script
993 done
994 echo "package_extract_dir(\"system\", \"/system\");" >> updater-script
995 # add permission management
996 cat META-INF/com/google/android/updater-script | grep set_perm | grep "/system" >> updater-script
997 # TODO: remove if we don't need it any more
998 for P in ${PID[@]}; do
999 if [ -s patches/$P/$A/set_perm.txt ]; then
1000 echo "...setting permissions..."
1001 cat patches/$P/$A/set_perm.txt >> updater-script
1003 done
1004 cat META-INF/com/google/android/updater-script | grep ^unmount | grep "/system" | head -n 1 >> updater-script
1005 [[ ${IID[@]} =~ boot.img ]] && cat META-INF/com/google/android/updater-script | grep "boot.img" >> updater-script
1006 cat updater-script > META-INF/com/google/android/updater-script
1007 echo "# generated updater-script" >> "$LOG"
1008 cat updater-script >> "$LOG"
1009 else
1010 # this is not enough any more
1011 jar -xvf update-template.zip META-INF/com/google/android/update-binary META-INF/com/google/android/updater-script
1014 printtask "### create restore.zip ###"
1015 jar -cvf tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
1016 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
1017 \mv signed.zip restore.zip
1018 \rm -f tmp.zip
1020 printtask "### decompile system files ###"
1022 # decompile system files
1023 for FILE in ${JID[@]}; do
1024 JAR=${FILE##*/}
1025 printtask "... decompile $JAR ..."
1026 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
1027 if [ $FILE == "system/framework/framework.jar" ]; then
1028 printtask "... extract preloaded-classes ..."
1029 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
1030 \mv preloaded-classes tmp/${FILE}.out/
1032 done
1034 # Pull framework-files for APK...
1035 if [ ${#AID[@]} -gt 0 ]; then
1036 jar -xvf "$ROMX" system/framework/framework-res.apk >> "$LOG"
1037 printtask "... installing framework files ..."
1038 java -jar apktool.jar if system/framework/framework-res.apk
1039 # Decompile APKs
1040 for FILE in ${AID[@]}; do
1041 APK=${FILE##*/}
1042 if [ -f $FILE ]; then
1043 printtask "... decompile $APK ..."
1044 java -jar apktool.jar d -f $FILE tmp/$FILE.out
1046 done
1049 # Unpack image files {boot.img only so far...}
1050 for FILE in ${IID[@]}; do
1051 printtask "### unpacking $FILE ###"
1052 case "$FILE" in
1053 boot.img)
1054 if [ -f boot.img ]; then
1055 cd boot
1056 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
1057 mkdir ramdisk
1058 cd ramdisk
1059 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
1060 cd ../../
1061 else
1062 print_error "A mod needs to patch boot.img! This rom does not contains boot.img."
1066 print_error "cannot process $FILE"
1068 esac
1069 done
1071 # apply system modification
1073 for P in ${PID[@]}; do
1074 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1075 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1076 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1077 PAR=patches/$P/$A/$R
1078 PARB=patches/$P/$A/$R/$B
1080 unset FILES COPY DELS JARS APKS IMGS TXTS
1081 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1082 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1083 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1084 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1085 for FILE in ${FILES[@]}; do
1086 case $FILE in
1087 +system/*)
1088 COPY=(${COPY[@]} ${FILE:1})
1090 -system/*)
1091 DELS=(${DELS[@]} ${FILE:1})
1093 system/*.jar)
1094 JARS=(${JARS[@]} $FILE)
1096 system/*.apk)
1097 APKS=(${APKS[@]} $FILE)
1099 *.img)
1100 IMGS=(${IMGS[@]} $FILE)
1102 system/*)
1103 TXTS=(${TXTS[@]} $FILE)
1105 esac
1106 done
1108 [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$A/$R/$B ###"
1109 for FILE in ${COPY[@]}; do
1110 printtask "... copying $FILE ..."
1111 DEST=${FILE%/*}
1112 mkdir -p ./$DEST
1113 if [ -e patches/$P/$A/$R/$B/$FILE ]; then
1114 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
1115 \cp -av patches/$P/$A/$R/$B/$FILE ./$DEST >> "$LOG"
1116 else
1117 print_error "$FILE is missing in the patch. Please upload your logfile to the support thread!"
1119 done
1121 # unconditional smali copying
1122 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
1123 [ -f patches/$P/$A/smali.txt ] && SMALI=$(cat patches/$P/$A/smali.txt)
1124 [ -f patches/$P/$A/$R/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/smali.txt)
1125 [ -f patches/$P/$A/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/$B/smali.txt)
1126 MOVE=${SMALI##*/}
1127 for SMALI in ${SMALI[@]}; do
1128 printtask "... overwriting $MOVE ..."
1129 if [ -f patches/$P/$A/$R/provisionals/$SMALI ]; then
1130 \cp -av patches/$P/$ANDR/$R/provisionals/$SMALI tmp/$SMALI >> "$LOG"
1131 else
1132 \cp -av patches/$P/$ANDR/provisionals/$SMALI tmp/$SMALI >> "$LOG"
1134 done
1136 [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$A/$R/$B ###"
1137 for FILE in ${DELS[@]}; do
1138 printtask "... deleting $FILE ..."
1139 \rm -rf ./$FILE
1140 done
1141 [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$A/$R/$B ###"
1142 for FILE in ${JARS[@]}; do
1143 JAR=${FILE##*/}
1144 NAME=${JAR%.jar}
1145 printtask "... apply $NAME.patch ..."
1146 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
1147 cat ${JAR}.log | tee -a "$LOG"
1148 case "$NAME" in
1149 framework)
1150 # patch preloaded-classes only if a patch exists
1151 if [ -f $PARB/preloaded.patch ]; then
1152 printtask "... apply preloaded.patch ..."
1153 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
1154 cat preloaded.log | tee -a "$LOG"
1155 [[ `grep FAILED preloaded.log` != "" ]] && print_error "failed preloaded.patch"
1159 echo -n "" # do nothing else
1161 esac
1162 # substitute failed smali with premade jar
1163 unset FAILS
1164 FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e "s/\.rej'//"`)
1165 if [[ -n ${FAILS[@]} ]]; then
1166 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
1167 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
1168 for FAIL in ${FAILS[@]}; do
1169 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1170 #cat tmp/$FILE.out/smali/${FAIL}.rej >> "$LOG"
1171 [[ ${SID[@]} =~ $FAIL ]] && print_error "$FAIL was already replaced before"
1172 [ -f patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} ] || print_error "failed $FAIL in $JAR cannot be remedied"
1173 copyfailed || print_error "failed $NAME.patch"
1174 printtask "... replace $FAIL ..."
1175 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
1176 \cp -av patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} >> "$LOG" || echo "FAILED to cp $FAIL" >> ${JAR}.log
1177 SID=(${SID[@]} $FAIL)
1178 done
1180 [[ `grep FAILED ${JAR}.log` != "" ]] && print_error "failed $NAME.patch"
1181 garbage tmp/${FILE}.out
1182 if [ -f patches/$P/$A/$R/$B/${JAR}.sh ]; then
1183 printtask "... apply $JAR.sh ..."
1184 . patches/$P/$A/$R/$B/${JAR}.sh 2>&1 > ${JAR}.log
1185 cat ${JAR}.log | tee -a "$LOG"
1187 done
1189 [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$A/$R/$B ###"
1190 for FILE in ${APKS[@]}; do
1191 APK=${FILE##*/}
1192 if [ -d "tmp/${FILE}.out" ] ; then
1193 printtask "... apply $APK.patch ..."
1194 patch -Nls -p2 -d tmp/${FILE}.out < $PARB/${APK}.patch 2>&1 >> ${APK}.log
1195 cat ${APK}.log | tee -a "$LOG"
1196 [[ `grep FAILED ${APK}.log` != "" ]] && apk_check
1197 garbage tmp/${FILE}.out
1198 else
1199 echo "No $APK in your ROM. Not able to patch this file."
1200 echo "## No $APK in ROM ###" >> "$LOG"
1202 done
1203 [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$A/$R/$B ###"
1204 for FILE in ${IMGS[@]}; do
1205 IMG=${FILE##*/}
1206 printtask "... applying $IMG.patch ..."
1207 patch -Nls -p1 -d boot/ramdisk < $PARB/${IMG}.patch >> "$LOG" || print_error "failed patching $FILE"
1208 done
1210 [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$A/$R/$B ###"
1211 for FILE in ${TXTS[@]}; do
1212 TXT=${FILE##*/}
1213 if [[ -f $PARB/${TXT}.patch ]]; then
1214 printtask "... apply $TXT.patch ..."
1215 patch -Nls -p2 -d system/ < $PARB/${TXT}.patch 2>&1 > ${TXT}.log
1216 #cat ${TXT}.log | tee -a "$LOG"
1217 [[ `grep FAILED ${TXT}.log` != "" ]] && print_error "failed $TXT.patch"
1219 if [[ -f $PAR/${TXT}.awk ]]; then
1220 printtask "... apply $TXT.awk ..."
1221 awk -f $PAR/${TXT}.awk $FILE > text || print_error "failed $TXT.awk"
1222 mv text $FILE
1224 if [[ -f $PAR/${TXT}.sed ]]; then
1225 printtask "... apply $TXT.sed ..."
1226 sed -f $PAR/${TXT}.sed $FILE > text || print_error "failed $TXT.sed"
1227 mv text $FILE
1229 if [[ -f $PAR/${TXT}.sh ]]; then
1230 printtask "... apply $TXT.sh ..."
1231 . $PAR/${TXT}.sh 2>&1 >> ${TXT}.log || print_error "failed $TXT.sh"
1233 garbage system/
1234 done
1235 done
1237 # Device specific scripts- Placement is up-for-review
1238 if [ -f patches/devices/$DID/$DID.sh ]; then
1239 . patches/devices/$DID/$DID.sh
1241 # Replace updater-script for CM7-- Testing
1242 if [ "$ANDR" == "gingerbread" ]; then
1243 replace_updater
1245 # Rebuilding system files
1247 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
1248 for FILE in ${JID[@]}; do
1249 JAR=${FILE##*/}
1250 printtask "... rebuild $JAR ..."
1251 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
1252 [ -f tmp/${FILE}.out/classes.dex ] || smali_error "failed compiling $JAR !!!"
1253 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
1254 if [ $FILE == "system/framework/framework.jar" ]; then
1255 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
1257 done
1259 [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
1260 for FILE in ${AID[@]}; do
1261 APK=${FILE##*/}
1262 if [ -d tmp/${FILE}.out ]; then
1263 printtask "... rebuild $APK ..."
1264 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || print_error "failed compiling $FILE !!!"
1265 jar -uvf $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
1267 done
1269 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
1270 for FILE in ${IID[@]}; do
1271 printtask "### rebuild $FILE ###"
1272 case $FILE in
1273 boot.img)
1274 # Rebuilding boot.img
1275 cd boot
1276 printtask "... rebuilding ramdisk ..."
1277 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
1279 printtask "... composing boot.img ..."
1280 BASE=$(cat boot.img-base)
1281 # hex to decimal in cygwin prefixing "0x" w/ C arithmetic
1282 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
1283 CMDLINE=$(cat boot.img-cmdline)
1284 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
1285 echo "pagesize = $PGSIZE" >> "$LOG"
1286 echo "base = $BASE" >> "$LOG"
1287 printtask "... rebuilding boot.img ..."
1288 ./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 || print_error "failed building boot.img"
1289 cd ..
1292 print_error "cannot process $FILE"
1294 esac
1295 done
1297 printtask "### create update.zip ###"
1298 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
1299 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip update.zip 2>> "$LOG"
1301 \mv restore.zip update.zip ..
1302 echo "### finished ###"
1303 echo "flash update.zip to install the modified"
1304 echo "flash restore.zip to restore the original"
1306 # add announcement- optional.
1307 for P in ${PID[@]}; do
1308 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1309 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1310 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1311 if [ -f patches/$P/$A/$R/$B/README.txt ]; then
1312 cat patches/$P/$A/$R/$B/README.txt
1313 elif [ -f patches/$P/$A/$R/README.txt ]; then
1314 cat patches/$P/$A/$R/README.txt
1315 elif [ -f patches/$P/$A/README.txt ]; then
1316 cat patches/$P/$A/README.txt
1318 done
1320 cd ..
1321 \rm -rf "$TEMP"