Edit openpdroid and pd2.0 blurbs
[auto-patcher.git] / auto_patcher
blob8f883ba3ab442bc9a891ccf82af4e518e5347852
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 conflict_error () {
266 # For conflicting packages
267 echo ""
268 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
269 printtask "!!! error: $@"
270 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
271 cleanup
272 PID=mods
273 mods_info
276 misspatch_error () {
277 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
278 printtask "!! error: $@ "
279 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
280 echo ""
281 printtask "!! The Auto-Patcher could not find its patches and/or tools!"
282 echo ""
283 echo "* Did you run ./batch.sh first?"
284 echo ""
285 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
286 echo " one way or another..."
287 echo ""
288 cleanup
289 printusage_help
292 misstools_error () {
293 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
294 printtask "!! error: $@ "
295 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
296 printtask "Your set-up is missing a dependency."
297 echo "We require JDK, patch and cpio."
298 echo ""
299 echo ""
300 echo "Each distro is different"
301 echo "but you must ensure you have them all installed and try again."
302 echo ""
303 cleanup
304 printusage_help
307 printtask () {
308 echo "" >> "$LOG"
309 echo $@ | tee -a "$LOG"
312 copyfailed () {
313 echo ""
314 printtask "File for which patching failed:"
315 printtask "---------------------------------------------"
316 echo ""
317 printtask "${FAIL##*/}"
318 echo ""
319 echo "---------------------------------------------"
320 echo ""
321 echo "We can try to add a premade copy of those files."
322 echo "This sometimes works."
323 echo ""
324 echo "But IT MAY NOT WORK!!!"
325 echo ""
326 echo ""
327 askconsent && return 0 || return 1
330 askconsent () {
331 sleep 1
332 echo -n "Do you want to proceed ? (YES/no) "
333 read PROCEED
334 echo "askconsent final = ${PROCEED}: for $FAIL" >> "$LOG"
335 case $PROCEED in
336 [Yy] | [Yy][Ee][Ss])
337 return 0; # successful:
338 echo "*** You (or ApG) have elected to use a prepatched copy of $FAIL ***" >> "$LOG"
341 return 1; # error
342 echo "*** You have declined to insert $FAIL by not answering 'yes' at the prompt. ***" >> "$LOG"
344 esac
347 replace_updater () {
349 # Function for devices that use SDcard installs. Also to be tested for CM7
350 # since CM7 seems to use an updater-script that wipes EMMC. Testing
352 UPDIR=META-INF/com/google/android
353 \rm $UPDIR/updater-script
354 \cp patches/common/$UPDIR/updater-script $UPDIR
355 echo "run_program(\"/sbin/busybox\", \"umount\", \"/system\");" >> UPDATE.txt
356 cat UPDATE.txt >> $UPDIR/updater-script
357 echo ""
358 echo "New updater-script being used:" >> "$LOG"
359 echo "-----------------------------" >> "$LOG"
360 cat $UPDIR/updater-script >> "$LOG"
363 abspath () {
364 case `uname -s` in
365 CYGWIN*)
366 echo $(cygpath -ua "$1")
368 Darwin)
369 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
370 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
372 Linux)
373 echo $(readlink -f "$1")
376 if [[ ${1:0:1} == "/" ]]; then
377 echo "$1"
378 elif [[ ${1:0:2} == "./" ]]; then
379 echo "$PWD/${1:2}"
380 else
381 echo "$PWD/$1"
384 esac
387 mods_info () {
388 CEILING=$CURRENT_ANDROID # Default is that everything works...we'll see.
389 case $PID in
390 mods)
391 echo ""
392 echo "The Auto-Patcher $VERSION"
393 echo "*******************************"
394 echo ""
395 echo "The available mods are"
396 echo "****************************************************"
397 echo "* pdroid openpdroid voice v6supercharger *"
398 echo "* voice insecure secure external_internal *"
399 echo "* tabletUI 3gdongle pd2.0 *"
400 echo "****************************************************"
401 echo ""
402 echo "To find out more about any mod, simply enter:"
403 echo " ./auto_patcher -h <MODNAME>"
404 echo ""
405 echo " For usage info: ./auto_patcher -h"
406 echo ""
407 cleanup
408 exit
410 auto*)
411 echo ""
412 echo "**************************************"
413 echo "The Auto-Patcher ate a kitten once..."
414 echo "**************************************"
415 printusage_help
417 voice)
418 FLOOR=4.0.0
419 DESC="Use on wifi-only tablets to have the software register as 'voice-enabled'. Allows VOIP like Google Voice to function."
421 v6supercharger)
422 FLOOR=4.0.0
423 CEILING=4.2.1
424 DESC="A memory-management tool. It requires smali edits for Android roms 4.0+."
425 DESC1="The Auto-Patcher applies all 56 edits recommended by the dev."
426 DEV="Zeppelinrox"
427 DEPENDENCY="The V6 Supercharger Script. Get it at http://forum.xda-developers.com/showthread.php?t=991276/"
429 pdroid)
430 FLOOR=2.3.7
431 CEILING=4.1.2
432 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."
433 DESC1="(It's the 'openpdroid' mod within the Auto-Patcher)."
434 DEV="Svyat"
435 DEPENDENCY="The Pdroid app. You can get it at http://forum.xda-developers.com/showthread.php?t=1923576"
437 pd2.0)
438 FLOOR=4.1.2
439 CEILING=4.1.2
440 DESC="A fork of the open-source PDroid and Pdroid2.0 framework."
441 DEV="CollegeDev"
442 DEPENDENCY="The PDroid2.0 app available at http://forum.xda-developers.com/showthread.php?t=1923576"
444 openpdroid)
445 FLOOR=4.1.2
446 CEILING=4.2.1
447 DESC="An expansion of the PDroid application/framework."
448 DEV="FFU5y/Community"
449 DEPENDENCY="The PDroidManager app available from Google Play or http://forum.xda-developers.com/showthread.php?t=1994860"
451 opendroid)
452 echo ""
453 echo "No mod named 'opendroid'. You probably mean 'openpdroid'. Try again."
454 PID="mods"
455 mods_info
457 external_internal)
458 FLOOR=2.3.3
459 DESC="Swap internal and external storage."
461 insecure)
462 FLOOR=2.3.3
463 DESC="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
465 secure)
466 FLOOR=2.3.3
467 DESC="Make any boot.img secure."
469 3gdongle)
470 FLOOR=4.1.0
471 CEILING=4.2.1
472 DESC="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
473 DEV="trevd"
474 DEPENDENCY="None, but read the troubleshooting guide at http://forum.xda-developers.com/showthread.php?t=1798631"
476 tabletUI)
477 FLOOR=4.1.0
478 CEILING=4.1.2
479 DESC="Changes the user interface of Phones and Phablets to the popular Tablet UI."
480 DEV="barmullio"
482 esac
483 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
484 NVID=${VID//[.]/}
485 COMPATF=${FLOOR//[.]/}
486 COMPATC=${CEILING//[.]/}
489 apk_check () {
490 if [ -f patches/$P/$A/$R/$B/$FILE ]; then
491 echo "... Patching $APK failed, but we will copy over a prepatched file ..."
492 \cp -av patches/$P/$A/$R/$B/$FILE $FILE >> "$LOG"
493 else
494 print_error "failed patching $APK!!!"
497 compat_check () {
498 for P in ${PID[@]}; do
499 mods_info
500 if [[ "$NVID" -lt "$COMPAT" ]]; then
501 mismatch_error "Your Android $VID rom is too old! The minimum for $P is Android $FLOOR!"
503 if [[ "$NVID" -gt "$COMPATC" ]]; then
504 mismatch_error "Sorry, $P has not been made available for Android $VID yet!"
506 done
508 extpath () {
509 case `uname -s` in
510 CYGWIN*)
511 echo $(cygpath -da "$1")
514 echo $(abspath "$1")
516 esac
519 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
521 parse () { echo "${1%%_*}"; }
523 getbuildprop () {
524 if [ -f system/build.prop ]; then
525 result=(`grep $1 system/build.prop | tr -d '\r' | tr '=' ' '`)
526 echo "${result[1]}"
527 else
528 echo ""
533 aosp_mod_check() {
534 jar -xvf "$ROMX" system/framework/framework2.jar >> $LOG
535 if [ -s system/framework/framework2.jar ]; then
536 ever_check
537 else
538 AOSP=aosp-jb
542 ever_check() {
543 MID=$(getbuildprop ro.build.romversion)
544 if [[ "$MID" == "Evervolv"* ]]; then
545 AOSP=aosp-ever
546 else
547 MID=$(getbuildprop ro.build.display.id)
548 if [[ "$MID" == "ev"* ]]; then
549 AOSP=aosp-ever
550 else
551 AOSP=aosp-mod
556 pa_check() {
557 CMID=$(getbuildprop ro.modversion)
558 PAID=$(getbuildprop ro.pa.version)
559 MID=$(getbuildprop ro.build.display.id)
560 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
561 DID=$(getbuildprop ro.product.device)
562 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
563 if [[ -n $PAID ]]; then
564 RID=pa
565 else
566 case $CMID in
567 [Pp][Aa]*)
568 RID=pa;
571 RID=cm;
573 esac
577 proberom () {
578 VID=$(getbuildprop ro.build.version.release)
579 ANDR="${VID%.*}" # Cut flavor to 1 significant digit to cover specific range or release.
580 if [ "$ANDR" == "2.3" ]; then
581 FLAVR=gingerbread
582 API=10
583 RID=cm;
584 elif [ "$ANDR" == "4.0" ]; then
585 FLAVR=ics
586 API=15
587 MID=$(getbuildprop ro.rommanager.developerid)
588 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
589 DID=$(getbuildprop ro.product.device)
590 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
592 case "$MID" in
593 pa|cm9|cm|cyanogenmod*)
594 RID=cm;
596 aokp|teamkang)
597 RID=aokp;
599 aosp*)
600 RID=aosp;
603 echo "!!! $MID is not supported yet, trying generic latest !!!"
605 esac
606 elif [ "$ANDR" == "4.1" ]; then
607 FLAVR=jellybean
608 API=16
609 CMID=$(getbuildprop ro.cm.version)
610 if [[ -n $CMID ]]; then
611 pa_check
612 else
613 MID=$(getbuildprop ro.build.display.id)
614 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
615 DID=$(getbuildprop ro.product.device)
616 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
617 case "$MID" in
618 cm10|cm*|cyanogenmod*)
619 RID=cm;
621 aokp*|teamkang)
622 RID=aokp;
624 pa*)
625 RID=pa;
627 ev*)
628 RID=aosp-ever;
631 RID=`aosp_mod_check`;
633 esac
635 elif [ "$ANDR" == "4.2" ]; then
636 FLAVR=jellybean
637 API=17
638 CMID=$(getbuildprop ro.cm.version)
639 MID=$(getbuildprop ro.build.display.id)
640 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
641 DID=$(getbuildprop ro.product.device)
642 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
644 case "$MID" in
645 cm10|cm*|cyanogenmod*)
646 RID=cm;
648 aokp*|teamkang)
649 RID=aokp;
651 pa*) # Defaults to cm for now, since there is a chance we can patch forks
652 RID=cm;
655 RID=aosp;
657 esac
658 else
659 print_error "unknown ROM version $VID"
661 echo "... result of ROM check: version= $VID rom= $RID ..."
664 # Advanced build date query
665 # This should set the patch date automatically.
667 buildquery() {
668 UTC=$(getbuildprop ro.build.date.utc)
670 # Difference in how OS X and Linux/Cygwin handles 'date' utility
671 case `uname -s` in
672 [Dd]arwin)
673 BDID=`date -r $UTC +%Y%m%d`
674 echo "#### Darwin Build Query used ####" >> "$LOG"
677 BDID=`date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d"`
678 echo "#### Standard Build Query ####" >> "$LOG"
680 esac
682 # If patch date is specified on CLI, use that patch date
683 if [ $# -gt 3 ]; then
684 BID=${4//,/ };
686 # Multiple mods all default to latest- this isn't ideal. We should institute $BID array
687 # In python, we would use dictionary. Not sure about best for shell. A GUI would fix.
688 elif [[ ${#PID[@]} -gt 1 ]];then
689 BID=latest;
690 else
691 case $ANDR in
692 gingerbread)
693 # CM7 roms do not have UTC time stamp- so no build query.
694 BID=latest;
695 echo "*** CM7 roms default to latest patches. If using an older rom ***"
696 echo "*** specify patch date on command line. Use -h to see available patches ***"
699 for P in ${PID[@]}; do
700 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
701 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
702 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
703 PAR=patches/$P/$A/$R
704 PARB=patches/$P/$A/$R/$B
705 DATES=`ls patches/$P/$A/$R/ | grep '201*'`
706 # Intialize variable - High so as to determine lowest in first loop.
707 BID=20201231
708 # find earliest available patch date
709 for i in $DATES; do
710 if [[ $i -lt $BID ]]; then
711 BID=$i
713 done
714 # Check if earliest patches are from before build date. Else use earliest
716 # If older than earliest patch set, then find best match
717 if [[ $(($BID-$BDID)) -lt 0 ]]; then
718 for g in $DATES; do
719 # use any patch that matches $UTC
720 if [[ $(($BDID-$g)) -eq 0 ]]; then
721 BID=$g
722 break
723 # Set highest $BID w/o going over $UTC
724 elif [[ $(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
725 BID=$g
727 done
729 echo "... $PID patch date has been set to: $BID..."
730 B=$BID
731 done
733 esac
737 proberil () {
738 RIL=$(getbuildprop ro.telephony.ril_class)
739 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
742 rominfo () {
743 echo "# VER= $VERSION" >> "$LOG"
744 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
745 echo "# VID= $VID" >> "$LOG"
746 echo "# PID= ${PID[@]}" >> "$LOG"
747 echo "# MID= $MID" >> "$LOG"
748 echo "# RID= $RID" >> "$LOG"
749 echo "# ANDR= $ANDR" >> "$LOG"
750 echo "# BDID= $BDID" >> "$LOG"
751 echo "# DID= $DID" >> "$LOG"
752 echo "# BID= $BID" >> "$LOG"
756 if [[ $1 == -h ]]; then
757 if [ $# -gt 1 ]; then
758 PID=$2
759 mods_info
760 echo ""
761 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
762 echo "*************************************************"
763 echo ""
764 echo "Mod Name: $PID"
765 echo ""
766 echo " $DESC"
767 echo "$DESC1"
768 echo ""
769 echo "Developer: $DEV"
770 echo "Dependancies: $DEPENDENCY"
771 echo ""
772 echo "Works on Android ROMs from $FLOOR to $CEILING"
773 echo
774 exit
778 [[ $# -lt 1 || -z $1 ]] && PID="mods" && mods_info
779 [[ $1 == "-h" ]] && usage_more_help | less && display_help
781 echo ""
782 echo "The Auto-Patcher $VERSION"
783 echo ""
784 # by pastime1971 and mateorod
786 ROOT=$(abspath `dirname "$0"`)
787 TOOL="$ROOT/patch_tools.tgz"
788 PTCH="$ROOT/patch_patches.tgz"
789 ROM=$(abspath "$1")
790 ROMX=$(extpath "$1")
792 if [[ $OSTYPE == "cygwin" ]]; then
793 EXE=".exe"
794 PGFORM="0x"
797 DATE=`date +%Y%m%d%H%M%S`
798 TEMP=$(abspath ./tmp$DATE)
799 LOG=$(abspath ./log$DATE.txt)
800 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
801 echo "ROOT= $ROOT" >> "$LOG"
802 echo "TOOL= $TOOL" >> "$LOG"
803 echo "ROM= $ROM" >> "$LOG"
804 echo "ROMX= $ROMX" >> "$LOG"
806 \rm -f restore.zip update.zip
808 CHK=$(getconf LONG_BIT)
809 if [[ $CHK = "64" ]]; then
810 BIT=64
811 else [[ $BIT = "32" ]];
812 BIT=32
816 printtask "### verify tools ###"
817 which patch >> "$LOG" || misstools_error "Missing \"patch diff command\""
818 which tar >> "$LOG" || misstools_error "Missing \"tar archive command\""
819 which jar >> "$LOG" || misstools_error "Missing \"jar (JDK)\""
820 which java >> "$LOG" || misstools_error "Missing \"java (JRE)\""
821 which cpio >> "$LOG" || misstools_error "Missing \"cpio archive command\""
822 [ -f "$TOOL" ] || misspatch_error "patch tool is missing"
823 [ -f "$PTCH" ] || misspatch_error "patch patches are missing"
824 printtask "### verify ROM ###"
825 [ -f "$ROM" ] || print_error "Cannot find $ROM"
826 echo "### running $0 $@" >> "$LOG"
827 mkdir "$TEMP"
828 cd "$TEMP"
830 PATH="$TEMP:$PATH"
831 export PATH
832 echo "PATH= $PATH" >> "$LOG"
834 printtask "### unzip patch tools ###"
835 tar xzf "$TOOL" > /dev/null || print_error "failed extracting tools !!!"
837 # Get OS specific tools
838 case `uname -s` in
839 CYGWIN*)
840 \mv cygwin/aapt.exe .
841 \mv cygwin/*.exe boot/
842 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
844 [Dd]arwin)
845 \mv mac/aapt .
847 [Ll]inux)
848 \mv linux/aapt .
851 \mv linux/aapt .
853 esac
854 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
855 chmod a+x aapt$EXE
857 printtask "### unzip patch patches ###"
858 tar xzf "$PTCH" > /dev/null || print_error "failed extracting patches !!!"
860 # we need build.prop for both RIL probing and ROM probing
861 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || print_error "failed extracting build.prop from $ROMX !!!"
863 # rom + ril type
864 proberil
865 printtask "### probe rom type ###"
866 proberom
868 # rom type
869 if [ $# -gt 1 ]; then
870 PIT=$2
871 if [[ "$PIT" = "-h" ]]; then
872 display_help
875 if [ $# -gt 2 ]; then
876 RID=$3
877 case "$RID" in
878 cm10|cm*|cyanogenmod*)
880 aokp*|teamkang)
881 RID=aokp;
883 pa*)
884 RID=pa;
886 aosp-ever)
887 RID=aosp-ever;
889 aosp*)
890 case "ANDR" in
891 4.1)
892 RID=`aosp_mod_check`;
895 RID=aosp
897 esac
899 201*)
900 date_error "You must specify ROMTYPE if designating a patch date!!"
903 rom_error "$RID is not a valid ROMTYPE!!"
905 esac
906 echo "... Using $RID patches ..."
907 else
908 echo "... Using results of ROM check ..."
911 # patch type
912 if [ $# -gt 1 ]; then
913 PIL=${2//,/ } # If more than one mod, make string separated by spaces
914 else
915 PIL="pdroid v6supercharger"
916 echo "No mods selected. Defaulting to the v6 and Pdroid, just because we can."
919 PID=(${PIL// / }) # turn string into array
920 COPYPID=("${PID[@]}") # working copy to iterate over
921 MODS_NUMBER=${#COPYPID[@]} # number of elements (mods)
923 if [[ $MODS_NUMBER > 1 ]]; then
924 INDEX=0
925 for p in ${COPYPID[@]}; do
926 if [ "$p" = "pdroid" ] || [ "$p" = "pd2.0" ] ||[ "$p" = "openpdroid" ]; then
927 SPID[0]=$p
928 unset COPYPID["$INDEX"]
929 break
930 else
931 INDEX=$((INDEX + 1))
933 done
934 for p in ${COPYPID[@]}; do
935 if [ "$p" = "pdroid" ] || [ $p = "pd2.0" ] ||[ $p = "openpdroid" ]; then
936 conflict_error "Those mods conflict! Only one pdroid mod at a time!"
937 else
938 i=${#SPID[@]}
939 SPID[i]=$p
940 i+=1
942 done
943 else
944 SPID=${COPYPID[@]}
945 echo "only one mod found, mod is ${SPID[@]}"
947 for P in ${PIL[@]}; do
948 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
949 done
951 # Check to make sure selected roms are available for the Android version of patched ROM
952 compat_check
954 # Build date
955 if [ $# -gt 3 ]; then
956 BID=$4
957 # even here, we should try and create a function that matches as close to the above
958 # BID as possible. Now, a bad match (user error) defaults to latest
959 echo "... $PID patch date set manually to $BID ..."
960 else
961 buildquery
964 # echo ROM info
965 rominfo
967 # I think I finally may have rendered this VERY long if statement obsolete...CHECK!
968 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
969 display_help
970 else
972 #Begin cycle
974 for P in ${PID[@]}; do
975 [ -d patches/$P ] || print_error "$P is not available"
976 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
977 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
978 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
980 unset FILES
981 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
982 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
983 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
984 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
985 for FILE in ${FILES[@]}; do
986 case "$FILE" in
987 +system/*)
988 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
990 -system/*)
991 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
993 system/*.jar)
994 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
995 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
997 system/*.apk)
998 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
999 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1001 *.img)
1002 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
1004 system/*)
1005 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
1007 esac
1008 done
1009 done
1010 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
1011 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
1012 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
1013 echo "### APK FILES= ${AID[@]}" >> "$LOG"
1014 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
1015 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
1017 printtask "### unzip rom ###"
1018 # extract system files
1019 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || print_error "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
1021 printtask "### create updater script ###"
1022 jar -xvf "$ROMX" META-INF/com/google/android/updater-script META-INF/com/google/android/update-binary
1023 jar -xvf "$ROMX" META-INF/com/google/android/update-binary-installer 1> /dev/null 2> /dev/null
1024 if [ -f META-INF/com/google/android/update-binary-installer ]; then
1025 printtask "... using Aroma installer ..."
1026 \mv META-INF/com/google/android/update-binary-installer META-INF/com/google/android/update-binary
1027 else
1028 printtask "... using Clockworkmod installer ..."
1030 if [ -f META-INF/com/google/android/update-binary ]; then
1031 cat META-INF/com/google/android/updater-script | grep ^mount | grep "/system" | head -n 1 > updater-script
1032 [ -s updater-script ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" > updater-script
1033 for FILE in ${EID[@]}; do
1034 # restore the original
1035 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
1036 done
1037 for FILE in ${CID[@]}; do
1038 # replace with the original or delete it
1039 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> updater-script
1040 done
1041 echo "package_extract_dir(\"system\", \"/system\");" >> updater-script
1042 # add permission management
1043 cat META-INF/com/google/android/updater-script | grep set_perm | grep "/system" >> updater-script
1044 # TODO: remove if we don't need it any more
1045 for P in ${PID[@]}; do
1046 if [ -s patches/$P/$A/set_perm.txt ]; then
1047 echo "...setting permissions..."
1048 cat patches/$P/$A/set_perm.txt >> updater-script
1050 done
1051 cat META-INF/com/google/android/updater-script | grep ^unmount | grep "/system" | head -n 1 >> updater-script
1052 [[ ${IID[@]} =~ boot.img ]] && cat META-INF/com/google/android/updater-script | grep "boot.img" >> updater-script
1053 cat updater-script > META-INF/com/google/android/updater-script
1054 echo "# generated updater-script" >> "$LOG"
1055 cat updater-script >> "$LOG"
1056 else
1057 # this is not enough any more
1058 jar -xvf update-template.zip META-INF/com/google/android/update-binary META-INF/com/google/android/updater-script
1061 printtask "### create restore.zip ###"
1062 jar -cvf tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
1063 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
1064 \mv signed.zip restore.zip
1065 \rm -f tmp.zip
1067 printtask "### decompile system files ###"
1069 # decompile system files
1070 for FILE in ${JID[@]}; do
1071 JAR=${FILE##*/}
1072 printtask "... decompile $JAR ..."
1073 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
1074 if [ $FILE == "system/framework/framework.jar" ]; then
1075 printtask "... extract preloaded-classes ..."
1076 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
1077 \mv preloaded-classes tmp/${FILE}.out/
1079 done
1081 # Pull framework-files for APK...
1082 if [ ${#AID[@]} -gt 0 ]; then
1083 jar -xvf "$ROMX" system/framework/framework-res.apk >> "$LOG"
1084 printtask "... installing framework files ..."
1085 java -jar apktool.jar if system/framework/framework-res.apk
1086 # Decompile APKs
1087 for FILE in ${AID[@]}; do
1088 APK=${FILE##*/}
1089 if [ -f $FILE ]; then
1090 printtask "... decompile $APK ..."
1091 java -jar apktool.jar d -f $FILE tmp/$FILE.out
1093 done
1096 # Unpack image files {boot.img only so far...}
1097 for FILE in ${IID[@]}; do
1098 printtask "### unpacking $FILE ###"
1099 case "$FILE" in
1100 boot.img)
1101 if [ -f boot.img ]; then
1102 cd boot
1103 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
1104 mkdir ramdisk
1105 cd ramdisk
1106 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
1107 cd ../../
1108 else
1109 print_error "A mod needs to patch boot.img! This rom does not contains boot.img."
1113 print_error "cannot process $FILE"
1115 esac
1116 done
1118 # apply system modification
1120 for P in ${PID[@]}; do
1121 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1122 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1123 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1124 PAR=patches/$P/$A/$R
1125 PARB=patches/$P/$A/$R/$B
1127 unset FILES COPY DELS JARS APKS IMGS TXTS
1128 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1129 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1130 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1131 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1132 for FILE in ${FILES[@]}; do
1133 case $FILE in
1134 +system/*)
1135 COPY=(${COPY[@]} ${FILE:1})
1137 -system/*)
1138 DELS=(${DELS[@]} ${FILE:1})
1140 system/*.jar)
1141 JARS=(${JARS[@]} $FILE)
1143 system/*.apk)
1144 APKS=(${APKS[@]} $FILE)
1146 *.img)
1147 IMGS=(${IMGS[@]} $FILE)
1149 system/*)
1150 TXTS=(${TXTS[@]} $FILE)
1152 esac
1153 done
1155 [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$A/$R/$B ###"
1156 for FILE in ${COPY[@]}; do
1157 printtask "... copying $FILE ..."
1158 DEST=${FILE%/*}
1159 mkdir -p ./$DEST
1160 if [ -e patches/$P/$A/$R/$B/$FILE ]; then
1161 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
1162 \cp -av patches/$P/$A/$R/$B/$FILE ./$DEST >> "$LOG"
1163 else
1164 print_error "$FILE is missing in the patch. Please upload your logfile to the support thread!"
1166 done
1168 # unconditional smali copying
1169 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
1170 [ -f patches/$P/$A/smali.txt ] && SMALI=$(cat patches/$P/$A/smali.txt)
1171 [ -f patches/$P/$A/$R/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/smali.txt)
1172 [ -f patches/$P/$A/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/$B/smali.txt)
1173 MOVE=${SMALI##*/}
1174 for SMALI in ${SMALI[@]}; do
1175 printtask "... overwriting $MOVE ..."
1176 if [ -f patches/$P/$A/$R/provisionals/$SMALI ]; then
1177 \cp -av patches/$P/$ANDR/$R/provisionals/$SMALI tmp/$SMALI >> "$LOG"
1178 else
1179 \cp -av patches/$P/$ANDR/provisionals/$SMALI tmp/$SMALI >> "$LOG"
1181 done
1183 [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$A/$R/$B ###"
1184 for FILE in ${DELS[@]}; do
1185 printtask "... deleting $FILE ..."
1186 \rm -rf ./$FILE
1187 done
1188 [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$A/$R/$B ###"
1189 for FILE in ${JARS[@]}; do
1190 JAR=${FILE##*/}
1191 NAME=${JAR%.jar}
1192 printtask "... apply $NAME.patch ..."
1193 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
1194 cat ${JAR}.log | tee -a "$LOG"
1195 case "$NAME" in
1196 framework)
1197 # patch preloaded-classes only if a patch exists
1198 if [ -f $PARB/preloaded.patch ]; then
1199 printtask "... apply preloaded.patch ..."
1200 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
1201 cat preloaded.log | tee -a "$LOG"
1202 [[ `grep FAILED preloaded.log` != "" ]] && print_error "failed preloaded.patch"
1206 echo -n "" # do nothing else
1208 esac
1209 # substitute failed smali with premade jar
1210 unset FAILS
1211 FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e "s/\.rej'//"`)
1212 if [[ -n ${FAILS[@]} ]]; then
1213 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
1214 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
1215 for FAIL in ${FAILS[@]}; do
1216 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1217 #cat tmp/$FILE.out/smali/${FAIL}.rej >> "$LOG"
1218 [[ ${SID[@]} =~ $FAIL ]] && print_error "$FAIL was already replaced before"
1219 [ -f patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} ] || print_error "failed $FAIL in $JAR cannot be remedied"
1220 copyfailed || print_error "failed $NAME.patch"
1221 printtask "... replace $FAIL ..."
1222 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
1223 \cp -av patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} >> "$LOG" || echo "FAILED to cp $FAIL" >> ${JAR}.log
1224 SID=(${SID[@]} $FAIL)
1225 done
1227 [[ `grep FAILED ${JAR}.log` != "" ]] && print_error "failed $NAME.patch"
1228 garbage tmp/${FILE}.out
1229 if [ -f patches/$P/$A/$R/$B/${JAR}.sh ]; then
1230 printtask "... apply $JAR.sh ..."
1231 . patches/$P/$A/$R/$B/${JAR}.sh 2>&1 > ${JAR}.log
1232 cat ${JAR}.log | tee -a "$LOG"
1234 done
1236 [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$A/$R/$B ###"
1237 for FILE in ${APKS[@]}; do
1238 APK=${FILE##*/}
1239 if [ -d "tmp/${FILE}.out" ] ; then
1240 printtask "... apply $APK.patch ..."
1241 patch -Nls -p2 -d tmp/${FILE}.out < $PARB/${APK}.patch 2>&1 >> ${APK}.log
1242 cat ${APK}.log | tee -a "$LOG"
1243 [[ `grep FAILED ${APK}.log` != "" ]] && apk_check
1244 garbage tmp/${FILE}.out
1245 else
1246 echo "No $APK in your ROM. Not able to patch this file."
1247 echo "## No $APK in ROM ###" >> "$LOG"
1249 done
1250 [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$A/$R/$B ###"
1251 for FILE in ${IMGS[@]}; do
1252 IMG=${FILE##*/}
1253 printtask "... applying $IMG.patch ..."
1254 patch -Nls -p1 -d boot/ramdisk < $PARB/${IMG}.patch >> "$LOG" || print_error "failed patching $FILE"
1255 done
1257 [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$A/$R/$B ###"
1258 for FILE in ${TXTS[@]}; do
1259 TXT=${FILE##*/}
1260 if [[ -f $PARB/${TXT}.patch ]]; then
1261 printtask "... apply $TXT.patch ..."
1262 patch -Nls -p2 -d system/ < $PARB/${TXT}.patch 2>&1 > ${TXT}.log
1263 #cat ${TXT}.log | tee -a "$LOG"
1264 [[ `grep FAILED ${TXT}.log` != "" ]] && print_error "failed $TXT.patch"
1266 if [[ -f $PAR/${TXT}.awk ]]; then
1267 printtask "... apply $TXT.awk ..."
1268 awk -f $PAR/${TXT}.awk $FILE > text || print_error "failed $TXT.awk"
1269 mv text $FILE
1271 if [[ -f $PAR/${TXT}.sed ]]; then
1272 printtask "... apply $TXT.sed ..."
1273 sed -f $PAR/${TXT}.sed $FILE > text || print_error "failed $TXT.sed"
1274 mv text $FILE
1276 if [[ -f $PAR/${TXT}.sh ]]; then
1277 printtask "... apply $TXT.sh ..."
1278 . $PAR/${TXT}.sh 2>&1 >> ${TXT}.log || print_error "failed $TXT.sh"
1280 garbage system/
1281 done
1282 done
1284 # Device specific scripts- Placement is up-for-review
1285 if [ -f patches/devices/$DID/$DID.sh ]; then
1286 . patches/devices/$DID/$DID.sh
1288 # Replace updater-script for CM7-- Testing
1289 if [ "$ANDR" == "gingerbread" ]; then
1290 replace_updater
1292 # Rebuilding system files
1294 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
1295 for FILE in ${JID[@]}; do
1296 JAR=${FILE##*/}
1297 printtask "... rebuild $JAR ..."
1298 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
1299 [ -f tmp/${FILE}.out/classes.dex ] || smali_error "failed compiling $JAR !!!"
1300 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
1301 if [ $FILE == "system/framework/framework.jar" ]; then
1302 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
1304 done
1306 [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
1307 for FILE in ${AID[@]}; do
1308 APK=${FILE##*/}
1309 if [ -d tmp/${FILE}.out ]; then
1310 printtask "... rebuild $APK ..."
1311 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || print_error "failed compiling $FILE !!!"
1312 jar -uvf $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
1314 done
1316 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
1317 for FILE in ${IID[@]}; do
1318 printtask "### rebuild $FILE ###"
1319 case $FILE in
1320 boot.img)
1321 # Rebuilding boot.img
1322 cd boot
1323 printtask "... rebuilding ramdisk ..."
1324 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
1326 printtask "... composing boot.img ..."
1327 BASE=$(cat boot.img-base)
1328 # hex to decimal in cygwin prefixing "0x" w/ C arithmetic
1329 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
1330 CMDLINE=$(cat boot.img-cmdline)
1331 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
1332 echo "pagesize = $PGSIZE" >> "$LOG"
1333 echo "base = $BASE" >> "$LOG"
1334 printtask "... rebuilding boot.img ..."
1335 ./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"
1336 cd ..
1339 print_error "cannot process $FILE"
1341 esac
1342 done
1344 printtask "### create update.zip ###"
1345 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
1346 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip update.zip 2>> "$LOG"
1348 \mv restore.zip update.zip ..
1349 echo "### finished ###"
1350 echo "flash update.zip to install the modified"
1351 echo "flash restore.zip to restore the original"
1353 # add announcement- optional.
1354 for P in ${PID[@]}; do
1355 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1356 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1357 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1358 if [ -f patches/$P/$A/$R/$B/README.txt ]; then
1359 cat patches/$P/$A/$R/$B/README.txt
1360 elif [ -f patches/$P/$A/$R/README.txt ]; then
1361 cat patches/$P/$A/$R/README.txt
1362 elif [ -f patches/$P/$A/README.txt ]; then
1363 cat patches/$P/$A/README.txt
1365 done
1367 cd ..
1368 \rm -rf "$TEMP"