Reworded missing tools strings
[auto-patcher.git] / auto_patcher
blob670c1c7f3768b16d26a206f09d63e55cc6ce92d2
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 PID="openpdroid,3gdongle" # default example
114 brief_help
117 brief_help () {
118 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
119 echo " example: ./auto_patcher CM10.zip $PID cm"
120 echo ""
121 echo "Use ./auto_patcher -h for the help menu"
122 echo ""
123 cleanup
124 exit
127 usage_help () {
128 PID=mods
129 mods_display
130 echo "Multiple MODS can be combined by separating them with a comma and NO SPACES!!!"
131 echo ""
132 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
133 echo ""
134 echo " example: ./auto_patcher CM10.zip openpdroid,3gdongle cm"
135 echo ""
136 usage_more_help
139 usage_more_help () {
140 echo "* press 'q' available patches or CTRL-c to quit the help menu *"
143 display_help () {
144 cd patches
145 echo ""
146 echo "AVAILABLE PATCHES"
147 echo ""
148 echo "*******************************************************************"
149 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
150 echo ""
151 find -H * \( -name aokp -o -name cm -o -name aosp -o -name pa -o -name all \) -prune | column -c 75
152 echo ""
153 echo "!!! Do not put Android Version number on command line !!!!"
154 echo "*****************************************************************"
155 echo "Specific auto_patcher script options"
156 echo " ./auto_patcher -h [mods] Lists mods"
157 echo " -h [<MODNAME>] Specific <MOD> info"
158 echo " -h [advanced] Advanced usage+lists all available patch dates"
159 echo ""
160 cleanup
161 exit
164 romtype_help () {
165 # From rom_error (bad romtype) and date_error (patch date w/o specifying romtype)
166 echo ""
167 echo "!!!There are only four supported ROMTYPES: 1) cm 2) aokp 3) aosp 4) pa"
168 echo ""
169 echo "Find out which of the above ROMTYPES your rom is based on and try again!"
170 echo "**********************************************"
171 echo ""
172 cleanup
173 brief_help
176 advanced_help () {
177 echo ""
178 echo "The Auto-Patcher Advanced Usage"
179 echo "*********************************"
180 echo ""
181 echo "For those of you determined to try everything..."
182 echo ""
183 echo "You can also try adding a patch date as a final argument."
184 echo ""
185 echo " ./auto_patcher <ROM> <MOD> <ROMTYPE> <DATE>"
186 echo ""
187 echo "Please note: There are only four ROMTYPES: {pa, aokp, aosp and cm}"
188 echo " -The various appellations after that are for internal use only!"
189 echo ""
190 echo "The Auto-Patcher has a pretty great rom probe, specifying the date is"
191 echo " deprecated...you don't need to, we promise."
192 echo ""
195 cleanup () {
196 [ -d "$TEMP" ] && \rm -rf "$TEMP"
199 garbage () {
200 unset GARBAGE
201 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
202 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
206 print_error () {
207 # General purpose error. Used for errors in main, as opposed to probe or set-up.
208 echo ""
209 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
210 printtask "!!! error: $@"
211 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
212 echo ""
213 brief_help
216 smali_error () {
217 # Smali binary error. Problem often goes away on second run.
218 echo ""
219 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
220 printtask "!!! error: $@"
221 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
222 echo ""
223 if [[ `grep 'method index is too large' "$LOG"` != "" ]]; then
224 printtask "!!! Problem with method cap !!!"
225 printtask "... attempting fix ..."
226 . patches/common/framework.jar.sh 2>&1 > ${JAR}.log
227 printtask "... rebuild framework.jar ..."
228 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
229 [ -f tmp/${FILE}.out/classes.dex ] || print_error "Could not resolve method cap issue- please submit log"
230 else
231 printtask "!!! This error is generally due to an unknown bug in the smali binary!"
232 echo "In our experience, it goes away if you run the patcher a second time."
233 echo " Please run the Auto-Patcher with the same command once again."
234 echo ""
235 echo "If after the third attempt the same thing happens,"
236 echo " please upload your logfile to our support thread!"
237 echo ""
238 cleanup
239 exit
243 mismatch_error () {
244 # Function that exposes attempts to apply a mod to an upsupported Android version
245 echo ""
246 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
247 printtask "!!! error: $@"
248 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
249 echo ""
250 cleanup
251 brief_help
254 date_error () {
255 # Remind users to include a romtype if they are going to specify a patch date
256 echo ""
257 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
258 printtask "!!! error: $@"
259 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
260 echo ""
261 echo "Please put a ROMTYPE before the patch date and run again!!"
262 romtype_help
265 rom_error () {
266 # For when an unsupported romtype is manually entered on the command-line
267 echo ""
268 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
269 printtask "!!! error: $@"
270 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
271 romtype_help
274 conflict_error () {
275 # For conflicting packages
276 echo ""
277 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
278 printtask "!!! error: $@"
279 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
280 cleanup
281 PID=mods
282 mods_info
285 misspatch_error () {
286 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
287 printtask "!! error: $@ "
288 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
289 echo ""
290 printtask "!! The Auto-Patcher could not find its patches and/or tools!"
291 echo ""
292 echo "* Did you run ./batch.sh first?"
293 echo ""
294 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
295 echo " one way or another..."
296 echo ""
297 cleanup
298 brief_help
301 misstools_error () {
302 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
303 printtask "!! error: $@ "
304 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
305 printtask "Your set-up is missing a dependency."
306 echo "We require JDK, tar, patch and cpio."
307 echo ""
308 echo ""
309 echo "Each distro is different"
310 echo "but ensure you have them all installed and try again."
311 echo ""
312 cleanup
313 brief_help
316 printtask () {
317 echo "" >> "$LOG"
318 echo $@ | tee -a "$LOG"
321 copyfailed () {
322 echo ""
323 printtask "File for which patching failed:"
324 printtask "---------------------------------------------"
325 echo ""
326 printtask "${FAIL##*/}"
327 echo ""
328 echo "---------------------------------------------"
329 echo ""
330 echo "We can try to add a premade copy of those files."
331 echo "This sometimes works."
332 echo ""
333 echo "But IT MAY NOT WORK!!!"
334 echo ""
335 echo ""
336 askconsent && return 0 || return 1
339 askconsent () {
340 sleep 1
341 echo -n "Do you want to proceed ? (YES/no) "
342 read PROCEED
343 echo "askconsent final = ${PROCEED}: for $FAIL" >> "$LOG"
344 case $PROCEED in
345 [Yy] | [Yy][Ee][Ss])
346 return 0; # successful:
347 echo "*** You (or ApG) have elected to use a prepatched copy of $FAIL ***" >> "$LOG"
350 return 1; # error
351 echo "*** You have declined to insert $FAIL by not answering 'yes' at the prompt. ***" >> "$LOG"
353 esac
356 replace_updater () {
358 # Function for devices that use SDcard installs. Also to be tested for CM7
359 # since CM7 seems to use an updater-script that wipes EMMC. Testing
361 \rm $UPDATER_LOC/$UPDS
362 \cp patches/common/$UPDATER_LOC/$UPDS $UPDATER_LOC
363 echo "run_program(\"/sbin/busybox\", \"umount\", \"/system\");" >> UPDATE.txt
364 cat UPDATE.txt >> $UPDATER_LOC/$UPDS
365 echo ""
366 echo "New updater-script being used:" >> "$LOG"
367 echo "-----------------------------" >> "$LOG"
368 cat $UPDATER_LOC/$UPDS >> "$LOG"
371 abspath () {
372 case `uname -s` in
373 CYGWIN*)
374 echo $(cygpath -ua "$1")
376 Darwin)
377 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
378 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
380 Linux)
381 echo $(readlink -f "$1")
384 if [[ ${1:0:1} == "/" ]]; then
385 echo "$1"
386 elif [[ ${1:0:2} == "./" ]]; then
387 echo "$PWD/${1:2}"
388 else
389 echo "$PWD/$1"
392 esac
395 mods_display () {
396 echo ""
397 echo "The Auto-Patcher $VERSION"
398 echo "*******************************"
399 echo ""
400 echo "The available mods are"
401 echo "****************************************************"
402 echo "* pdroid openpdroid voice v6supercharger *"
403 echo "* voice insecure secure external_internal *"
404 echo "* tabletUI 3gdongle pd2.0 *"
405 echo "****************************************************"
406 echo ""
407 echo "To find out more about any mod, simply enter:"
408 echo " ./auto_patcher -h <MODNAME>"
409 echo ""
410 cleanup
413 mods_info () {
414 DEPENDENCY="None" # default
415 DEV="Unknown" # default
416 CEILING=$CURRENT_ANDROID # Default is that everything works...we'll see.
417 case $PID in
418 mods)
419 mods_display
420 exit
422 auto*)
423 echo ""
424 echo "**************************************"
425 echo "The Auto-Patcher ate a kitten once..."
426 echo "**************************************"
427 printusage_help
429 advanced)
430 cd patches/
431 (advanced_help && find -H * -name 2012*) | more -d
432 echo ""
433 brief_help
435 voice)
436 FLOOR=4.0.0
437 DESC="Use on wifi-only tablets to have the software register as 'voice-enabled'. Allows VOIP like Google Voice to function."
438 DESC="bongostl's setup method here: http://forum.xda-developers.com/showthread.php?t=1823701"
439 DEV="bongostl"
442 v6supercharger)
443 FLOOR=4.0.0
444 CEILING=4.2.1
445 DESC="A memory-management tool. It requires smali edits for Android roms 4.0+."
446 DESC1="The Auto-Patcher applies all 50+ edits recommended by the dev."
447 DEV="Zeppelinrox"
448 DEPENDENCY="The V6 Supercharger Script. Get it at http://forum.xda-developers.com/showthread.php?t=991276/"
450 pdroid)
451 FLOOR=2.3.7
452 CEILING=4.1.2
453 DESC="Security Software that safely manages permissions w/o causing FC's. No longer under development. Try the open-source expansion of this program, PDroid Manager."
454 DESC1="(It's the 'openpdroid' mod within the Auto-Patcher)."
455 DEV="Svyat"
456 DEPENDENCY="The Pdroid app. You can get it at http://forum.xda-developers.com/showthread.php?t=1923576"
458 pd2.0)
459 FLOOR=4.1.2
460 CEILING=4.1.2
461 DESC="An expansion of the PDroid application/framework."
462 DEV="CollegeDev"
463 DEPENDENCY="The free PDroid2.0 app available at http://forum.xda-developers.com/showthread.php?t=1923576"
465 openpdroid)
466 FLOOR=4.1.2
467 CEILING=4.2.1
468 DESC="A fork of the open-source PDroid and Pdroid2.0 framework."
469 DEV="FFU5y/wbedard/mateorod/Community"
470 DEPENDENCY="The PDroidManager app freely available from Google Play or http://forum.xda-developers.com/showthread.php?t=1994860"
472 opendroid)
473 echo ""
474 echo "No mod named 'opendroid'. You probably mean 'openpdroid'. Try again."
475 PID="mods"
476 mods_info
478 external_internal)
479 FLOOR=2.3.3
480 DESC="Swap internal and external storage."
482 insecure)
483 FLOOR=2.3.3
484 DESC="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
486 secure)
487 FLOOR=2.3.3
488 DESC="Make any boot.img secure."
490 3gdongle)
491 FLOOR=4.1.0
492 CEILING=4.2.1
493 DESC="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
494 DEV="trevd"
495 DEPENDENCY="None, but read the troubleshooting guide at http://forum.xda-developers.com/showthread.php?t=1798631"
497 tabletUI)
498 FLOOR=4.1.0
499 CEILING=4.1.2
500 DESC="Changes the user interface of Phones and Phablets to the popular Tablet UI."
501 DEV="barmullio"
503 esac
504 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
505 NVID=${VID//[.]/}
506 COMPATF=${FLOOR//[.]/}
507 COMPATC=${CEILING//[.]/}
510 apk_check () {
511 if [ -f patches/$P/$A/$R/$B/$FILE ]; then
512 echo "... Patching $APK failed, but we will copy over a prepatched file ..."
513 \cp -av patches/$P/$A/$R/$B/$FILE $FILE >> "$LOG"
514 else
515 print_error "failed patching $APK!!!"
518 compat_check () {
519 for P in ${PID[@]}; do
520 mods_info
521 if [[ "$NVID" -lt "$COMPAT" ]]; then
522 mismatch_error "Your Android $VID rom is too old! The minimum for $P is Android $FLOOR!"
524 if [[ "$NVID" -gt "$COMPATC" ]]; then
525 mismatch_error "Sorry, $P has not been made available for Android $VID yet!"
527 done
529 extpath () {
530 case `uname -s` in
531 CYGWIN*)
532 echo $(cygpath -da "$1")
535 echo $(abspath "$1")
537 esac
540 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
542 parse () { echo "${1%%_*}"; }
544 getbuildprop () {
545 if [ -f system/build.prop ]; then
546 result=(`grep $1 system/build.prop | tr -d '\r' | tr '=' ' '`)
547 echo "${result[1]}"
548 else
549 echo ""
554 aosp_mod_check() {
555 jar -xvf "$ROMX" system/framework/framework2.jar >> $LOG
556 if [ -s system/framework/framework2.jar ]; then
557 ever_check
558 else
559 AOSP=aosp-jb
563 ever_check() {
564 MID=$(getbuildprop ro.build.romversion)
565 if [[ "$MID" == "Evervolv"* ]]; then
566 AOSP=aosp-ever
567 else
568 MID=$(getbuildprop ro.build.display.id)
569 if [[ "$MID" == "ev"* ]]; then
570 AOSP=aosp-ever
571 else
572 AOSP=aosp-mod
577 pa_check() {
578 CMID=$(getbuildprop ro.modversion)
579 PAID=$(getbuildprop ro.pa.version)
580 MID=$(getbuildprop ro.build.display.id)
581 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
582 DID=$(getbuildprop ro.product.device)
583 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
584 if [[ -n $PAID ]]; then
585 RID=pa
586 else
587 case $CMID in
588 [Pp][Aa]*)
589 RID=pa;
592 RID=cm;
594 esac
598 proberom () {
599 VID=$(getbuildprop ro.build.version.release)
600 if [ ${#VID} -lt 4 ]; then # in case of non-standard versioning in build.prop (defy!)
601 ANDR=$VID
602 else
603 ANDR="${VID%.*}" # Cut to 1 significant digit to cover specific range or release.
605 if [ "$ANDR" == "2.3" ]; then
606 FLAVR=gingerbread
607 API=10
608 RID=cm;
609 elif [ "$ANDR" == "4.0" ]; then
610 FLAVR=ics
611 API=15
612 MID=$(getbuildprop ro.rommanager.developerid)
613 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
614 DID=$(getbuildprop ro.product.device)
615 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
617 case "$MID" in
618 pa|cm9|cm|cyanogenmod*)
619 RID=cm;
621 aokp|teamkang)
622 RID=aokp;
624 aosp*)
625 RID=aosp;
628 echo "!!! $MID is not supported yet, trying generic latest !!!"
630 esac
631 elif [ "$ANDR" == "4.1" ]; then
632 FLAVR=jellybean
633 API=16
634 CMID=$(getbuildprop ro.cm.version)
635 if [[ -n $CMID ]]; then
636 pa_check
637 else
638 MID=$(getbuildprop ro.build.display.id)
639 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
640 DID=$(getbuildprop ro.product.device)
641 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
642 case "$MID" in
643 cm10|cm*|cyanogenmod*)
644 RID=cm;
646 aokp*|teamkang)
647 RID=aokp;
649 pa*)
650 RID=pa;
652 ev*)
653 RID=aosp-ever;
656 RID=`aosp_mod_check`;
658 esac
660 elif [ "$ANDR" == "4.2" ]; then
661 FLAVR=jellybean
662 API=17
663 CMID=$(getbuildprop ro.cm.version)
664 MID=$(getbuildprop ro.build.display.id)
665 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
666 DID=$(getbuildprop ro.product.device)
667 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
669 case "$MID" in
670 cm10|cm*|cyanogenmod*)
671 RID=cm;
673 aokp*|teamkang)
674 RID=aokp;
676 pa*) # Defaults to cm for now, since there is a chance we can patch forks
677 echo""
678 sleep 1
679 echo "There is no pa patch for 4.2 at this time..."
680 sleep 1
681 echo " b/c the paranoid Android source for 4.2 is still closed."
682 sleep 2
683 echo ""
684 printtask "### The Auto-Patcher is going to try the 'cm' patches... ###"
685 sleep 1
686 echo ""
687 echo " you might also try manually applying the 'aosp' patches."
688 sleep 2
689 echo ""
690 echo "Try ./auto_patcher -h for help if you need it."
691 sleep 3
692 echo ""
693 RID=cm;
696 RID=aosp;
698 esac
699 else
700 print_error "unknown ROM version $VID"
702 echo "... result of ROM check: version= $VID rom= $RID ..."
705 # Advanced build date query
706 # This should set the patch date automatically.
708 build_query() {
709 UTC=$(getbuildprop ro.build.date.utc)
711 # Difference in how OS X and Linux/Cygwin handles 'date' utility
712 case `uname -s` in
713 [Dd]arwin)
714 BDID=`date -r $UTC +%Y%m%d`
715 echo "#### Darwin Build Query used ####" >> "$LOG"
718 BDID=`date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d"`
719 echo "#### Standard Build Query ####" >> "$LOG"
721 esac
723 # If patch date is specified on CLI, use that patch date
724 if [ $# -gt 3 ]; then
725 BID=${4//,/ };
726 BDID=$BID
727 else
728 case $ANDR in
729 gingerbread)
730 # CM7 roms do not have UTC time stamp- so no build query.
731 BID=latest;
732 echo "*** CM7 roms default to latest patches. If using an older rom ***"
733 echo "*** specify patch date on command line. Use -h to see available patches ***"
736 for P in ${PID[@]}; do
737 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
738 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
739 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
740 PAR=patches/$P/$A/$R
741 PARB=patches/$P/$A/$R/$B
742 DATES=`ls patches/$P/$A/$R/ | grep '201*'`
743 # Intialize variable - High so as to determine lowest in first loop.
744 BID=20201231
745 # find earliest available patch date
746 for i in $DATES; do
747 if [[ $i -lt $BID ]]; then
748 BID=$i
750 done
751 # Check if earliest patches are from before build date. Else use earliest
753 # If older than earliest patch set, then find best match
754 if [[ $(($BID-$BDID)) -lt 0 ]]; then
755 for g in $DATES; do
756 # use any patch that matches $UTC
757 if [[ $(($BDID-$g)) -eq 0 ]]; then
758 BID=$g
759 break
760 # Set highest $BID w/o going over $UTC
761 elif [[ $(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
762 BID=$g
764 done
766 echo "... $PID patch date has been set to: $BID ..."
767 B=$BID
768 break
769 done
771 esac
775 proberil () {
776 RIL=$(getbuildprop ro.telephony.ril_class)
777 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
780 rominfo () {
781 echo "# VER= $VERSION" >> "$LOG"
782 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
783 echo "# VID= $VID" >> "$LOG"
784 echo "# PID= ${PID[@]}" >> "$LOG"
785 echo "# MID= $MID" >> "$LOG"
786 echo "# RID= $RID" >> "$LOG"
787 echo "# ANDR= $ANDR" >> "$LOG"
788 echo "# BDID= $BDID" >> "$LOG"
789 echo "# DID= $DID" >> "$LOG"
790 echo "# BID= $BID" >> "$LOG"
794 if [[ $1 == -h ]]; then
795 if [ $# -gt 1 ]; then
796 PID=$2
797 mods_info
798 echo ""
799 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
800 echo "*************************************************"
801 echo ""
802 echo "Mod Name: $PID"
803 echo ""
804 echo " $DESC"
805 if [[ $((DESC1)) -gt 0 ]]; then # test to see is there is a second DESC line
806 echo "$DESC1"
808 if [[ $((DESC2)) -gt 0 ]]; then
809 echo "$DESC2"
811 echo ""
812 echo "Developer: $DEV"
813 echo "Dependancies: $DEPENDENCY"
814 echo ""
815 echo "Works on ROMs from Android $FLOOR -> $CEILING"
816 echo
817 brief_help
818 exit
822 [[ $# -lt 1 || -z $1 ]] && PID="mods" && mods_info
823 [[ $1 == "-h" ]] && usage_help | less && display_help
825 echo ""
826 echo "The Auto-Patcher $VERSION"
827 echo ""
828 # by pastime1971 and mateorod
830 ROOT=$(abspath `dirname "$0"`)
831 TOOL="$ROOT/patch_tools.tgz"
832 PTCH="$ROOT/patch_patches.tgz"
833 ROM=$(abspath "$1")
834 ROMX=$(extpath "$1")
836 if [[ $OSTYPE == "cygwin" ]]; then
837 EXE=".exe"
838 PGFORM="0x"
841 DATE=`date +%Y%m%d%H%M%S`
842 TEMP=$(abspath ./tmp$DATE)
843 LOG=$(abspath ./log$DATE.txt)
844 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
845 echo "ROOT= $ROOT" >> "$LOG"
846 echo "TOOL= $TOOL" >> "$LOG"
847 echo "ROM= $ROM" >> "$LOG"
848 echo "ROMX= $ROMX" >> "$LOG"
850 \rm -f $RESTORE.zip $UPDATE.zip
852 CHK=$(getconf LONG_BIT)
853 if [[ $CHK = "64" ]]; then
854 BIT=64
855 else [[ $BIT = "32" ]];
856 BIT=32
860 printtask "### verify tools ###"
861 which patch >> "$LOG" || misstools_error "Missing \"patch\" utility."
862 which tar >> "$LOG" || misstools_error "Missing \"tar\" utility"
863 which jar >> "$LOG" || misstools_error "Missing \"Java Development Kit\" (JDK)"
864 which java >> "$LOG" || misstools_error "Missing \"Java Development Kit\" (JDK)"
865 which cpio >> "$LOG" || misstools_error "Missing \"cpio\" utility"
866 [ -f "$TOOL" ] || misspatch_error "patch_tool.tgz is missing"
867 [ -f "$PTCH" ] || misspatch_error "patch_patches.tgz is missing"
868 printtask "### verify ROM ###"
869 [ -f "$ROM" ] || print_error "Cannot find $1!! Make sure you have the location and name right"
870 echo "### running $0 $@" >> "$LOG"
871 mkdir "$TEMP"
872 cd "$TEMP"
874 PATH="$TEMP:$PATH"
875 export PATH
876 echo "PATH= $PATH" >> "$LOG"
878 printtask "### unzip patch tools ###"
879 tar xzf "$TOOL" > /dev/null || print_error "failed extracting tools !!!"
881 # Get OS specific tools
882 case `uname -s` in
883 CYGWIN*)
884 \mv cygwin/aapt.exe .
885 \mv cygwin/*.exe boot/
886 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
888 [Dd]arwin)
889 \mv mac/aapt .
891 [Ll]inux)
892 \mv linux/aapt .
895 \mv linux/aapt .
897 esac
898 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
899 chmod a+x aapt$EXE
901 printtask "### unzip patch patches ###"
902 tar xzf "$PTCH" > /dev/null || print_error "failed extracting patches !!!"
904 # we need build.prop for both RIL probing and ROM probing
905 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || print_error "failed extracting build.prop from $ROMX !!!"
907 # rom + ril type
908 proberil
909 printtask "### probe rom type ###"
910 proberom
912 # rom type
913 if [ $# -gt 1 ]; then
914 PIT=$2
915 if [[ "$PIT" = "-h" ]]; then
916 display_help
919 if [ $# -gt 2 ]; then
920 RID=$3
921 case "$RID" in
922 cm10|cm*|cyanogenmod*)
924 aokp*|teamkang)
925 RID=aokp;
927 pa*)
928 RID=pa;
930 aosp-ever)
931 RID=aosp-ever;
933 aosp*)
934 case "ANDR" in
935 4.1)
936 RID=`aosp_mod_check`;
939 RID=aosp
941 esac
943 201*)
944 date_error "You must specify ROMTYPE if designating a patch date!!"
947 rom_error "$RID is not a valid ROMTYPE!!"
949 esac
950 echo "... Using $RID patches ..."
951 else
952 echo "... Using results of ROM check ..."
955 # patch type
956 if [ $# -gt 1 ]; then
957 PIL=${2//,/ } # If more than one mod, make string separated by spaces
958 else
959 PIL="openpdroid"
960 echo "No mods selected. Defaulting to openpdroid, since that's what you probably want..."
963 PID=(${PIL// / }) # turn string into array
964 COPYPID=("${PID[@]}") # working copy to iterate over
965 MODS_NUMBER=${#COPYPID[@]} # number of elements (mods)
967 if [[ $MODS_NUMBER > 1 ]]; then
968 INDEX=0
969 for p in ${COPYPID[@]}; do
970 if [ "$p" = "pdroid" ] || [ "$p" = "pd2.0" ] ||[ "$p" = "openpdroid" ]; then
971 SPID[0]=$p
972 unset COPYPID["$INDEX"]
973 break
974 else
975 INDEX=$((INDEX + 1))
977 done
978 for p in ${COPYPID[@]}; do
979 if [ "$p" = "pdroid" ] || [ $p = "pd2.0" ] ||[ $p = "openpdroid" ]; then
980 conflict_error "Those mods conflict! Only one pdroid mod at a time!"
981 else
982 i=${#SPID[@]}
983 SPID[i]=$p
984 i+=1
986 done
987 else
988 SPID=${COPYPID[@]}
990 for P in ${PIL[@]}; do
991 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
992 done
994 # Check to make sure selected roms are available for the Android version of patched ROM
995 compat_check
997 # Build date
998 if [ $# -gt 3 ]; then # if a date is specified on command line...
1000 # Set date to match argument and ensure that patches with that date exist
1001 BID=$4
1002 [ -d patches/$P/$A/$R/$BID ] || print_error "No $P patches for $RID on $BID!! Try the help menu!!"
1004 # Run build_query- this overrides the above but gets useful info
1005 build_query
1006 # Reset patch date to argument
1007 BID=$4
1008 echo "... $PID patch date set manually to: $BID ..."
1009 else
1010 build_query # if no date specified, use one from build_query
1013 # echo ROM info
1014 rominfo
1016 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
1017 #Although this placement may be perfect for romfilter. although it throws the scheme...
1018 display_help
1020 #Begin cycle
1022 for P in ${PID[@]}; do
1023 [ -d patches/$P ] || print_error "$P is not available"
1024 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1025 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1026 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1028 unset FILES
1029 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1030 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1031 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1032 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1033 for FILE in ${FILES[@]}; do
1034 case "$FILE" in
1035 +system/*)
1036 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
1038 -system/*)
1039 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
1041 system/*.jar)
1042 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
1043 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1045 system/*.apk)
1046 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
1047 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1049 *.img)
1050 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
1052 system/*)
1053 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
1055 esac
1056 done
1057 done
1058 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
1059 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
1060 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
1061 echo "### APK FILES= ${AID[@]}" >> "$LOG"
1062 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
1063 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
1065 # extract system files
1066 printtask "### unzip rom ###"
1067 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || print_error "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
1070 # Update/Restore.zip scripts and prep
1071 printtask "### create updater script ###"
1072 UPDATER_LOC=META-INF/com/google/android
1073 UPDS=updater-script
1074 UPDATE="update-$RID-$DID-$BDID-${PIL// /-}"
1075 RESTORE="restore-$RID-$DID-$BDID"
1077 jar -xvf "$ROMX" $UPDATER_LOC/$UPDS $UPDATER_LOC/update-binary
1078 jar -xvf "$ROMX" $UPDATER_LOC/update-binary-installer 1> /dev/null 2> /dev/null
1080 # Determine Installer- Aroma or ClockworkMod
1081 if [ -f $UPDATER_LOC/update-binary-installer ]; then
1082 printtask "... using Aroma installer ..."
1083 \mv $UPDATER_LOC/update-binary-installer $UPDATER_LOC/update-binary
1084 else
1085 printtask "... using Clockworkmod installer ..."
1088 # Create updater scripts
1089 cat patches/common/updater-message.txt >> $UPDS
1090 cat $UPDATER_LOC/$UPDS | grep ^mount | grep "/system" | head -n 1 >> $UPDS
1091 [ -s $UPDS ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" >> $UPDS
1092 # restore the original
1093 for FILE in ${EID[@]}; do
1094 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
1095 done
1096 # replace with the original or delete it
1097 for FILE in ${CID[@]}; do
1098 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> $UPDS
1099 done
1100 echo "package_extract_dir(\"system\", \"/system\");" >> $UPDS
1101 # permission management for files that need specific perms
1102 cat $UPDATER_LOC/$UPDS | grep set_perm | grep "/system" >> $UPDS
1103 for P in ${PID[@]}; do
1104 if [ -s patches/$P/$A/set_perm.txt ]; then
1105 echo "...setting permissions..."
1106 cat patches/$P/$A/set_perm.txt >> $UPDS
1108 done
1109 cat $UPDATER_LOC/$UPDS | grep ^unmount | grep "/system" | head -n 1 >> $UPDS
1110 [[ ${IID[@]} =~ boot.img ]] && cat $UPDATER_LOC/$UPDS | grep "boot.img" >> $UPDS
1111 echo "ui_print(\" .\");" >> $UPDS
1112 echo "ui_print(\" .\");" >> $UPDS
1113 echo "ui_print(\" done!\");" >> $UPDS
1114 cat $UPDS > $UPDATER_LOC/$UPDS
1115 echo "# generated $UPDS" >> "$LOG"
1116 cat $UPDS >> "$LOG"
1118 printtask "### create restore.zip ###"
1119 jar -cvf tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
1120 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
1121 \mv signed.zip $RESTORE.zip
1122 \rm -f tmp.zip
1125 # Begin patching process
1127 # decompile system files
1128 printtask "### decompile system files ###"
1129 for FILE in ${JID[@]}; do
1130 JAR=${FILE##*/}
1131 printtask "... decompile $JAR ..."
1132 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
1133 if [ $FILE == "system/framework/framework.jar" ]; then
1134 printtask "... extract preloaded-classes ..."
1135 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
1136 \mv preloaded-classes tmp/${FILE}.out/
1138 done
1140 # install framework-files for APK...
1141 if [ ${#AID[@]} -gt 0 ]; then
1142 jar -xvf "$ROMX" system/framework/framework-res.apk >> "$LOG"
1143 printtask "... installing framework files ..."
1144 java -jar apktool.jar if system/framework/framework-res.apk
1145 # Decompile APKs
1146 for FILE in ${AID[@]}; do
1147 APK=${FILE##*/}
1148 if [ -f $FILE ]; then
1149 printtask "... decompile $APK ..."
1150 java -jar apktool.jar d -f $FILE tmp/$FILE.out
1152 done
1155 # Unpack image files {boot.img only so far...}
1156 for FILE in ${IID[@]}; do
1157 printtask "### unpacking $FILE ###"
1158 case "$FILE" in
1159 boot.img)
1160 if [ -f boot.img ]; then
1161 cd boot
1162 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
1163 mkdir ramdisk
1164 cd ramdisk
1165 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
1166 cd ../../
1167 else
1168 print_error "A mod needs to patch boot.img! This rom does not contains boot.img."
1172 print_error "cannot process $FILE"
1174 esac
1175 done
1177 # apply system modification
1179 for P in ${PID[@]}; do
1180 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1181 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1182 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1183 PAR=patches/$P/$A/$R
1184 PARB=patches/$P/$A/$R/$B
1186 unset FILES COPY DELS JARS APKS IMGS TXTS
1187 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1188 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1189 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1190 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1191 for FILE in ${FILES[@]}; do
1192 case $FILE in
1193 +system/*)
1194 COPY=(${COPY[@]} ${FILE:1})
1196 -system/*)
1197 DELS=(${DELS[@]} ${FILE:1})
1199 system/*.jar)
1200 JARS=(${JARS[@]} $FILE)
1202 system/*.apk)
1203 APKS=(${APKS[@]} $FILE)
1205 *.img)
1206 IMGS=(${IMGS[@]} $FILE)
1208 system/*)
1209 TXTS=(${TXTS[@]} $FILE)
1211 esac
1212 done
1214 [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$A/$R/$B ###"
1215 for FILE in ${COPY[@]}; do
1216 printtask "... copying $FILE ..."
1217 DEST=${FILE%/*}
1218 mkdir -p ./$DEST
1219 if [ -e patches/$P/$A/$R/$B/$FILE ]; then
1220 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
1221 \cp -av patches/$P/$A/$R/$B/$FILE ./$DEST >> "$LOG"
1222 else
1223 print_error "$FILE is missing in the patch. Please upload your logfile to the support thread!"
1225 done
1227 # unconditional smali copying- For particularly troublesome files
1228 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
1229 [ -f patches/$P/$A/smali.txt ] && SMALI=$(cat patches/$P/$A/smali.txt)
1230 [ -f patches/$P/$A/$R/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/smali.txt)
1231 [ -f patches/$P/$A/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/$B/smali.txt)
1232 MOVE=${SMALI##*/}
1233 for SMALI in ${SMALI[@]}; do
1234 if [ -f patches/$P/$A/$R/provisionals/$SMALI ]; then
1235 printtask "... overwriting $MOVE ..."
1236 \cp -a patches/$P/$ANDR/$R/provisionals/$SMALI tmp/$SMALI >> "$LOG"
1237 elif [ -f patches/$P/$A/provisionals/$SMALI ]; then
1238 printtask "... overwriting $MOVE ..."
1239 \cp -a patches/$P/$ANDR/provisionals/$SMALI tmp/$SMALI >> "$LOG"
1241 done
1243 [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$A/$R/$B ###"
1244 for FILE in ${DELS[@]}; do
1245 printtask "... deleting $FILE ..."
1246 \rm -rf ./$FILE
1247 done
1248 [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$A/$R/$B ###"
1249 for FILE in ${JARS[@]}; do
1250 JAR=${FILE##*/}
1251 NAME=${JAR%.jar}
1252 printtask "... apply $NAME.patch ..."
1253 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
1254 cat ${JAR}.log | tee -a "$LOG"
1255 case "$NAME" in
1256 framework)
1257 # patch preloaded-classes only if a patch exists
1258 if [ -f $PARB/preloaded.patch ]; then
1259 printtask "... apply preloaded.patch ..."
1260 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
1261 cat preloaded.log | tee -a "$LOG"
1262 [[ `grep FAILED preloaded.log` != "" ]] && print_error "failed preloaded.patch"
1266 echo -n "" # do nothing else
1268 esac
1269 # substitute failed smali with provisional (a prepatched smali file)
1270 unset FAILS
1271 FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'`)
1272 if [[ -n ${FAILS[@]} ]]; then
1273 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
1274 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
1275 for FAIL in ${FAILS[@]}; do
1276 PROVISIONAL="patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL}"
1277 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1278 #cat tmp/$FILE.out/smali/${FAIL}.rej >> "$LOG" # FOR DEBUGGING
1279 [[ ${SID[@]} =~ $FAIL ]] && print_error "$FAIL was already replaced before"
1280 [ -f "$PROVISIONAL" ] || print_error "failed $FAIL in $JAR cannot be remedied"
1281 copyfailed
1282 printtask "... replace $FAIL ..."
1283 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
1284 \cp -av "$PROVISIONAL" tmp/${FILE}.out/smali/${FAIL} >> "$LOG"
1285 SID=(${SID[@]} $FAIL)
1286 done
1288 [[ `grep FAILED ${JAR}.log` != "" ]] && print_error "failed $NAME.patch"
1289 garbage tmp/${FILE}.out
1291 # run special $JAR.sh scripts if any JAR needs special attention
1292 if [ -f patches/$P/$A/$R/$B/${JAR}.sh ]; then
1293 printtask "... apply $JAR.sh ..."
1294 . patches/$P/$A/$R/$B/${JAR}.sh 2>&1 > ${JAR}.log
1295 cat ${JAR}.log | tee -a "$LOG"
1297 done
1299 [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$A/$R/$B ###"
1300 for FILE in ${APKS[@]}; do
1301 APK=${FILE##*/}
1302 if [ -d "tmp/${FILE}.out" ] ; then
1303 printtask "... apply $APK.patch ..."
1304 patch -Nls -p2 -d tmp/${FILE}.out < $PARB/${APK}.patch 2>&1 >> ${APK}.log
1305 cat ${APK}.log | tee -a "$LOG"
1306 [[ `grep FAILED ${APK}.log` != "" ]] && apk_check
1307 garbage tmp/${FILE}.out
1308 else
1309 echo "No $APK in your ROM. Not able to patch this file."
1310 echo "## No $APK in ROM ###" >> "$LOG"
1312 done
1313 [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$A/$R/$B ###"
1314 for FILE in ${IMGS[@]}; do
1315 IMG=${FILE##*/}
1316 printtask "... applying $IMG.patch ..."
1317 patch -Nls -p1 -d boot/ramdisk < $PARB/${IMG}.patch >> "$LOG" || print_error "failed patching $FILE"
1318 done
1320 # Text Editing Functions --this can really do just about anything. Needs a working restore!
1321 [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$A/$R/$B ###"
1322 for FILE in ${TXTS[@]}; do
1323 TXT=${FILE##*/}
1324 if [[ -f $PARB/${TXT}.patch ]]; then
1325 printtask "... apply $TXT.patch ..."
1326 patch -Nls -p2 -d system/ < $PARB/${TXT}.patch 2>&1 > ${TXT}.log
1327 #cat ${TXT}.log | tee -a "$LOG"
1328 [[ `grep FAILED ${TXT}.log` != "" ]] && print_error "failed $TXT.patch"
1330 if [[ -f $PAR/${TXT}.awk ]]; then
1331 printtask "... apply $TXT.awk ..."
1332 awk -f $PAR/${TXT}.awk $FILE > text || print_error "failed $TXT.awk"
1333 mv text $FILE
1335 if [[ -f $PAR/${TXT}.sed ]]; then
1336 printtask "... apply $TXT.sed ..."
1337 sed -f $PAR/${TXT}.sed $FILE > text || print_error "failed $TXT.sed"
1338 mv text $FILE
1340 if [[ -f $PAR/${TXT}.sh ]]; then
1341 printtask "... apply $TXT.sh ..."
1342 . $PAR/${TXT}.sh 2>&1 >> ${TXT}.log || print_error "failed $TXT.sh"
1344 garbage system/
1345 done
1346 done
1348 # Device specific scripts- Placement is up-for-review
1349 if [ -f patches/devices/$DID/$DID.sh ]; then
1350 . patches/devices/$DID/$DID.sh
1353 # Replace updater-script for CM7- it formats system -Testing
1354 if [ "$ANDR" == "gingerbread" ]; then
1355 replace_updater
1358 # Rebuilding system files
1360 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
1361 for FILE in ${JID[@]}; do
1362 JAR=${FILE##*/}
1363 printtask "... rebuild $JAR ..."
1364 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
1365 [ -f tmp/${FILE}.out/classes.dex ] || smali_error "failed compiling $JAR !!!"
1366 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
1367 if [ $FILE == "system/framework/framework.jar" ]; then
1368 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
1370 done
1372 [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
1373 for FILE in ${AID[@]}; do
1374 APK=${FILE##*/}
1375 if [ -d tmp/${FILE}.out ]; then
1376 printtask "... rebuild $APK ..."
1377 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || print_error "failed compiling $FILE !!!"
1378 jar -uvf $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
1380 done
1382 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
1383 for FILE in ${IID[@]}; do
1384 printtask "### rebuild $FILE ###"
1385 case $FILE in
1386 boot.img)
1387 # Rebuilding boot.img
1388 cd boot
1389 printtask "... rebuilding ramdisk ..."
1390 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
1392 printtask "... composing boot.img ..."
1393 BASE=$(cat boot.img-base)
1394 # hex to decimal in cygwin prefixing "0x" w/ C arithmetic
1395 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
1396 CMDLINE=$(cat boot.img-cmdline)
1397 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
1398 echo "pagesize = $PGSIZE" >> "$LOG"
1399 echo "base = $BASE" >> "$LOG"
1400 printtask "... rebuilding boot.img ..."
1401 ./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"
1402 cd ..
1405 print_error "cannot process $FILE"
1407 esac
1408 done
1410 printtask "### create $UPDATE.zip ###"
1411 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
1412 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip $UPDATE.zip 2>> "$LOG"
1414 \mv $RESTORE.zip $UPDATE.zip ..
1415 echo "### finished ###"
1416 echo "flash $UPDATE.zip to install the patched files"
1417 echo "flash $RESTORE.zip to restore the original system"
1419 # add announcement- optional.
1420 for P in ${PID[@]}; do
1421 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1422 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1423 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1424 if [ -f patches/$P/$A/$R/$B/README.txt ]; then
1425 cat patches/$P/$A/$R/$B/README.txt
1426 elif [ -f patches/$P/$A/$R/README.txt ]; then
1427 cat patches/$P/$A/$R/README.txt
1428 elif [ -f patches/$P/$A/README.txt ]; then
1429 cat patches/$P/$A/README.txt
1431 done
1433 cd ..
1434 \rm -rf "$TEMP"