Fix CM tabletUI SystemUI crash on boot for some devices. (h/t fanoush@xda-devs)
[auto-patcher.git] / auto_patcher
blobecfe837f2442d6fb8200453f5e50f813b8426280
1 #!/bin/bash
3 # Look after changelog for script/patch version info.
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 # 2012.05.12. (v0.2) allows user to specify a different version of patches
15 # 2012.05.13. (v0.3.0) force "patch -N", remove temp upon failure, generate log output
16 # 2012.05.13. (v0.3.1) revised the generation of updater-script (SGS2)
17 # 2012.05.15. added AOSP patches
18 # 2012.05.15. added crespo-aosp patches; device-specific patching if patch exists
19 # 2012.05.15. remove restore.zip upon failure
20 # 2012.05.15. (v0.4.1) added CM7 (GB) patches
21 # 2012.05.18. (v0.4.2) added checking for tool commands
22 # 2012.05.21. (v0.4.3) apply device-specific patches only when it is specified
23 # 2012.05.26. added task title to log
24 # 2012.05.31. (v0.4.4) CM9 patches updated, crespo-aosp added
25 # 2012.06.04. (v0.4.5) added checking tools and rom, added aroma installer support
26 # add patch outputs reroute
27 # 2012.06.15. CM9 patches updated
28 # 2012.06.16. (v0.4.6) AOKP patches updated, patch versions restructured
29 # 2012.06.17. (v0.5.0) patcher script reorganized, removed build.prop
30 # 2012.06.17. (v0.6.0) auto patcher script for pdroid and v6 patches
31 # 2012.06.19. (v0.6.1) add patches for CM7.2 Final
32 # 2012.06.20. (v0.6.2) updated CM 7.2 patches
33 # 2012.06.23. (v0.6.3) fix symlinks
34 # 2012.06.26. (v0.6.4) added 0618 patches for cm7 nightlies; removed 0619 cm7.2 final
35 # 2012.06.27. (v0.6.5) added new CM9 patches (20120626)
36 # 2012.06.27. (v0.6.6) added CM7 nightly patches (20120625) (finally!)
37 # 2012.07.02. (v0.7.0) Redid AOSP/AOKP; add Windows support (using Cygwin). Thanks kobik77!
38 # 2012.07.06. (v0.7.1) updated CM9 patches (20120706)
39 # 2012.07.08. (v0.7.2) updated AOKP (20120707) and CM9 (20120708) pdroid patches
40 # 2012.07.11. (v1.0.0) reworked script works on Linux, Mac OSX, and Windows (on Cygwin);
41 # added new ICS/JellyBean support for the new V6-Supercharger
42 # 2012.07.18. (v1.0.1) new CM7/CM9 Pdroid patches (20120718)
43 # 2012.07.23. (v1.0.2) updated CM9 patches (20120723)
44 # 2012.07.23. (v1.0.3) updated CM9 patches (20120724)
45 # 2012.08.06. (v1.5.0) updated smali/baksmali binaries to 1.33
46 # 2012.08.06. Added Pdroid/V6supercharger support for CM10 Jellybean!
47 # 2012.08.06. Improved PDroid stability and efficiency (Thanks CollegeDev)
48 # 2012.08.06. (v1.6.0) added aokp-jb patches for pdroid/v6supercharger, script update
49 # 2012.08.17. (v1.9.5) Added support for pdroid_addon, by CollegeDev.
50 # Added insecure boot.img mod
51 # Added support for aosp-jb (This needs testing, and may not be
52 # a wide patch due to large variation between AOSP roms.
53 # -Please report all experiences!
54 # Updated all v6supercharger patches w/new edits to ProcessList
55 # Major script overhaul in preparation for additional mods!
56 # 2012.08.20. (v1.9.6) Conditional support for Official cm10 and aokp-jb builds
57 # 2012.08.23. (v1.9.7) Final/confirmed pdroid support for Official CM10 and AOKP-JB
58 # 2012.09.04 (v1.9.8) Bundled cygwin-compatible tools (original was corrupt).
59 # For Cygwin, replaced h2b function with simple bash math
60 # conversion (req'd for compat w/ Cygwin tools).
61 # 2012.08.26. (v2.0.0) Added .apk patching
62 # Added 3G Dongle support for Nexus 7 (trevd)
63 # TabletUI support for Nexus 7 (maybe more)
64 # Google Voice support for Nexus 7
65 # mods are 3gdongle, tabletUI, voice, or nexus7suite (for all)
66 # Added provisional file copy menu to widen patching base
67 # 2012.09.11. (v2.0.1) Cygwin support fixes
68 # 2012.09.11. (v2.0.2) Bugfix for 3gdongle (all)
69 # 2012.09.16. (v2.1.0) Significant restructuring of core operations; added edit text file
70 # fix for "method-cap" errors in pdroid.
71 # 2012.09.20. (v2.1.1) Fix for Phone FC's; OSX support finalized; ContentResolver resolved
72 # 2012.09.28. (v2.1.2) Hotfix for failed pdroid patching. Logging improvements.
73 # 2012.10.07. (v2.1.5) Final pdroid support for CM7.2 Official Releases
74 # Added aosp-mod patches for pdroid patching of AOSP kangs
75 # Switched to Chainfire's (f)aapt for speed/space reasons
76 # 2012.10.13. (v2.1.6) New PDroid patches for aokp-jb and cm10 4.1.2
77 # Revert (f)aapt- temporary due to reported issues
78 # 2012.10.15. (v2.17) New (again) CM10 pdroid patches.
79 # Move files to be copied into $p/$R/$B
80 # -This required a bunch of file moving-report broken symlinks.
81 # Some error check on the old RIL delete functions (thanks bundrik)
82 # 2012.10.16. (v2.1.7.5) Fix FC on phone with CM10 pdroid patches
83 # 2012.10.19. (v2.1.9) Testing CM10 support for PDroid Extension by CollegeDev.
84 # 2012.10.22. (v2.2.0) aosp/aokp and cm10 support for pdroid extension by CollegeDev
85 # MAJOR reworking of patches and improved query. only 4 mod types:
86 # cm, aokp, aosp, and pa. See our OP for details.
87 # 2012.10.26. (v2.3.0) Final (LTS) version. Stable for now until upstream breaks any patches
88 # Thanks to KicknGuitar for the OSX testing!
89 # 2012.11.01. (v2.3.1) Fix for pdroid RIL deletion for older roms
90 # Better Build query logic and help messages
91 # 2012.11.02. (v2.3.5) Add Evervolv support for all mods- Thanks to new maintainer poncik!
92 # Fix method cap for pdroid/pd2.0 for AOKP and kangs
93 # 2012.11.06. (v2.4.0) Update pd2.0 patches to latest pd2.0 release- all except Evervolv
94 # add GsmService to smali.txt; improve rom probe
95 # 2012.11.08. (v2.4.2) Add Evervolv support for pd2.0; Device-specific scripts
96 # Will display error if using a mod on an inapplicable rom
97 # 2012.11.09. (v2.4.5) Error catch for random method issues, fix pd2.0 Evervolv and aosp-jb
98 # 2012.11.17. (v2.4.6) Fix pdroid for CM7. FINALLY!.
99 # 2012.11.17. (v2.4.7) Internal debugging improvements
100 # 2013.01.13. (v2.5.0) Added 'openpdroid' mod --Open-Source Pdroid framework
101 # BIG Improvements to help and error-catch. Try ./auto_patcher -h
102 # 2013.01.15. (v2.5.1) OpenPDroid support for Evervolv and ParanoidAndroid, hotfix for Mms
103 # 2013.01.15. (v2.5.2) Fix for cygwin temp files (kobik), provisional telephony files added
104 # 2013.01.16. (v2.5.3) SlimRom support. Rearrange structure for ApG.
105 # 2013.01.23. (v2.5.4) Fix small bugs related to rearrange
106 # 2013.01.25. (v2.5.7) 4.2 TabletUI support [cm,aokp,aosp,Evervolv]
107 # 2013.01.28. (v2.5.8) Fix for ICS PDroid; small fixes/expansions
108 # 2013.02.01. (v2.6.0) OpenPdroid 1.0.1 patches (cm, aokp, aosp, evervolv and slimrom. no pa.
109 # Fixed TabletUI for Cm10.1- aosp to come. Removed most old patches.
110 # 2013.02.01. (v2.6.25) PA OpenPDroid 1.0.1 patches; AOSP TabletUI. removed opd all 1.0.0
111 # 2013.02.09. (v2.7.0) Add new AOKP, CM9, CM10,CM10.1 and PA (3.0) patches for OPD
112 # 2013.02.09. (v2.7.5) Add new AOKP, AOSP, CM10.1 and PA (3.0) patches for OPD (Andr. 4.2.2)
113 # 2013.02.17. (v2.7.9) 4.2.2 opd 4 evervolv; v6supercharger,3gdongle and all but tabletUI.
114 # 2013.02.20. (v2.8.0) New CM10.1 opd patches. Each BID can have own provisionals now.
115 # 2013.02.23. (v2.8.2) SlimRom 4.2.2 support (from karamelos), APK recompile safety net.
116 # 2013.03.01. (v2.8.3) PAC (.aosp-pac) 4.2.2 support (from AussieLambChops), apktool 1.5.2
117 # 2013.03.03. (v2.8.4) Remove settings.apk from tabUI, replace Mms.apk. Refactors.
118 # 2013.03.06. (v2.8.5) Bugfixes, mainly.
119 # 2013.03.17. (v2.8.6) Added 4.2.2 tabletUI test run for CM from Caldair.
120 # 2013.03.18. (v2.8.6.5) Hotfix from caldair for tabletUI, new SlimRom patches
121 # 2013.03.18. (v2.8.7) TabletUI support for 10 inch screens (caldair)
122 # 2013.03.25. (v2.8.8) Fix for Cygwin paths with spaces (from kobik77)
123 # 2013.04.06. (v2.9.0) Added new tabletUI patches for CM and 4.2 conflicts.
124 # 2013.04.10. (v2.9.1) Updated aokp openpdroid patches (0405) please report.
125 # 2013.04.18. (V2.9.2) Added AOSP and SlimROm TabletUI patches (credit: Caldair)
126 # 2013.04.18. (V2.9.3) Added missing framework2.jar opd aosp 4.1
127 # 2013.05.08. (v2.9.4) Updates to TabletUI (from Caldair)
128 # 2013.05.18. (v2.9.5) New AOKP openpdroid patches (0514)
129 # 2013.05.20. (v2.9.6) New CM and PAC-man (aosp) openpdroid patches.
130 # 2013.05.27. (v2.9.7) $INCREMENTAL patches for bugs/updates and GPS fix for opd (credits to phillipberndt)
131 # 2013.05.30. (v2.9.8) Improve apk handling: test fix disappearing apks. New opd: evervolv,slim
132 # 2013.06.18. (v2.9.83) Introduce auto-update for OSX and Linux...turn off by setting it false in .config
133 # Update PACman patches for OPD and update telephony for PA to silence errors
134 # 2013.06.18. (v2.9.84) Some environment trickery to speed up search/sort. Add WEBSITE for mods.
135 # Check updating. New AOKP OPD patches
136 # 2013.06.19. (v2.9.85) Fixes to auto-update. Added changelog.txt
137 # 2013.06.20. (v2.9.865) Various bugfixes, add color, obfuscate $PROVISIONALS.
138 # 2013.06.21. (v2.9.87) Added ALTERNATE patches feature- hopefully fixes PA telephony issues.
139 # 2013.06.22. (2.9.875) New tabletUI patches, revert flawed CONFLICTS feature
140 # 2013.06.22. (2.9.88) New CM opd patches
141 # 2013.06.28. (2.9.89) revert baksmali changes for now (still needs work), add new PACman OPD 6/26
142 # 2013.07.02. (2.9.91) Switch to SlimRom team's aapt and apktool for OSX+Windows (Need OSX builder!)
143 # 2013.07.07. (2.9.92) New opd patches for Slim/PA; some fixes to tabletUi by Caldair
146 # SHELL PROGRAMMING NOTES:
147 # [ -s FILE ]
148 # [[ -n STRING ]] or [[ -z STRING ]]
150 VERSION="v2.9.924"
151 # PATCHES_VERSION needs to be incremented every time ANY changes occur to patches.
152 PATCHES_VERSION="20130714"
153 CURRENT_ANDROID="4.2.2"
155 # Available ROMTYPES.
156 # ROMTYPES that are hidden can be forced on the command line. But they are best left
157 # blank to be automatically parsed by our romprobe or by just entering the parent...usually AOSP.
159 #Non-obvious ROMTYPE legend
160 # @.aosp-slim: SlimRom @.aosp-pac: PAC-man
161 # @.aosp-ever: Evervolv @pa: ParanoidAndroid (official jellybean branch only for now)
162 declare -a AVAILABLE_ROMTYPES=('aokp' 'aosp' 'cm' 'pa' '.aosp-slim' '.aosp-pac' '.aosp-ever')
164 # pass variables to children
165 set -a
167 # Set any environmental variables
168 LANG=C
170 # Config file: For now hosting AUTO_UPDATE and PRODUCTION(currently unused). Not under version control.
171 if [ ! -f .config ]; then
172 cp -a ap_scripts/config_template .config
174 source .config
176 # Colorize and add text parameters
177 red=$(tput setaf 1) # red
178 grn=$(tput setaf 2) # green
179 cyan=$(tput setaf 6) # cyan
180 txtBold=$(tput bold) # Bold
181 txtReset=$(tput sgr0) # Reset
183 colorize () {
184 # pass color and then reset
185 echo -e $@${txtReset}
188 colorize_bold () {
189 echo -e ${txtBold}$@${txtReset}
192 printusage_help () {
193 PID="openpdroid,3gdongle" # default example
194 brief_help
197 brief_help () {
198 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
199 echo " example: ./auto_patcher CM10.zip $PID cm"
200 echo ""
201 echo "Use ./auto_patcher -h for the help menu"
202 echo ""
203 cleanup
204 exit
207 usage_help () {
208 PID=mods
209 mods_display
210 echo "Multiple MODS can be combined by separating them with a comma and NO SPACES!!!"
211 echo ""
212 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
213 echo ""
214 echo " example: ./auto_patcher CM10.zip openpdroid,3gdongle cm"
215 echo ""
216 usage_more_help
219 usage_more_help () {
220 echo "* press 'q' available patches or CTRL-c to quit the help menu *"
223 display_help () {
224 cd patches
225 echo ""
226 echo "AVAILABLE PATCHES"
227 echo ""
228 echo "*******************************************************************"
229 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
230 echo ""
231 find -H * \( -name aokp -o -name cm -o -name aosp -o -name pa -o -name all -o -name generic \) -prune | column -c 85 | more -d -7
232 echo ""
233 echo "!!! Do not put Android Version number on command line !!!!"
234 echo "*****************************************************************"
235 echo "Specific auto_patcher script options"
236 echo " ./auto_patcher -h mods Lists mods"
237 echo " -h <MODNAME> Specific <MOD> info"
238 echo " -h advanced Advanced usage+lists all available patch dates"
239 echo ""
240 cleanup
241 exit
244 romtype_help () {
245 # From rom_error (bad romtype) and date_error (patch date w/o specifying romtype)
246 echo ""
247 echo "!!!There are only four supported ROMTYPES: 1) cm 2) aokp 3) aosp 4) pa"
248 echo ""
249 echo "Find out which of the above ROMTYPES your rom is based on and try again!"
250 echo "**********************************************"
251 echo ""
252 cleanup
253 brief_help
256 advanced_help () {
257 echo ""
258 echo "The Auto-Patcher Advanced Usage"
259 echo "*********************************"
260 echo ""
261 echo "For those of you determined to try everything..."
262 echo ""
263 echo "You can also try adding a patch date as a final argument."
264 echo ""
265 echo " ./auto_patcher <ROM> <MOD> <ROMTYPE> <DATE>"
266 echo ""
267 echo "Please note: There are only four ROMTYPES: {pa, aokp, aosp and cm}"
268 echo " -The various appellations after that are for internal use only!"
269 echo ""
270 echo "The Auto-Patcher has a pretty great rom probe, specifying the date is"
271 echo " deprecated...you don't need to, we promise."
272 echo ""
275 cleanup () {
276 [[ -n $ROOT ]] && \rm -rf "$ROOT"/tmp*
279 garbage () {
280 unset GARBAGE
281 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
282 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
286 print_error () {
287 # General purpose error. Used for errors in main, as opposed to probe or set-up.
288 echo ""
289 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
290 printtask "!!! error: $@"
291 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
292 echo ""
293 brief_help
296 smali_error () {
297 # Smali binary error. Problem often goes away on second run.
298 echo ""
299 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
300 printtask "!!! error: $@"
301 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
302 echo ""
303 if [[ $(grep 'method index is too large' "$LOG") != "" ]]; then
304 printtask "!!! Problem with method cap !!!"
305 printtask "... attempting fix ..."
306 . patches/.common/framework.jar.sh 2>&1 > ${JAR}.log
307 printtask "... rebuild framework.jar ..."
308 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
309 [ -f tmp/${FILE}.out/classes.dex ] || print_error "Could not resolve method cap issue- please submit log"
310 else
311 printtask "!!! This error is generally due to an unknown bug in the smali binary!"
312 echo "In our experience, it goes away if you run the patcher a second time."
313 echo " Please run the Auto-Patcher with the same command once again."
314 echo ""
315 echo "If after the third attempt the same thing happens,"
316 echo " please upload your logfile to our support thread!"
317 echo ""
318 cleanup
319 exit
323 unknown_mod_error () {
324 echo ""
325 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
326 printtask "!!! error: $@"
327 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
328 echo ""
329 cleanup
330 printusage_help
333 mismatch_error () {
334 # Function that exposes attempts to apply a mod to an upsupported Android version
335 echo ""
336 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
337 printtask "!!! error: $@"
338 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
339 echo ""
340 cleanup
341 brief_help
344 date_error () {
345 # Remind users to include a romtype if they are going to specify a patch date
346 echo ""
347 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
348 printtask "!!! error: $@"
349 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
350 echo ""
351 echo "Please put a ROMTYPE before the patch date and run again!!"
352 romtype_help
355 rom_error () {
356 # For when an unsupported romtype is manually entered on the command-line
357 echo ""
358 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
359 printtask "!!! error: $@"
360 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
361 romtype_help
364 conflict_error () {
365 # For conflicting packages
366 echo ""
367 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
368 printtask "!!! error: $@"
369 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
370 cleanup
371 PID=mods
372 mods_info
375 misspatch_error () {
376 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
377 printtask "!! error: $@ "
378 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
379 echo ""
380 printtask "!! The Auto-Patcher could not find its patches and/or tools!"
381 echo ""
382 echo "* Did you run ./batch.sh first?"
383 echo ""
384 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
385 echo " one way or another..."
386 echo ""
387 cleanup
388 brief_help
391 misstools_error () {
392 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
393 printtask "!! error: $@ "
394 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
395 printtask "Your set-up is missing a dependency."
396 echo "We require JDK, tar, patch and cpio."
397 echo ""
398 echo ""
399 echo "Each distro is different"
400 echo "but ensure you have them all installed and try again."
401 echo ""
402 cleanup
403 brief_help
406 miss_git_error () {
407 printtask "Updater: disabled"
408 echo ""
409 printtask "You will not be able to get automatic updates because we could not find 'git'."
410 printtask "Find out how to install git for your system and that feature should work automatically"
411 echo ""
414 printtask () {
415 echo "" >> "$LOG"
416 echo -e $@ | tee -a "$LOG"
419 print_to_log () {
420 echo "$@" >> "$LOG"
423 copy_prepatched_provisional () {
424 print_to_log "File for which patching failed:"
425 print_to_log "---------------------------------------------"
426 print_to_log ""
427 print_to_log "${FAIL##*/}"
428 print_to_log ""
429 print_to_log "---------------------------------------------"
430 print_to_log ""
431 print_to_log "We are adding a pre-patched copy of those files."
432 print_to_log ""
433 print_to_log "Please only file a bug report if running the program gives you problems!!!"
434 print_to_log "... replace $FAIL ..."
435 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
436 \cp -av "$PROVISIONAL" tmp/${FILE}.out/smali/${FAIL} >> "$LOG" 2>&1
437 SID=(${SID[@]} $FAIL)
438 print_to_log "... failed patch sucessfully resolved ..."
441 prep_alternate_patch () {
442 # Use alt.patch, if exists. Increment in case there are multiple alternates.
443 mv -v $ALTERNATIVE_PATCH $PARB/${NAME}.patch >> "$LOG"
444 ALT_PATCH_NUMBER=$((PATCH_NUMBER + 1))
446 # Get fresh files/variables + decompile again (use rm b/c privacy files wouldn't get overwritten)
447 rm -rf tmp/${FILE}.out/smali
448 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
449 unset FAILS && unset SID
450 current_jar=$(($current_jar - 1))
451 break
454 no_network_access () {
455 ping -c1 www.github.com >> "$LOG" 2>&1 && NETWORK=true # second try and check github
456 ping -c1 www.google.com >> "$LOG" 2>&1 # test for internet in general
457 if [[ "$NETWORK" == true ]]; then
458 return
459 else
460 printtask "Check for update failed, probably because of no internet access."
461 echo "The autopatcher will continue with current local version: $VERSION"
462 NETWORK=false
463 echo ""
464 sleep 2
468 auto_update_error () {
469 echo ""
470 printtask "### Update failed ###"
471 printtask ""
472 printtask "It appears you may have made some changes to the script that prevent automatic updating."
473 printtask "You could run 'git reset --hard' to return the autopatcher to its original form"
474 printtask " or set AUTO_UPDATE to false in the .config file to stop getting this message."
475 echo ""
476 printusage_help
479 backup_script () {
480 printtask "... backing up auto_patcher to auto_patcher.bak ..."
481 cp -av auto_patcher auto_patcher.bak >> "$LOG" #backup for user in case of changes
482 echo ""
485 warn_of_overwrite () {
486 # Only seen once, by users without ".git" directories
487 # Only users who got program @ download page see this, all others (ApG included) use git
488 echo "This is a one time set-up process that will overwrite all local changes!"
489 echo "If this is not ok with you press ctrl-C and set AUTO_UPDATE to false in .config"
490 echo ""
493 establish_repo() {
494 printtask "### establishing the repo ###"
495 echo "... please be patient, this should only be needed once ..."
496 echo ""
497 git clone https://github.com/mateor/auto-patcher >> "$LOG" || no_network_access
498 if ($NETWORK); then
499 mv -v auto-patcher/".git" . >> "$LOG"
500 rm -rf auto-patcher
501 git checkout -q master || auto_update_error
502 git reset --hard 2>&1 >> "$LOG"
503 echo ""
507 export_log_and_variables () {
508 cp -a "$LOG" .updated.log
509 rm -If "$LOG"
510 AUTO_PATCHER_OLD_VERSION=$VERSION
511 AUTO_PATCHER_OLD_PATCHES_VERSION=$PATCHES_VERSION
512 AUTO_PATCHER_WAS_UPDATED=true
515 print_changelog () {
516 CHANGELOG="changelog.txt"
517 echo "" > "$CHANGELOG"
518 CURRENT_HEAD=$(git rev-parse HEAD)
519 echo "Changelog from Autopatcher$AUTO_PATCHER_OLD_VERSION to Autopatcher$VERSION" >> "$CHANGELOG"
520 echo "---------------------------------------------------------------------------" >> "$CHANGELOG"
521 echo "" >> "$CHANGELOG"
522 echo " Get more info about any individual commit by entering 'git show \$NUMBER'" >> "$CHANGELOG"
523 echo "" >> "$CHANGELOG"
524 git log --pretty=oneline $ORIGINAL_HEAD...$CURRENT_HEAD >> changelog.txt
525 printtask "... "$CHANGELOG" has been updated ..."
528 replace_updater () {
530 # Function for devices that use SDcard installs. Also to be tested for CM7
531 # since CM7 seems to use an updater-script that wipes EMMC. Testing
533 \rm $UPDATER_LOC/$UPDS 2>&1
534 \cp patches/.common/$UPDATER_LOC/$UPDS $UPDATER_LOC >> "$LOG" 2>&1
535 echo "run_program(\"/sbin/busybox\", \"umount\", \"/system\");" >> UPDATE.txt
536 cat UPDATE.txt >> $UPDATER_LOC/$UPDS
537 echo ""
538 echo "New updater-script being used:" >> "$LOG"
539 echo "-----------------------------" >> "$LOG"
540 cat $UPDATER_LOC/$UPDS >> "$LOG"
543 abspath () {
544 case $(uname -s) in
545 CYGWIN*)
546 echo $(cygpath -ua "$1") | sed 's:/$::g'
548 Darwin)
549 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
550 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
552 Linux)
553 echo $(readlink -f "$1")
556 if [[ ${1:0:1} == "/" ]]; then
557 echo "$1"
558 elif [[ ${1:0:2} == "./" ]]; then
559 echo "$PWD/${1:2}"
560 else
561 echo "$PWD/$1"
564 esac
567 mods_display () {
568 echo ""
569 echo "The Auto-Patcher $VERSION"
570 echo "*******************************"
571 echo ""
572 echo "The available mods are"
573 echo "****************************************************"
574 echo "* pdroid openpdroid voice v6supercharger *"
575 echo "* voice insecure secure external_internal *"
576 echo "* tabletUI 3gdongle pd2.0 *"
577 echo "****************************************************"
578 echo ""
579 echo "To find out more about any mod, simply enter:"
580 echo " ./auto_patcher -h <MODNAME>"
581 echo ""
582 cleanup
585 mods_info () {
586 # Defaults
587 DEPENDENCY="None"
588 DEV="Unknown"
589 CEILING=$CURRENT_ANDROID
590 ROM_CONFLICTS="None"
591 UNKNOWN_MOD=false
592 case $PID in
593 mods)
594 mods_display
595 exit
597 auto*)
598 echo ""
599 echo "**************************************"
600 echo "The Auto-Patcher ate a kitten once..."
601 echo "**************************************"
602 echo ""
603 DEV="mateor and Caldair"
604 WEBSITE="https://github.com/mateor/auto-patcher"
605 printusage_help
607 advanced)
608 cd patches/
609 (advanced_help && find -H * -name 201*) | more -d
610 echo ""
611 brief_help
613 voice)
614 FLOOR=4.0.0
615 DESC="Use on wifi-only tablets to have the software register as 'voice-enabled'. Allows VOIP like Google Voice to function."
616 DESC="bongostl's setup method can be seen at the link."
617 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1823701"
618 DEV="bongostl"
620 v6 | v6supercharger)
621 FLOOR=4.0.0
622 CEILING=4.2.2
623 DESC="A memory-management tool. It requires smali edits for Android roms 4.0+. The Auto-Patcher applies all 50+ edits recommended by the dev."
624 DEV="Zeppelinrox"
625 DEPENDENCY="The V6 Supercharger Script. Get it at the link"
626 WEBSITE="http://forum.xda-developers.com/showthread.php?t=991276"
628 PID="v6supercharger" # allows shorthand 'v6' to find patches.
630 pdroid)
631 FLOOR=2.3.7
632 CEILING=4.1.2
633 DESC="Security Software that manages access to personal data w/o causing FC's. No longer under development."
634 DESC1="Try the open-source expansion of this program, OpenPdroid."
635 DESC2="(It's the 'openpdroid' mod within the Auto-Patcher)."
636 DEV="Svyat"
637 DEPENDENCY="The Pdroid app. You can get it at the link"
638 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1923576"
641 pd2.0)
642 FLOOR=4.1.2
643 CEILING=4.1.2
644 DESC="An expansion of the PDroid application/framework."
645 DEV="CollegeDev"
646 DEPENDENCY="The free PDroid2.0 app available at the link"
647 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1923576"
649 openpdroid)
650 FLOOR=4.1.2
651 CEILING=4.2.2
652 DESC="A fork of the open-source PDroid and Pdroid2.0 framework."
653 DEV="CollegeDev/FFU5y/wbedard/mateorod/Community"
654 DEPENDENCY="PDroidManager(opensource) or PDroid2.0(CollegeDev)"
655 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1994860"
657 opendroid)
658 echo ""
659 echo "No mod named 'opendroid'. You probably mean 'openpdroid'. Try again."
660 PID="mods"
661 mods_info
663 external_internal)
664 FLOOR=2.3.3
665 CEILING=4.1.2
666 DESC="Swap internal and external storage."
668 insecure)
669 FLOOR=2.3.3
670 DESC="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
672 secure)
673 FLOOR=2.3.3
674 DESC="Make any boot.img secure."
676 3gdongle)
677 FLOOR=4.1.0
678 CEILING=4.2.2
679 DESC="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
680 DEV="trevd"
681 DEPENDENCY="None, but read the troubleshooting guide at the link"
682 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1798631"
684 tabletUI)
685 FLOOR=4.1.0
686 CEILING=4.2.2
687 if [[ $ANDR == "4.2" ]]; then
688 ROM_CONFLICTS=(pa .aosp-ever aokp)
689 else
690 ROM_CONFLICTS=(pa .aosp-slim)
692 DESC="Changes the user interface of Phones and Phablets to the popular Tablet UI."
693 DEV="barmullio/Caldair"
694 WEBSITE="http://forum.xda-developers.com/showthread.php?t=2154075"
697 UNKNOWN_MOD=true
698 FLOOR=?????
699 CEILING=?????
700 DESC="??? Unknown modtype ??? Check your spelling or the mod list!"
701 DESC1=" Try: \"./auto_patcher -h mods\""
702 esac
704 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
705 NVID=${VID//[.]/}
706 COMPATF=${FLOOR//[.]/}
707 COMPATC=${CEILING//[.]/}
710 apk_copy () {
711 if [ -f patches/$P/$A/$R/$B/$FILE ]; then
712 mkdir apk_staging
713 cd apk_staging
714 # Move the certs and manifests from the ROM's apk into the prepatched copy
715 jar -xvf ../"$FILE" META-INF AndroidManifest.xml >> "$LOG"
716 jar -ufv ../patches/$P/$A/$R/$B/$FILE META-INF/CERT* AndroidManifest.xml >> "$LOG" 2>> "$LOG"
717 cd ..
718 \cp -av patches/$P/$A/$R/$B/$FILE $FILE >> "$LOG" 2>&1
719 echo "... Patching $APK failed, but we have successfuly copied over a prepatched file ..."
720 apk_was_copied=true
721 else
722 print_error "failed patching $APK!!!"
726 no_mod_selected_error () {
727 echo ""
728 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
729 printtask "!!! error: $@"
730 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
731 echo ""
732 printtask "You need to enter a MOD before you try and specify the ROMTYPE."
733 printtask "Check the help menu for the list of available MODS"
734 echo ""
735 printusage_help
738 check_against_rom_types () {
739 # this checks to see if the user has entered a ROMTYPE in the MOD spot and outputs advice if so.
740 NUMBER_OF_AVAILABLE_ROMTYPES=${#AVAILABLE_ROMTYPES[@]}
741 for ((i=0; i < $NUMBER_OF_AVAILABLE_ROMTYPES; i++)); do
742 if [[ ${AVAILABLE_ROMTYPES[i]} == "$P" ]]; then
743 no_mod_selected_error "\"$P\" is a ROMTYPE not a MOD"
745 done
748 compat_check () {
749 for P in ${PID[@]}; do
750 mods_info
751 if ($UNKNOWN_MOD); then
752 check_against_rom_types
753 unknown_mod_error "\"$P\" is not a valid mod. Check your spelling or the mod list!!!"
754 elif [[ "$NVID" -lt "$COMPATF" ]]; then
755 mismatch_error "Your Android $VID rom is too old! The minimum for $P is \n !!! Android $FLOOR!"
756 elif [[ "$NVID" -gt "$COMPATC" ]]; then
757 mismatch_error "Sorry, $P has not been made available for Android $VID yet!"
759 done
762 rom_compat_check () {
763 for P in ${PID[@]}; do
764 N=${#ROM_CONFLICTS[@]}
765 for ((i=0; i < $N; i++)); do
766 if [[ $RID == ${ROM_CONFLICTS[$i]} ]]; then
767 rom_compat_error
769 done
770 done
773 rom_compat_error () {
774 print_error "$RID is incompatible with $PID!!!"
777 extpath () {
778 case $(uname -s) in
779 CYGWIN*)
780 echo $(cygpath -da "$1")
783 echo $(abspath "$1")
785 esac
788 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
790 parse () { echo "${1%%_*}"; }
792 getbuildprop () {
793 if [ -f system/build.prop ]; then
794 result=($(grep $1 system/build.prop | tr -d '\r' | tr '=' ' '))
795 echo "${result[1]}"
796 else
797 echo ""
802 aosp_mod_check() {
803 jar -xvf "$ROMX" system/framework/framework2.jar >> "$LOG"
804 if [ -s system/framework/framework2.jar ]; then
805 ever_check
806 else
807 AOSP=aosp
809 echo $AOSP
812 ever_check() {
813 MID=$(getbuildprop ro.build.romversion)
814 if [[ $MID == "Evervolv"* ]]; then
815 AOSP=".aosp-ever"
816 else
817 MID=$(getbuildprop ro.build.display.id)
818 if [[ "$MID" == "ev"* ]]; then
819 AOSP=".aosp-ever"
820 else
821 pac_check
824 echo $AOSP
827 pac_check() {
828 MID=$(getbuildprop ro.build.romversion)
829 if [[ "$MID" == "pac"* ]] || [[ "$MID" == "PAC"* ]]; then
830 AOSP=".aosp-pac"
831 else
832 MID=$(getbuildprop ro.build.display.id)
833 if [[ "$MID" == "pac"* ]] || [[ "$MID" == "PAC"* ]]; then
834 AOSP=".aosp-pac"
835 else
836 slim_check
841 slim_check() {
842 SLMID=$(getbuildprop ro.modversion)
843 SLMMID=$(getbuildprop updateme.name)
844 if [[ "$SLMMID" == "Slim"* ]] || [[ $SLMMID == "slim"* ]]; then
845 AOSP=".aosp-slim"
846 elif [[ "$SLMID" == "Slim"* ]] || [[ $SLMID == "slim"* ]]; then
847 AOSP=".aosp-slim"
848 else
849 if [[ "$ANDR" == "4.1" ]]; then
850 AOSP=.aosp-mod
851 else
852 AOSP="aosp"
857 pa_check() {
858 CMID=$(getbuildprop ro.modversion)
859 PAID=$(getbuildprop ro.pa.version)
860 MID=$(getbuildprop ro.build.display.id)
861 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
862 DID=$(getbuildprop ro.product.device)
863 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
864 if [[ -n $PAID ]]; then
865 RID=pa
866 else
867 case $CMID in
868 [Pp][Aa]*)
869 RID=pa;
872 RID=cm;
874 esac
878 romtype_set () {
879 case $RID in
881 ROMTYPE="cm"
883 aokp*)
884 ROMTYPE="aokp"
887 ROMTYPE="pa"
890 ROMTYPE="aosp"
892 esac
895 proberom () {
896 VID=$(getbuildprop ro.build.version.release)
897 if [ ${#VID} -lt 4 ]; then # in case of non-standard versioning in build.prop (defy!)
898 ANDR=$VID
899 else
900 ANDR="${VID%.*}" # Cut to 1 significant digit to cover specific range or release.
902 if [ "$ANDR" == "2.3" ]; then
903 FLAVR=gingerbread
904 API=10
905 RID=cm;
906 elif [ "$ANDR" == "4.0" ]; then
907 FLAVR=ics
908 API=15
909 MID=$(getbuildprop ro.rommanager.developerid)
910 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
911 DID=$(getbuildprop ro.product.device)
912 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
914 case "$MID" in
915 pa|cm9|cm|cyanogenmod*)
916 RID=cm;
918 aokp|teamkang)
919 RID=aokp;
921 aosp*)
922 RID=aosp;
925 echo "!!! $MID is not supported yet, trying aosp !!!"
926 RID=aosp
928 esac
929 elif [ "$ANDR" == "4.1" ]; then
930 FLAVR=jellybean
931 API=16
932 CMID=$(getbuildprop ro.cm.version)
933 if [[ -n $CMID ]]; then
934 pa_check
935 else
936 MID=$(getbuildprop ro.build.display.id)
937 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
938 DID=$(getbuildprop ro.product.device)
939 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
940 case "$MID" in
941 cm10|cm*|cyanogenmod*)
942 RID=cm;
944 aokp*|teamkang)
945 RID=aokp;
947 pa*)
948 RID=pa;
950 ev*)
951 RID=".aosp-ever";
954 RID=$(aosp_mod_check);
956 esac
958 elif [ "$ANDR" == "4.2" ]; then
959 FLAVR=jellybean
960 API=17
961 CMID=$(getbuildprop ro.cm.version)
962 MID=$(getbuildprop ro.build.display.id)
963 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
964 DID=$(getbuildprop ro.product.device)
965 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
967 case "$MID" in
968 cm10|cm*|cyanogenmod*)
969 RID=cm;
971 aokp*|teamkang)
972 RID=aokp;
974 [Pp][Aa]*)
975 if [[ "$MID" == "pac"* ]] || [[ "$MID" == "PAC"* ]]; then
976 RID=".aosp-pac"
977 else
978 RID=pa;
981 ev*|Ever*)
982 RID=".aosp-ever";
985 RID="$(ever_check)";
987 esac
988 else
989 print_error "unknown ROM version $VID: generally means cannot find/read build.prop"
991 # romtype_set allows hiding ".aosp-*" types from users while leaving them as options on CLI
992 romtype_set
993 echo "... result of ROM check: version= $VID rom= $ROMTYPE ..."
997 # Advanced build date query
998 # This should set the patch date automatically.
1000 build_query() {
1001 UTC=$(getbuildprop ro.build.date.utc)
1003 # Difference in how OS X and Linux/Cygwin handles 'date' utility
1004 case $(uname -s) in
1005 [Dd]arwin)
1006 BDID=$(date -r $UTC +%Y%m%d)
1007 echo "#### Darwin Build Query used ####" >> "$LOG"
1010 BDID=$(date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d")
1011 echo "#### Standard Build Query ####" >> "$LOG"
1013 esac
1015 # If patch date is specified on CLI, use that patch date
1016 if [ $# -gt 3 ]; then
1017 BID=${4//,/ };
1018 BDID=$BID
1019 else
1020 case $ANDR in
1021 2.3)
1022 # CM7 roms do not have UTC time stamp- so no build query.
1023 BID=latest;
1024 echo "*** CM7 roms default to latest patches. If using an older rom ***"
1025 echo "*** specify patch date on command line. Use -h to see available patches ***"
1028 for P in ${PID[@]}; do
1029 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1030 [ -d patches/$P/$A/"$RID" ] && R=$RID || R=generic
1031 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1032 PAR=patches/$P/$A/$R
1033 PARB=patches/$P/$A/$R/$B
1034 DATES=$(ls patches/$P/$A/"$R" | grep '201*')
1035 # Intialize variable - an upperbound to determine lowest in first loop.
1036 BID=20201231
1037 # find earliest available patch date
1038 for i in $DATES; do
1039 if [[ $i -lt $BID ]]; then
1040 BID=$i
1042 done
1043 # Check if earliest patches are from before build date. Else use earliest
1045 # If rom is newer than earliest patch set, find best match
1046 if [[ $(($BID-$BDID)) -lt 0 ]]; then
1047 for g in $DATES; do
1048 # use any patch that matches $UTC
1049 if [[ $(($BDID-$g)) -eq 0 ]]; then
1050 BID=$g
1051 break
1052 # Set highest $BID w/o going over $UTC
1053 elif [[ $(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
1054 BID=$g
1056 done
1058 # Error catch if query fails.
1059 [[ $BID == "20201231" ]] && BID=latest && echo "Build Query Failed!! Default to latest!" >> "$LOG"
1060 echo "... $PID patch date has been set to: $BID ..."
1061 B=$BID
1062 break
1063 done
1065 esac
1069 proberil () {
1070 RIL=$(getbuildprop ro.telephony.ril_class)
1071 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
1074 rominfo () {
1075 echo "# VER= $VERSION" >> "$LOG"
1076 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
1077 echo "# VID= $VID" >> "$LOG"
1078 echo "# PID= ${PID[@]}" >> "$LOG"
1079 echo "# MID= $MID" >> "$LOG"
1080 echo "# RID= $RID" >> "$LOG"
1081 echo "# ANDR= $ANDR" >> "$LOG"
1082 echo "# BDID= $BDID" >> "$LOG"
1083 echo "# DID= $DID" >> "$LOG"
1084 echo "# BID= $BID" >> "$LOG"
1085 echo "Patches are $PID/$ANDR/$RID/$BID" >> "$LOG"
1087 if [ -d ../".git" ]; then
1088 echo "" >> "$LOG"
1089 echo -n "Current HEAD: " >> "$LOG"
1090 git log --pretty=oneline HEAD^..HEAD >> "$LOG"
1091 echo "" >> "$LOG"
1096 if [[ $1 == -h ]]; then
1097 if [ $# -gt 1 ]; then
1098 PID=$2
1099 mods_info
1100 echo ""
1101 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
1102 echo "*************************************************"
1103 echo ""
1104 echo "Mod Name: $PID"
1105 echo ""
1106 echo " $DESC"
1107 if [[ $DESC1 ]]; then # test to see is there is a second DESC line
1108 echo " $DESC1"
1110 if [[ $DESC2 ]]; then
1111 echo -n "$DESC2"
1113 echo ""
1114 echo "Developer: $DEV"
1115 echo "Dependancies: $DEPENDENCY"
1116 if [[ $WEBSITE ]]; then
1117 echo "Website: $WEBSITE"
1119 echo ""
1120 echo "Works on ROMs from Android $FLOOR -> $CEILING"
1121 echo
1122 brief_help
1123 exit
1127 [[ $# -lt 1 || -z $1 ]] && PID="mods" && mods_info
1128 [[ $1 == "-h" ]] && usage_help | less && display_help
1130 echo ""
1131 echo "The Auto-Patcher $VERSION"
1132 # by pastime1971 and mateorod
1133 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1134 echo " (auto-updated from $AUTO_PATCHER_OLD_VERSION)"
1135 print_changelog
1137 echo ""
1139 ROOT="$(abspath "$(dirname "$(abspath "$(type -p "$0")")")")"
1140 TOOL="$ROOT/patch_tools.tgz"
1141 PTCH="$ROOT/patch_patches.tgz"
1142 cleanup
1143 # set temporaray directory
1144 DATE=$(date +%Y%m%d%H%M%S)
1145 TEMP="$ROOT/tmp$DATE"
1146 TMP="$ROOT/tmp$DATE"
1147 TMPDIR="$ROOT/tmp$DATE"
1148 mkdir "$TEMP"
1149 ROM=$(abspath "$1")
1150 ROMX=$(extpath "$1")
1152 if [[ $OSTYPE == "cygwin" ]]; then
1153 EXE=".exe"
1154 PGFORM="0x"
1155 AUTO_UPDATE=false # CYGWIN AUTO_UPDATE TESTERS COMMENT THIS LINE HERE!
1158 LOG=$(abspath ./log$DATE.txt)
1159 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
1160 echo "ROOT= $ROOT" >> "$LOG"
1161 echo "TOOL= $TOOL" >> "$LOG"
1162 echo "ROM= $ROM" >> "$LOG"
1163 echo "ROMX= $ROMX" >> "$LOG"
1166 # Auto-Update # excluding ApG/cygwin for now until I talk with kobik.
1167 # To turn off auto updating, set AUTO_UPDATE in .config to false
1170 # Check for git
1171 if [ $(which git) ]; then
1172 GIT=true
1173 else
1174 miss_git_error "Missing \"git\" utility"
1175 GIT=false
1178 # If program was updated, merge the logs
1179 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1180 cat .updated.log >> "$LOG"
1181 rm -If .updated.log
1184 if [[ "$AUTO_UPDATE" == true ]] && [[ "$GIT" == true ]]; then
1185 ping -c1 www.github.com > /dev/null 2>&1 && NETWORK=true || no_network_access
1186 if [[ "$NETWORK" == true ]]; then
1187 printtask "### checking for updates ###"
1189 # establish the repo if not already present- one time operation.
1190 if [ ! -d ".git" ]; then
1191 printtask "... initial setup to allow automatic updating ..."
1192 backup_script && warn_of_overwrite
1193 establish_repo && export_log_and_variables
1194 printtask "### rerunning script with latest version ###"
1195 $0 "$@"
1196 exit 0
1199 # Here is the regular update process
1200 git fetch origin 2>&1 >> "$LOG" || no_network_access
1201 if !("$NETWORK"); then
1202 printtask "Updater: not able to run auto_update."
1203 else
1204 COMMITS_BEHIND=$(git rev-list HEAD..origin/master --count)
1205 case "$COMMITS_BEHIND" in
1207 printtask "Updater: Auto-Patcher is already up to date"
1210 ORIGINAL_HEAD=$(git rev-parse HEAD)
1211 printtask "... Updater: update found ..."
1212 backup_script
1213 printtask "... Updating Auto-Patcher ..."
1214 git merge --no-edit origin/master 2>&1 >> "$LOG" || auto_update_error
1215 export_log_and_variables
1216 printtask "### updated, now rerunning script with latest version ###"
1217 $0 "$@"
1218 exit 0
1220 esac
1221 echo ""
1226 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1227 if [[ $PATCHES_VERSION -gt $AUTO_PATCHER_OLD_PATCHES_VERSION ]]; then
1228 echo "... integrating new patches ..."
1229 sh batch.sh >> /dev/null 2>> "$LOG"
1233 #remove old zips, if built under identical parameters.
1234 \rm -f $RESTORE.zip $UPDATE.zip
1236 CHK=$(getconf LONG_BIT)
1237 if [[ $CHK = "64" ]]; then
1238 BIT=64
1239 else [[ $BIT = "32" ]];
1240 BIT=32
1243 printtask "### verify tools ###"
1244 which patch >> "$LOG" || misstools_error "Missing \"patch\" utility."
1245 which tar >> "$LOG" || misstools_error "Missing \"tar\" utility"
1246 which jar >> "$LOG" || misstools_error "Missing \"Java Development Kit\" (JDK)"
1247 which java >> "$LOG" || misstools_error "Missing \"Java Development Kit\" (JDK)"
1248 which cpio >> "$LOG" || misstools_error "Missing \"cpio\" utility"
1249 [ -f "$TOOL" ] || misspatch_error "patch_tool.tgz is missing"
1250 [ -f "$PTCH" ] || misspatch_error "patch_patches.tgz is missing"
1251 printtask "### verify ROM ###"
1252 [ -f "$ROM" ] || print_error "Cannot find $1!! Make sure you have the location and name right"
1253 echo "### running $0 $@" >> "$LOG"
1254 cd "$TEMP"
1256 PATH="$TEMP:$PATH"
1257 export PATH
1258 echo "PATH= $PATH" >> "$LOG"
1260 printtask "### unzip patch tools ###"
1261 tar xzf "$TOOL" > /dev/null || print_error "failed extracting tools !!!"
1263 # Get OS specific tools
1264 case $(uname -s) in
1265 CYGWIN*)
1266 \mv cygwin/aapt.exe .
1267 \mv cygwin/*.exe boot/
1268 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
1270 [Dd]arwin)
1271 \mv mac/aapt .
1273 [Ll]inux)
1274 \mv linux/aapt .
1277 \mv linux/aapt .
1279 esac
1280 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
1281 chmod a+x aapt$EXE
1283 printtask "### unzip patch patches ###"
1284 tar xzf "$PTCH" > /dev/null || print_error "failed extracting patches !!!"
1286 # we need build.prop for both RIL probing and ROM probing
1287 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || print_error "failed extracting build.prop from $ROMX !!!"
1289 # rom + ril type
1290 proberil
1291 printtask "### probe rom type ###"
1292 proberom
1294 # rom type
1295 if [ $# -gt 1 ]; then
1296 PIT=$2
1297 if [[ "$PIT" = "-h" ]]; then
1298 display_help
1302 if [ $# -gt 2 ]; then
1303 RID=$3
1304 case "$RID" in
1305 cm*|cyanogenmod*)
1306 RID=cm;
1308 aokp*|teamkang)
1309 RID=aokp;
1311 pa*)
1312 RID=pa;
1314 .aosp-ever)
1315 RID=".aosp-ever";
1317 .aosp-slim)
1318 RID=".aosp-slim"
1320 .aosp-pac)
1321 RID=".aosp-pac"
1323 aosp*)
1324 case "ANDR" in
1325 4.1)
1326 RID=$(aosp_mod_check);
1329 RID=$(ever_check)
1331 esac
1333 201*)
1334 date_error "You must specify ROMTYPE if designating a patch date!!"
1337 rom_error "$RID is not a valid ROMTYPE!!"
1339 esac
1340 romtype_set
1341 echo "... Using $ROMTYPE patches ..."
1342 else
1343 echo "... Using results of ROM check ..."
1346 # patch type
1347 if [ $# -gt 1 ]; then
1348 PIL=${2//,/ } # If more than one mod, make string separated by spaces
1349 else
1350 PIL="openpdroid"
1351 echo "No mods selected. Defaulting to openpdroid, since that's what you probably want..."
1354 # Ensure only 1 Pdroid mod at a time; PDroid first, so provisionals do not overwrite other mods...
1356 PID=(${PIL// / }) # turn string of requested mods into array
1357 COPYPID=("${PID[@]}") # working copy to iterate over
1358 MODS_NUMBER=${#COPYPID[@]} # number of elements (mods)
1360 if [[ $MODS_NUMBER > 1 ]]; then # because if only one mod, not needed
1361 INDEX=0 # 'pd2.0' didn't work with unset; regex use bars multiple 'pdroid's
1362 for p in ${COPYPID[@]}; do
1363 if [ "$p" = "pdroid" ] || [ "$p" = "pd2.0" ] ||[ "$p" = "openpdroid" ]; then
1364 SPID[0]=$p #set pdroid first
1365 unset COPYPID["$INDEX"]
1366 break
1367 else
1368 INDEX=$((INDEX + 1)) # if (!pdroid), set as 1, 2...
1370 done
1371 for p in ${COPYPID[@]}; do
1372 if [ "$p" = "pdroid" ] || [ $p = "pd2.0" ] ||[ $p = "openpdroid" ]; then
1373 conflict_error "Those mods conflict! Only one pdroid mod at a time!"
1374 else
1375 i=${#SPID[@]}
1376 SPID[i]=$p
1377 i+=1
1379 done
1380 else
1381 SPID=${COPYPID[@]}
1383 for P in ${PIL[@]}; do
1384 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
1385 done
1387 # Check if selected mods are available for rom's Android version.
1388 compat_check
1390 # Make sure mod and rom don't conflict (e.g. pa and tabletUI)
1391 if [[ $ROM_CONFLICTS != "None" ]]; then
1392 rom_compat_check
1395 # Build date
1396 if [ $# -gt 3 ]; then # if a date is specified on command line...
1397 # Set date to match argument and ensure that patches with that date exist
1398 BID=$4
1399 [ -d patches/$P/$ANDR/$RID/$BID ] || print_error "No $P patches for $RID on $BID!! Try the help menu!!"
1400 # Run build_query- this overrides the above but gets useful info
1401 build_query
1402 # Reset patch date to argument (basically undo the effects of the build_query call)
1403 BID=$4
1404 echo "... $PID patch date set manually to: $BID ..."
1405 else
1406 build_query # if no date specified, use one from build_query
1409 # echo ROM info
1410 rominfo
1412 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
1413 #Although this placement may be perfect for romfilter. although it throws the scheme...
1414 display_help
1416 #Begin cycle
1418 for P in ${PID[@]}; do
1419 [ -d patches/$P ] || print_error "$P is not available"
1420 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1421 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1422 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1424 unset FILES
1425 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1426 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1427 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1428 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1429 for FILE in ${FILES[@]}; do
1430 case "$FILE" in
1431 +system/*)
1432 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
1434 -system/*)
1435 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
1437 system/*.jar)
1438 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
1439 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1441 # added for the use-case of apktool failure
1442 ~system/*apk) # apks to decompile with smali binaries instead of apktool
1443 [[ ${JID[@]} =~ ${FILE:1} ]] || JID=(${JID[@]} ${FILE:1})
1444 FORMATTED_FILE=${FILE:1}
1445 echo "set_perm(0, 0, 0644, \"/$FORMATTED_FILE\");" >> UPDATE.txt
1447 system/*.apk)
1448 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
1449 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1450 # $APKID will have elements removed sometimes--$AID is the master list for the update.zip
1451 declare -a APKID=( "${AID[@]}" )
1453 *.img)
1454 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
1456 system/*)
1457 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
1459 esac
1460 done
1461 done
1462 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
1463 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
1464 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
1465 echo "### APK FILES= ${AID[@]}" >> "$LOG"
1466 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
1467 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
1469 # extract system files
1470 printtask "### unzip rom ###"
1471 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || print_error "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
1474 # Update/Restore.zip scripts and prep
1475 printtask "### create updater script ###"
1476 UPDATER_LOC=META-INF/com/google/android
1477 UPDS=updater-script
1478 UPDATE="update-$ROMTYPE-$DID-$BDID-${PIL// /-}"
1479 RESTORE="restore-$ROMTYPE-$DID-$BDID"
1481 jar -xvf "$ROMX" $UPDATER_LOC/$UPDS $UPDATER_LOC/update-binary
1482 jar -xvf "$ROMX" $UPDATER_LOC/update-binary-installer 1> /dev/null 2> /dev/null
1484 # Determine Installer- Aroma or ClockworkMod
1485 if [ -f $UPDATER_LOC/update-binary-installer ]; then
1486 printtask "... using Aroma installer ..."
1487 \mv $UPDATER_LOC/update-binary-installer $UPDATER_LOC/update-binary
1488 else
1489 printtask "... using Clockworkmod installer ..."
1492 # Create updater scripts
1493 cat patches/.common/updater-message.txt >> $UPDS
1494 cat $UPDATER_LOC/$UPDS | grep ^mount | grep "/system" | head -n 1 >> $UPDS
1495 [ -s $UPDS ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" >> $UPDS
1496 # restore the original
1497 for FILE in ${EID[@]}; do
1498 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
1499 done
1500 # replace with the original or delete it
1501 for FILE in ${CID[@]}; do
1502 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> $UPDS
1503 done
1504 echo "package_extract_dir(\"system\", \"/system\");" >> $UPDS
1505 # permission management for files that need specific perms
1506 cat $UPDATER_LOC/$UPDS | grep set_perm | grep "/system" >> $UPDS
1507 for P in ${PID[@]}; do
1508 if [ -s patches/$P/$A/set_perm.txt ]; then
1509 echo "...setting permissions..."
1510 cat patches/$P/$A/set_perm.txt >> $UPDS
1512 done
1513 cat $UPDATER_LOC/$UPDS | grep ^unmount | grep "/system" | head -n 1 >> $UPDS
1514 [[ ${IID[@]} =~ boot.img ]] && cat $UPDATER_LOC/$UPDS | grep "boot.img" >> $UPDS
1515 echo "ui_print(\" .\");" >> $UPDS
1516 echo "ui_print(\" .\");" >> $UPDS
1517 echo "ui_print(\" done!\");" >> $UPDS
1518 cat $UPDS > $UPDATER_LOC/$UPDS
1519 echo "# generated $UPDS" >> "$LOG"
1520 cat $UPDS >> "$LOG"
1522 printtask "### create restore.zip ###"
1523 jar -cvf tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
1524 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
1525 \mv signed.zip $RESTORE.zip
1526 \rm -f tmp.zip
1529 # Begin patching process
1531 # decompile system files
1532 printtask "### decompile system files ###"
1533 for FILE in ${JID[@]}; do
1534 JAR=${FILE##*/}
1535 printtask "... decompile $JAR ..."
1536 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
1537 if [ $FILE == "system/framework/framework.jar" ]; then
1538 printtask "... extract preloaded-classes ..."
1539 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
1540 \mv preloaded-classes tmp/${FILE}.out/
1542 done
1544 # install framework-files for APK...
1545 if [ ${#AID[@]} -gt 0 ]; then
1546 jar -xvf "$ROMX" system/framework/framework-res.apk >> "$LOG"
1547 printtask "... installing framework files ..."
1548 java -jar apktool.jar if system/framework/framework-res.apk
1549 # Decompile APKs
1550 for FILE in ${AID[@]}; do
1551 APK=${FILE##*/}
1552 if [ -f $FILE ]; then
1553 printtask "... decompile $APK ..."
1554 java -jar apktool.jar d -f $FILE tmp/$FILE.out 2>> "$LOG"
1556 done
1559 # Unpack image files {boot.img only so far...}
1560 for FILE in ${IID[@]}; do
1561 printtask "### unpacking $FILE ###"
1562 case "$FILE" in
1563 boot.img)
1564 if [ -f boot.img ]; then
1565 cd boot
1566 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
1567 mkdir ramdisk
1568 cd ramdisk
1569 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
1570 cd ../../
1571 else
1572 print_error "A mod needs to patch boot.img! This rom does not contains boot.img."
1576 print_error "cannot process $FILE"
1578 esac
1579 done
1581 # apply system modification
1583 for P in ${PID[@]}; do
1584 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1585 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1586 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1587 PAR=patches/$P/$A/$R
1588 PARB=patches/$P/$A/$R/$B
1590 unset FILES COPY DELS JARS APKS IMGS TXTS
1591 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1592 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1593 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1594 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1595 for FILE in ${FILES[@]}; do
1596 case $FILE in
1597 +system/*)
1598 COPY=(${COPY[@]} ${FILE:1})
1600 -system/*)
1601 DELS=(${DELS[@]} ${FILE:1})
1603 system/*.jar)
1604 JARS=(${JARS[@]} $FILE)
1606 ~system/*)
1607 JARS=(${JARS[@]} ${FILE:1})
1609 system/*.apk)
1610 APKS=(${APKS[@]} $FILE)
1612 *.img)
1613 IMGS=(${IMGS[@]} $FILE)
1615 system/*)
1616 TXTS=(${TXTS[@]} $FILE)
1618 esac
1619 done
1621 [[ -n ${COPY[@]} ]] && echo "### copy patch $P/$A/$ROMTYPE/$B ###"
1622 echo "### copy patch $P/$A/$R/$B ###" >> "$LOG"
1623 for FILE in ${COPY[@]}; do
1624 printtask "... copying $FILE ..."
1625 DEST=${FILE%/*}
1626 mkdir -p ./$DEST
1627 if [ -e patches/$P/$A/$R/$B/$FILE ]; then
1628 printtask "... overwriting $FILE from $P ..."
1629 \cp -av patches/$P/$A/$R/$B/$FILE ./$DEST >> "$LOG" 2>&1
1630 elif [ -e patches/$P/common/$FILE ]; then
1631 printtask "... overwriting $FILE from $P ..."
1632 echo " ### SOMETHING WENT WRONG!! Could not find file-- using common. ###" >> "$LOG"
1633 \cp -av patches/$P/common/$FILE ./$DEST >> "$LOG" 2>&1
1634 else
1635 print_error "$FILE is missing in the patch. Please upload your logfile to the support thread!"
1637 done
1639 # unconditional smali copying- For particularly troublesome files
1640 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
1641 [ -f patches/$P/$A/smali.txt ] && SMALI=$(cat patches/$P/$A/smali.txt)
1642 [ -f patches/$P/$A/$R/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/smali.txt)
1643 [ -f patches/$P/$A/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/$B/smali.txt)
1644 MOVE=${SMALI##*/}
1645 for SMALI in ${SMALI[@]}; do
1646 if [ -f patches/$P/$A/$R/$B/$SMALI ]; then
1647 printtask "... overwriting $MOVE ..."
1648 \cp -a patches/$P/$ANDR/$R/$B/$SMALI tmp/$SMALI >> "$LOG" 2>&1
1649 # This lower area should be deprecated now...wait and see. Each BID has own link to provisionals now.
1650 elif [ -f patches/$P/$A/.provisionals/$SMALI ]; then
1651 printtask "... overwriting $MOVE ..."
1652 \cp -a patches/$P/$ANDR/.provisionals/$SMALI tmp/$SMALI >> "$LOG"
1654 done
1656 [[ -n ${DELS[@]} ]] && echo "### delete patch $P/$A/$ROMTYPE/$B ###"
1657 echo "### delete patch $P/$A/$R/$B ###" >> "$LOG"
1658 for FILE in ${DELS[@]}; do
1659 printtask "... deleting $FILE ..."
1660 \rm -rf ./$FILE
1661 done
1662 [[ -n ${JARS[@]} ]] && echo "### jar patch $P/$A/$ROMTYPE/$B ###"
1663 echo "### jar patch $P/$A/$R/$B ###" >> "$LOG"
1665 # Iterate through jars and patch. If fails, try prepatched provisionals or look for alternative patch.
1666 ALT_PATCH_NUMBER=2
1667 for (( current_jar=0; current_jar < ${#JARS[@]}; current_jar++)); do
1668 FILE=${JARS[$current_jar]}
1669 JAR=${FILE##*/}
1670 if [[ $FILE == *".jar" ]]; then # allows for *.apks to be decompiled by baksmali
1671 NAME=${JAR%.jar}
1672 else
1673 NAME=$JAR # TODO: Maybe rename this, since it now encompases apks at times
1675 printtask "... apply $NAME.patch ..."
1676 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
1677 for INCREMENTAL in $(ls $PARB/${NAME}-*.patch 2>/dev/null); do
1678 printtask "... apply $(basename $INCREMENTAL) ..."
1679 patch -Nls -p1 -d tmp/${FILE}.out < $INCREMENTAL 2>&1 > ${JAR}.log
1680 done
1681 cat ${JAR}.log >> "$LOG"
1682 case "$NAME" in
1683 framework)
1684 # patch preloaded-classes only if a patch exists
1685 if [ -f $PARB/preloaded.patch ]; then
1686 printtask "... apply preloaded.patch ..."
1687 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
1688 cat preloaded.log >> "$LOG"
1689 [[ $(grep FAILED preloaded.log) != "" ]] && print_error "failed preloaded.patch"
1693 echo -n "" # do nothing else
1695 esac
1696 # substitute failed smali with provisional (a prepatched smali file)
1697 unset FAILS
1698 FAILS=($(grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'))
1699 if [[ -n ${FAILS[@]} ]]; then
1700 print_to_log "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
1701 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
1702 for FAIL in ${FAILS[@]}; do
1703 PROVISIONAL="patches/$P/$ANDR/.provisionals/${FILE}.out/smali/${FAIL}"
1704 ALTERNATIVE_PATCH=$(ls $PARB/${NAME}$ALT_PATCH_NUMBER*.patch 2>/dev/null)
1705 if [ ! -f "$PROVISIONAL" ]; then
1706 if [ -f "$ALTERNATIVE_PATCH" ]; then
1707 printtask "## trying alternative ${NAME} patch ###"
1708 prep_alternate_patch
1709 else
1710 print_error "failed $FAIL in $JAR cannot be remedied"
1712 else
1713 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1714 [[ ${SID[@]} =~ $FAIL ]] && print_error "$FAIL was already replaced before"
1715 copy_prepatched_provisional
1717 done
1719 [[ $(grep FAILED ${JAR}.log) != "" ]] && print_error "failed $NAME.patch"
1720 garbage tmp/${FILE}.out
1722 # run special $JAR.sh scripts if any JAR needs special attention
1723 if [ -f patches/$P/$A/$R/$B/${JAR}.sh ]; then
1724 printtask "... apply $JAR.sh ..."
1725 . patches/$P/$A/$R/$B/${JAR}.sh 2>&1 > ${JAR}.log
1726 cat ${JAR}.log | tee -a "$LOG"
1728 done
1730 [[ -n ${APKS[@]} ]] && echo "### apk patch $P/$A/$ROMTYPE/$B ###"
1731 echo "### apk patch $P/$A/$R/$B ###" >> "$LOG"
1732 for FILE in ${APKS[@]}; do
1733 APK=${FILE##*/}
1734 if [ -d "tmp/${FILE}.out" ] ; then
1735 printtask "... apply $APK.patch ..."
1736 patch -Nls -p2 -d tmp/${FILE}.out < $PARB/${APK}.patch 2>&1 > ${APK}.log
1737 cat ${APK}.log >> "$LOG"
1739 if [[ $(grep FAILED ${APK}.log) != "" ]]; then
1740 apk_copy
1741 declare -a APKID=( ${APKID[@]/$FILE/} )
1743 garbage tmp/${FILE}.out
1744 else
1745 echo "No $APK in your ROM. Not able to patch this file."
1746 echo "## No $APK in ROM ###" >> "$LOG"
1748 done
1749 [[ -n ${IMGS[@]} ]] && echo "### img patch $P/$A/$ROMTYPE/$B ###"
1750 echo "### img patch $P/$A/$R/$B ###" >> "$LOG"
1751 for FILE in ${IMGS[@]}; do
1752 IMG=${FILE##*/}
1753 printtask "... applying $IMG.patch ..."
1754 patch -Nls -p1 -d boot/ramdisk < $PARB/${IMG}.patch >> "$LOG" || print_error "failed patching $FILE"
1755 done
1757 # Text Editing Functions --this can really do just about anything. Needs a working restore!
1758 [[ -n ${TXTS[@]} ]] && echo "### text patch $P/$A/$ROMTYPE/$B ###"
1759 echo "### text patch $P/$A/$R/$B ###" >> "$LOG"
1760 for FILE in ${TXTS[@]}; do
1761 TXT=${FILE##*/}
1762 if [[ -f $PARB/${TXT}.patch ]]; then
1763 printtask "... apply $TXT.patch ..."
1764 patch -Nls -p2 -d system/ < $PARB/${TXT}.patch 2>&1 > ${TXT}.log
1765 #cat ${TXT}.log | tee -a "$LOG"
1766 [[ $(grep FAILED ${TXT}.log) != "" ]] && print_error "failed $TXT.patch"
1768 if [[ -f $PAR/${TXT}.awk ]]; then
1769 printtask "... apply $TXT.awk ..."
1770 awk -f $PAR/${TXT}.awk $FILE > text || print_error "failed $TXT.awk"
1771 mv text $FILE
1773 if [[ -f $PAR/${TXT}.sed ]]; then
1774 printtask "... apply $TXT.sed ..."
1775 sed -f $PAR/${TXT}.sed $FILE > text || print_error "failed $TXT.sed"
1776 mv text $FILE
1778 if [[ -f $PAR/${TXT}.sh ]]; then
1779 printtask "... apply $TXT.sh ..."
1780 . $PAR/${TXT}.sh 2>&1 >> ${TXT}.log || print_error "failed $TXT.sh"
1782 garbage system/
1783 done
1784 done
1786 # Device specific scripts- Placement is up-for-review
1787 if [ -f patches/.devices/$DID/$DID.sh ]; then
1788 . patches/.devices/$DID/$DID.sh
1791 # Replace updater-script for CM7- it formats system -Testing
1792 if [ "$ANDR" == "gingerbread" ]; then
1793 replace_updater
1796 # Rebuilding system files
1798 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
1799 for FILE in ${JID[@]}; do
1800 JAR=${FILE##*/}
1801 printtask "... rebuild $JAR ..."
1802 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
1803 [ -f tmp/${FILE}.out/classes.dex ] || smali_error "failed compiling $JAR !!!"
1804 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
1805 if [ $FILE == "system/framework/framework.jar" ]; then
1806 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
1808 done
1810 [[ -n ${APKID[@]} ]] && printtask "### rebuild apk ###"
1811 for FILE in ${APKID[@]}; do
1812 APK=${FILE##*/}
1813 if [ -d tmp/${FILE}.out ]; then
1814 apk_was_copied=false
1815 printtask "... rebuild $APK ..."
1816 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || apk_copy
1817 if !("$apk_was_copied"); then
1818 jar -uvf $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
1821 done
1823 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
1824 for FILE in ${IID[@]}; do
1825 printtask "### rebuild $FILE ###"
1826 case $FILE in
1827 boot.img)
1828 # Rebuilding boot.img
1829 cd boot
1830 printtask "... rebuilding ramdisk ..."
1831 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
1832 printtask "... composing boot.img ..."
1833 BASE=$(cat boot.img-base)
1834 # hex to decimal in cygwin prefixing "0x" w/ C arithmetic
1835 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
1836 CMDLINE=$(cat boot.img-cmdline)
1837 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
1838 echo "pagesize = $PGSIZE" >> "$LOG"
1839 echo "base = $BASE" >> "$LOG"
1840 printtask "... rebuilding boot.img ..."
1841 ./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"
1842 cd ..
1845 print_error "cannot process $FILE"
1847 esac
1848 done
1850 printtask "### create $UPDATE.zip ###"
1851 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
1852 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip $UPDATE.zip 2>> "$LOG"
1854 \mv $RESTORE.zip $UPDATE.zip ..
1855 printtask "### finished ###"
1856 printtask ""
1857 printtask "$(colorize_bold ${red}Congratulations), the patching was $(colorize_bold ${red}successful)."
1858 printtask "Any errors you may have seen were succesfully handled!"
1859 printtask ""
1860 printtask "!!! Only file a bug report if the software is $(colorize_bold ${grn}not) behaving as expected !!!"
1861 printtask ""
1862 echo "to install patched files, flash:"
1863 printtask "---$(colorize_bold ${grn}$UPDATE.zip)"
1864 echo ""
1865 printtask "to restore original system, flash:"
1866 printtask "---$(colorize_bold ${grn}$RESTORE.zip)"
1867 echo ""
1869 # add announcement- optional.
1870 for P in ${PID[@]}; do
1871 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1872 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1873 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1874 if [ -f patches/$P/$A/$R/$B/README.txt ]; then
1875 cat patches/$P/$A/$R/$B/README.txt
1876 elif [ -f patches/$P/$A/$R/README.txt ]; then
1877 cat patches/$P/$A/$R/README.txt
1878 elif [ -f patches/$P/$A/README.txt ]; then
1879 cat patches/$P/$A/README.txt
1881 done
1883 cd ..
1884 \rm -rf "$TEMP"