Add a .gitattribute to treat patches and text files as binary (from gcydtmkq)
[auto-patcher.git] / auto_patcher
blob6c45b25e51f76107135df5aad2e294d9704900fd
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
144 # 2013.07.17. (2.9.927) Fix missing Mms (finally), support for CM Final, many bugfixes (conflicts, mod ordering, etc.)
145 # 2013.07.20. (2.9.93) New OPD CM patches, many bugfixes
147 # SHELL PROGRAMMING NOTES:
148 # [ -s FILE ]
149 # [[ -n STRING ]] or [[ -z STRING ]]
151 VERSION="v2.9.9315"
152 # PATCHES_VERSION needs to be incremented every time ANY changes occur to patches.
153 PATCHES_VERSION="20130721"
154 CURRENT_ANDROID="4.2.2"
156 # Available ROMTYPES.
157 # ROMTYPES that are hidden can be forced on the command line. But they are best left
158 # blank to be automatically parsed by our romprobe or by just entering the parent...usually AOSP.
160 #Non-obvious ROMTYPE legend
161 # @.aosp-slim: SlimRom @.aosp-pac: PAC-man
162 # @.aosp-ever: Evervolv @pa: ParanoidAndroid (official jellybean branch only for now)
163 declare -a AVAILABLE_ROMTYPES=('aokp' 'aosp' 'cm' 'pa' '.aosp-slim' '.aosp-pac' '.aosp-ever')
165 # pass variables to children
166 set -a
168 # Set any environmental variables
169 LANG=C
171 # Config file: For now hosting AUTO_UPDATE and PRODUCTION(currently unused). Not under version control.
172 if [ ! -f .config ]; then
173 cp -a ap_scripts/config_template .config
175 source .config
177 # Colorize and add text parameters
178 red=$((tput setaf 1) 2>/dev/null) # red
179 grn=$((tput setaf 2) 2>/dev/null) # green
180 cyan=$((tput setaf 6) 2>/dev/null) # cyan
181 txtBold=$((tput bold) 2>/dev/null) # Bold
182 txtReset=$((tput sgr0) 2>/dev/null) # Reset
184 colorize () {
185 # pass color and then reset
186 echo -e $@${txtReset}
189 colorize_bold () {
190 echo -e ${txtBold}$@${txtReset}
193 printusage_help () {
194 PID="openpdroid,3gdongle" # default example
195 brief_help
198 brief_help () {
199 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
200 echo " example: ./auto_patcher CM10.zip $PID cm"
201 echo ""
202 echo "Use ./auto_patcher -h for the help menu"
203 echo ""
204 cleanup
205 exit
208 usage_help () {
209 PID=mods
210 mods_display
211 echo "Multiple MODS can be combined by separating them with a comma and NO SPACES!!!"
212 echo ""
213 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
214 echo ""
215 echo " example: ./auto_patcher CM10.zip openpdroid,3gdongle cm"
216 echo ""
217 usage_more_help
220 usage_more_help () {
221 echo "* press 'q' available patches or CTRL-c to quit the help menu *"
224 display_help () {
225 cd patches
226 echo ""
227 echo "AVAILABLE PATCHES"
228 echo ""
229 echo "*******************************************************************"
230 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
231 echo ""
232 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
233 echo ""
234 echo "!!! Do not put Android Version number on command line !!!!"
235 echo "*****************************************************************"
236 echo "Specific auto_patcher script options"
237 echo " ./auto_patcher -h mods Lists mods"
238 echo " -h <MODNAME> Specific <MOD> info"
239 echo " -h advanced Advanced usage+lists all available patch dates"
240 echo ""
241 cleanup
242 exit
245 romtype_help () {
246 # From rom_error (bad romtype) and date_error (patch date w/o specifying romtype)
247 echo ""
248 echo "!!!There are only four supported ROMTYPES: 1) cm 2) aokp 3) aosp 4) pa"
249 echo ""
250 echo "Find out which of the above ROMTYPES your rom is based on and try again!"
251 echo "**********************************************"
252 echo ""
253 cleanup
254 brief_help
257 advanced_help () {
258 echo ""
259 echo "The Auto-Patcher Advanced Usage"
260 echo "*********************************"
261 echo ""
262 echo "For those of you determined to try everything..."
263 echo ""
264 echo "You can also try adding a patch date as a final argument."
265 echo ""
266 echo " ./auto_patcher <ROM> <MOD> <ROMTYPE> <DATE>"
267 echo ""
268 echo "Please note: There are only four ROMTYPES: {pa, aokp, aosp and cm}"
269 echo " -The various appellations after that are for internal use only!"
270 echo ""
271 echo "The Auto-Patcher has a pretty great rom probe, specifying the date is"
272 echo " deprecated...you don't need to, we promise."
273 echo ""
276 cleanup () {
277 [[ -n $ROOT ]] && \rm -rf "$ROOT"/tmp*
280 garbage () {
281 unset GARBAGE
282 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
283 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
287 print_error () {
288 # General purpose error. Used for errors in main, as opposed to probe or set-up.
289 echo ""
290 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
291 printtask "!!! error: $@"
292 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
293 echo ""
294 brief_help
297 smali_error () {
298 # Smali binary error. Problem often goes away on second run.
299 echo ""
300 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
301 printtask "!!! error: $@"
302 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
303 echo ""
304 if [[ $(grep 'method index is too large' "$LOG") != "" ]]; then
305 printtask "!!! Problem with method cap !!!"
306 printtask "... attempting fix ..."
307 . patches/.common/framework.jar.sh 2>&1 > ${JAR}.log
308 printtask "... rebuild framework.jar ..."
309 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
310 [ -f tmp/${FILE}.out/classes.dex ] || print_error "Could not resolve method cap issue- please submit log"
311 else
312 printtask "!!! This error is generally due to an unknown bug in the smali binary!"
313 echo "In our experience, it goes away if you run the patcher a second time."
314 echo " Please run the Auto-Patcher with the same command once again."
315 echo ""
316 echo "If after the third attempt the same thing happens,"
317 echo " please upload your logfile to our support thread!"
318 echo ""
319 cleanup
320 exit
324 unknown_mod_error () {
325 echo ""
326 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
327 printtask "!!! error: $@"
328 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
329 echo ""
330 cleanup
331 printusage_help
334 mismatch_error () {
335 # Function that exposes attempts to apply a mod to an upsupported Android version
336 echo ""
337 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
338 printtask "!!! error: $@"
339 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
340 echo ""
341 cleanup
342 brief_help
345 date_error () {
346 # Remind users to include a romtype if they are going to specify a patch date
347 echo ""
348 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
349 printtask "!!! error: $@"
350 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
351 echo ""
352 echo "Please put a ROMTYPE before the patch date and run again!!"
353 romtype_help
356 rom_error () {
357 # For when an unsupported romtype is manually entered on the command-line
358 echo ""
359 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
360 printtask "!!! error: $@"
361 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
362 romtype_help
365 conflict_error () {
366 # For conflicting packages
367 echo ""
368 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
369 printtask "!!! error: $@"
370 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
371 cleanup
372 PID=mods
373 mods_info
376 misspatch_error () {
377 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
378 printtask "!! error: $@ "
379 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
380 echo ""
381 printtask "!! The Auto-Patcher could not find its patches and/or tools!"
382 echo ""
383 echo "* Did you run ./batch.sh first?"
384 echo ""
385 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
386 echo " one way or another..."
387 echo ""
388 cleanup
389 brief_help
392 misstools_error () {
393 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
394 printtask "!! error: $@ "
395 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
396 printtask "Your set-up is missing a dependency."
397 echo "We require JDK, tar, patch and cpio."
398 echo ""
399 echo ""
400 echo "Each distro is different"
401 echo "but ensure you have them all installed and try again."
402 echo ""
403 cleanup
404 brief_help
407 miss_git_error () {
408 printtask "Updater: disabled"
409 echo ""
410 printtask "You will not be able to get automatic updates because we could not find 'git'."
411 printtask "Find out how to install git for your system and that feature should work automatically"
412 echo ""
415 printtask () {
416 echo "" >> "$LOG"
417 echo -e $@ | tee -a "$LOG"
420 print_to_log () {
421 echo "$@" >> "$LOG"
424 copy_prepatched_provisional () {
425 print_to_log "File for which patching failed:"
426 print_to_log "---------------------------------------------"
427 print_to_log ""
428 print_to_log "${FAIL##*/}"
429 print_to_log ""
430 print_to_log "---------------------------------------------"
431 print_to_log ""
432 print_to_log "We are adding a pre-patched copy of those files."
433 print_to_log ""
434 print_to_log "Please only file a bug report if running the program gives you problems!!!"
435 print_to_log "... replace $FAIL ..."
436 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
437 \cp -av "$PROVISIONAL" tmp/${FILE}.out/smali/${FAIL} >> "$LOG" 2>&1
438 SID=(${SID[@]} $FAIL)
439 print_to_log "... failed patch sucessfully resolved ..."
442 prep_alternate_patch () {
443 # Use alt.patch, if exists. Increment in case there are multiple alternates.
444 mv -v $ALTERNATIVE_PATCH $PARB/${NAME}.patch >> "$LOG"
445 ALT_PATCH_NUMBER=$((PATCH_NUMBER + 1))
447 # Get fresh files/variables + decompile again (use rm b/c privacy files wouldn't get overwritten)
448 rm -rf tmp/${FILE}.out/smali
449 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
450 unset FAILS && unset SID
451 current_jar=$(($current_jar - 1))
452 break
455 no_network_access () {
456 ping www.github.com $PINGCOUNT >> "$LOG" 2>&1 && NETWORK=true # second try and check github
457 ping www.google.com $PINGCOUNT >> "$LOG" 2>&1 # test for internet in general
458 if [[ "$NETWORK" == true ]]; then
459 return
460 else
461 printtask "Check for update failed, probably because of no internet access."
462 echo "The autopatcher will continue with current local version: $VERSION"
463 NETWORK=false
464 echo ""
465 sleep 2
469 auto_update_error () {
470 echo ""
471 printtask "### Update failed ###"
472 printtask ""
473 printtask "It appears you may have made some changes to the script that prevent automatic updating."
474 printtask "You could run 'git reset --hard' to return the autopatcher to its original form"
475 printtask " or set AUTO_UPDATE to false in the .config file to stop getting this message."
476 echo ""
477 printusage_help
480 backup_script () {
481 printtask "... backing up auto_patcher to auto_patcher.bak ..."
482 cp -av auto_patcher auto_patcher.bak >> "$LOG" #backup for user in case of changes
483 echo ""
486 warn_of_overwrite () {
487 # Only seen once, by users without ".git" directories
488 # Only users who got program @ download page see this, all others (ApG included) use git
489 echo "This is a one time set-up process that will overwrite all local changes!"
490 echo "If this is not ok with you press ctrl-C and set AUTO_UPDATE to false in .config"
491 echo ""
494 establish_repo() {
495 printtask "### establishing the repo ###"
496 echo "... please be patient, this should only be needed once ..."
497 echo ""
498 git clone https://github.com/mateor/auto-patcher >> "$LOG" || no_network_access
499 if ($NETWORK); then
500 mv -v auto-patcher/".git" . >> "$LOG"
501 rm -rf auto-patcher
502 git checkout -q master || auto_update_error
503 git reset --hard 2>&1 >> "$LOG"
504 echo ""
508 export_log_and_variables () {
509 cp -a "$LOG" .updated.log
510 rm -If "$LOG"
511 AUTO_PATCHER_OLD_VERSION=$VERSION
512 AUTO_PATCHER_OLD_PATCHES_VERSION=$PATCHES_VERSION
513 AUTO_PATCHER_WAS_UPDATED=true
516 print_changelog () {
517 CHANGELOG="changelog.txt"
518 echo "" > "$CHANGELOG"
519 CURRENT_HEAD=$(git rev-parse HEAD)
520 echo "Changelog from Autopatcher$AUTO_PATCHER_OLD_VERSION to Autopatcher$VERSION" >> "$CHANGELOG"
521 echo "---------------------------------------------------------------------------" >> "$CHANGELOG"
522 echo "" >> "$CHANGELOG"
523 echo " Get more info about any individual commit by entering 'git show \$NUMBER'" >> "$CHANGELOG"
524 echo "" >> "$CHANGELOG"
525 git log --pretty=oneline $ORIGINAL_HEAD...$CURRENT_HEAD >> changelog.txt
526 printtask "... "$CHANGELOG" has been updated ..."
529 replace_updater () {
531 # Function for devices that use SDcard installs. Also to be tested for CM7
532 # since CM7 seems to use an updater-script that wipes EMMC. Testing
534 \rm $UPDATER_LOC/$UPDS 2>&1
535 \cp patches/.common/$UPDATER_LOC/$UPDS $UPDATER_LOC >> "$LOG" 2>&1
536 echo "run_program(\"/sbin/busybox\", \"umount\", \"/system\");" >> UPDATE.txt
537 cat UPDATE.txt >> $UPDATER_LOC/$UPDS
538 echo ""
539 echo "New updater-script being used:" >> "$LOG"
540 echo "-----------------------------" >> "$LOG"
541 cat $UPDATER_LOC/$UPDS >> "$LOG"
544 abspath () {
545 case $(uname -s) in
546 CYGWIN*)
547 echo $(cygpath -ua "$1") | sed 's:/$::g'
549 Darwin)
550 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
551 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
553 Linux)
554 echo $(readlink -f "$1")
557 if [[ ${1:0:1} == "/" ]]; then
558 echo "$1"
559 elif [[ ${1:0:2} == "./" ]]; then
560 echo "$PWD/${1:2}"
561 else
562 echo "$PWD/$1"
565 esac
568 mods_display () {
569 echo ""
570 echo "The Auto-Patcher $VERSION"
571 echo "*******************************"
572 echo ""
573 echo "The available mods are"
574 echo "****************************************************"
575 echo "* pdroid openpdroid voice v6supercharger *"
576 echo "* voice insecure secure external_internal *"
577 echo "* tabletUI 3gdongle pd2.0 *"
578 echo "****************************************************"
579 echo ""
580 echo "To find out more about any mod, simply enter:"
581 echo " ./auto_patcher -h <MODNAME>"
582 echo ""
583 cleanup
586 mods_info () {
587 # Defaults
588 DEPENDENCY="None"
589 DEV="Unknown"
590 CEILING=$CURRENT_ANDROID
591 ROM_CONFLICTS=(None)
592 UNKNOWN_MOD=false
593 case $PID in
594 mods)
595 mods_display
596 exit
598 auto*)
599 echo ""
600 echo "**************************************"
601 echo "The Auto-Patcher ate a kitten once..."
602 echo "**************************************"
603 echo ""
604 DEV="mateor and Caldair"
605 WEBSITE="https://github.com/mateor/auto-patcher"
606 printusage_help
608 advanced)
609 cd patches/
610 (advanced_help && find -H * -name 201*) | more -d
611 echo ""
612 brief_help
614 voice)
615 FLOOR=4.0.0
616 DESC="Use on wifi-only tablets to have the software register as 'voice-enabled'. Allows VOIP like Google Voice to function."
617 DESC="bongostl's setup method can be seen at the link."
618 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1823701"
619 DEV="bongostl"
621 v6 | v6supercharger)
622 FLOOR=4.0.0
623 CEILING=4.2.2
624 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."
625 DEV="Zeppelinrox"
626 DEPENDENCY="The V6 Supercharger Script. Get it at the link"
627 WEBSITE="http://forum.xda-developers.com/showthread.php?t=991276"
629 PID="v6supercharger" # allows shorthand 'v6' to find patches.
631 pdroid)
632 FLOOR=2.3.7
633 CEILING=4.1.2
634 DESC="Security Software that manages access to personal data w/o causing FC's. No longer under development."
635 DESC1="Try the open-source expansion of this program, OpenPdroid."
636 DESC2="(It's the 'openpdroid' mod within the Auto-Patcher)."
637 DEV="Svyat"
638 DEPENDENCY="The Pdroid app. You can get it at the link"
639 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1923576"
642 pd2.0)
643 FLOOR=4.1.2
644 CEILING=4.1.2
645 DESC="An expansion of the PDroid application/framework."
646 DEV="CollegeDev"
647 DEPENDENCY="The free PDroid2.0 app available at the link"
648 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1923576"
650 openpdroid)
651 FLOOR=4.1.2
652 CEILING=4.2.2
653 DESC="A fork of the open-source PDroid and Pdroid2.0 framework."
654 DEV="CollegeDev/FFU5y/wbedard/mateorod/Community"
655 DEPENDENCY="PDroidManager(opensource) or PDroid2.0(CollegeDev)"
656 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1994860"
658 opendroid)
659 echo ""
660 echo "No mod named 'opendroid'. You probably mean 'openpdroid'. Try again."
661 PID="mods"
662 mods_info
664 external_internal)
665 FLOOR=2.3.3
666 CEILING=4.1.2
667 DESC="Swap internal and external storage."
669 insecure)
670 FLOOR=2.3.3
671 DESC="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
673 secure)
674 FLOOR=2.3.3
675 DESC="Make any boot.img secure."
677 3gdongle)
678 FLOOR=4.1.0
679 CEILING=4.2.2
680 DESC="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
681 DEV="trevd"
682 DEPENDENCY="None, but read the troubleshooting guide at the link"
683 WEBSITE="http://forum.xda-developers.com/showthread.php?t=1798631"
685 tabletUI)
686 FLOOR=4.1.0
687 CEILING=4.2.2
688 if [[ $ANDR == "4.2" ]]; then
689 ROM_CONFLICTS=(.aosp-ever aokp pa)
690 else
691 ROM_CONFLICTS=(pa .aosp-slim)
693 DESC="Changes the user interface of Phones and Phablets to the popular Tablet UI."
694 DEV="barmullio/Caldair"
695 WEBSITE="http://forum.xda-developers.com/showthread.php?t=2154075"
698 UNKNOWN_MOD=true
699 FLOOR=?????
700 CEILING=?????
701 DESC="??? Unknown modtype ??? Check your spelling or the mod list!"
702 DESC1=" Try: \"./auto_patcher -h mods\""
703 esac
705 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
706 NVID=${VID//[.]/}
707 COMPATF=${FLOOR//[.]/}
708 COMPATC=${CEILING//[.]/}
711 apk_copy () {
712 if [ -f patches/$P/$A/$R/$B/$FILE ]; then
713 mkdir apk_staging
714 cd apk_staging
715 # Move the certs and manifests from the ROM's apk into the prepatched copy
716 jar -xvf ../"$FILE" META-INF AndroidManifest.xml >> "$LOG"
717 jar -ufv ../patches/$P/$A/$R/$B/$FILE META-INF/CERT* AndroidManifest.xml >> "$LOG" 2>> "$LOG"
718 cd ..
719 \cp -av patches/$P/$A/$R/$B/$FILE $FILE >> "$LOG" 2>&1
720 echo "... Patching $APK failed, but we have successfuly copied over a prepatched file ..."
721 apk_was_copied=true
722 else
723 print_error "failed patching $APK!!!"
727 no_mod_selected_error () {
728 echo ""
729 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
730 printtask "!!! error: $@"
731 printtask "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
732 echo ""
733 printtask "You need to enter a MOD before you try and specify the ROMTYPE."
734 printtask "Check the help menu for the list of available MODS"
735 echo ""
736 printusage_help
739 check_against_rom_types () {
740 # this checks to see if the user has entered a ROMTYPE in the MOD spot and outputs advice if so.
741 NUMBER_OF_AVAILABLE_ROMTYPES=${#AVAILABLE_ROMTYPES[@]}
742 for ((i=0; i < $NUMBER_OF_AVAILABLE_ROMTYPES; i++)); do
743 if [[ ${AVAILABLE_ROMTYPES[i]} == "$P" ]]; then
744 no_mod_selected_error "\"$P\" is a ROMTYPE not a MOD"
746 done
749 compat_check () {
750 for G in ${PID[@]}; do
751 mods_info
752 if ($UNKNOWN_MOD); then
753 check_against_rom_types
754 unknown_mod_error "\"$G\" is not a valid mod. Check your spelling or the mod list!!!"
755 elif [[ "$NVID" -lt "$COMPATF" ]]; then
756 mismatch_error "Your Android $VID rom is too old! The minimum for $G is \n !!! Android $FLOOR!"
757 elif [[ "$NVID" -gt "$COMPATC" ]]; then
758 mismatch_error "Sorry, $G has not been made available for Android $VID yet!"
760 done
763 rom_compat_check () {
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
772 rom_compat_error () {
773 print_error "$RID is incompatible with $PID!!!"
776 extpath () {
777 case $(uname -s) in
778 CYGWIN*)
779 echo $(cygpath -da "$1")
782 echo $(abspath "$1")
784 esac
787 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
789 parse () { echo "${1%%_*}"; }
791 getbuildprop () {
792 if [ -f system/build.prop ]; then
793 result=($(grep $1 system/build.prop | tr -d '\r' | tr '=' ' '))
794 echo "${result[1]}"
795 else
796 echo ""
801 aosp_mod_check() {
802 jar -xvf "$ROMX" system/framework/framework2.jar >> "$LOG"
803 if [ -s system/framework/framework2.jar ]; then
804 ever_check
805 else
806 AOSP=aosp
808 echo $AOSP
811 ever_check() {
812 MID=$(getbuildprop ro.build.romversion)
813 if [[ $MID == "Evervolv"* ]]; then
814 AOSP=".aosp-ever"
815 else
816 MID=$(getbuildprop ro.build.display.id)
817 if [[ "$MID" == "ev"* ]]; then
818 AOSP=".aosp-ever"
819 else
820 pac_check
823 echo $AOSP
826 pac_check() {
827 MID=$(getbuildprop ro.build.romversion)
828 if [[ "$MID" == "pac"* ]] || [[ "$MID" == "PAC"* ]]; then
829 AOSP=".aosp-pac"
830 else
831 MID=$(getbuildprop ro.build.display.id)
832 if [[ "$MID" == "pac"* ]] || [[ "$MID" == "PAC"* ]]; then
833 AOSP=".aosp-pac"
834 else
835 slim_check
840 slim_check() {
841 SLMID=$(getbuildprop ro.modversion)
842 SLMMID=$(getbuildprop updateme.name)
843 if [[ "$SLMMID" == "Slim"* ]] || [[ $SLMMID == "slim"* ]]; then
844 AOSP=".aosp-slim"
845 elif [[ "$SLMID" == "Slim"* ]] || [[ $SLMID == "slim"* ]]; then
846 AOSP=".aosp-slim"
847 else
848 if [[ "$ANDR" == "4.1" ]]; then
849 AOSP=.aosp-mod
850 else
851 AOSP="aosp"
856 pa_check() {
857 CMID=$(getbuildprop ro.modversion)
858 PAID=$(getbuildprop ro.pa.version)
859 MID=$(getbuildprop ro.build.display.id)
860 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
861 DID=$(getbuildprop ro.product.device)
862 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
863 if [[ -n $PAID ]]; then
864 RID=pa
865 else
866 case $CMID in
867 [Pp][Aa]*)
868 RID=pa;
871 RID=cm;
873 esac
877 romtype_set () {
878 case $RID in
880 ROMTYPE="cm"
882 aokp*)
883 ROMTYPE="aokp"
886 ROMTYPE="pa"
889 ROMTYPE="aosp"
891 esac
894 proberom () {
895 VID=$(getbuildprop ro.build.version.release)
896 if [ ${#VID} -lt 4 ]; then # in case of non-standard versioning in build.prop (defy!)
897 ANDR=$VID
898 else
899 ANDR="${VID%.*}" # Cut to 1 significant digit to cover specific range or release.
901 if [ "$ANDR" == "2.3" ]; then
902 FLAVR=gingerbread
903 API=10
904 RID=cm;
905 elif [ "$ANDR" == "4.0" ]; then
906 FLAVR=ics
907 API=15
908 MID=$(getbuildprop ro.rommanager.developerid)
909 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
910 DID=$(getbuildprop ro.product.device)
911 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
913 case "$MID" in
914 pa|cm9|cm|cyanogenmod*)
915 RID=cm;
917 aokp|teamkang)
918 RID=aokp;
920 aosp*)
921 RID=aosp;
924 echo "!!! $MID is not supported yet, trying aosp !!!"
925 RID=aosp
927 esac
928 elif [ "$ANDR" == "4.1" ]; then
929 FLAVR=jellybean
930 API=16
931 CMID=$(getbuildprop ro.cm.version)
932 if [[ -n $CMID ]]; then
933 pa_check
934 else
935 MID=$(getbuildprop ro.build.display.id)
936 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
937 DID=$(getbuildprop ro.product.device)
938 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
939 case "$MID" in
940 cm10|cm*|cyanogenmod*)
941 RID=cm;
943 aokp*|teamkang)
944 RID=aokp;
946 pa*)
947 RID=pa;
949 ev*)
950 RID=".aosp-ever";
953 RID=$(aosp_mod_check);
955 esac
957 elif [ "$ANDR" == "4.2" ]; then
958 FLAVR=jellybean
959 API=17
960 CMID=$(getbuildprop ro.cm.version)
961 MID=$(getbuildprop ro.build.display.id)
962 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
963 DID=$(getbuildprop ro.product.device)
964 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
966 case "$MID" in
967 cm*|cyanogenmod*)
968 RID=cm;
969 # hack to account for Final builds with old code and current build dates. Huge hack, but if there
970 # is one thing I don't believe in, it's "educating the user-base". Not happening. So hack it is.
971 if [[ "$CMID" == "10.1.2"* ]] || [[ "$CMID" == "10.1.3"* ]]; then
972 echo " ### CMID: $CMID: Selecting CM Final Build patches" >> "$LOG"
973 BID_OVERRIDE=20130516
976 aokp*|teamkang)
977 RID=aokp;
979 [Pp][Aa]*)
980 if [[ "$MID" == "pac"* ]] || [[ "$MID" == "PAC"* ]]; then
981 RID=".aosp-pac"
982 else
983 RID=pa;
986 ev*|Ever*)
987 RID=".aosp-ever";
990 RID="$(ever_check)";
992 esac
993 else
994 print_error "unknown ROM version $VID: generally means cannot find/read build.prop"
996 # romtype_set allows hiding ".aosp-*" types from users while leaving them as options on CLI
997 romtype_set
998 echo "... result of ROM check: version= $VID rom= $ROMTYPE ..."
1002 # Advanced build date query
1003 # This should set the patch date automatically.
1005 build_query() {
1006 UTC=$(getbuildprop ro.build.date.utc)
1008 # Difference in how OS X and Linux/Cygwin handles 'date' utility
1009 case $(uname -s) in
1010 [Dd]arwin)
1011 BDID=$(date -r $UTC +%Y%m%d)
1012 echo "#### Darwin Build Query used ####" >> "$LOG"
1015 BDID=$(date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d")
1016 echo "#### Standard Build Query ####" >> "$LOG"
1018 esac
1020 # If patch date is specified on CLI, use that patch date
1021 if [ $# -gt 3 ]; then
1022 BID=${4//,/ };
1023 BDID=$BID
1024 else
1025 case $ANDR in
1026 2.3)
1027 # CM7 roms do not have UTC time stamp- so no build query.
1028 BID=latest;
1029 echo "*** CM7 roms default to latest patches. If using an older rom ***"
1030 echo "*** specify patch date on command line. Use -h to see available patches ***"
1033 for P in ${PID[@]}; do
1034 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1035 [ -d patches/$P/$A/"$RID" ] && R=$RID || R=generic
1036 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1037 PAR=patches/$P/$A/$R
1038 PARB=patches/$P/$A/$R/$B
1039 DATES=$(ls patches/$P/$A/"$R" | grep '201*')
1040 # Intialize variable - an upperbound to determine lowest in first loop.
1041 BID=20201231
1042 # find earliest available patch date
1043 for i in $DATES; do
1044 if [[ $i -lt $BID ]]; then
1045 BID=$i
1047 done
1048 # Check if earliest patches are from before build date. Else use earliest
1050 # If rom is newer than earliest patch set, find best match
1051 if [[ $(($BID-$BDID)) -lt 0 ]]; then
1052 for g in $DATES; do
1053 # use any patch that matches $UTC
1054 if [[ $(($BDID-$g)) -eq 0 ]]; then
1055 BID=$g
1056 break
1057 # Set highest $BID w/o going over $UTC
1058 elif [[ $(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
1059 BID=$g
1061 done
1063 # Error catch if query fails.
1064 [[ $BID == "20201231" ]] && BID=latest && echo "Build Query Failed!! Default to latest!" >> "$LOG"
1065 if [[ -n "$BID_OVERRIDE" ]]; then
1066 BID="$BID_OVERRIDE"
1068 echo "... $PID patch date has been set to: $BID ..."
1069 B=$BID
1070 break
1071 done
1073 esac
1077 proberil () {
1078 RIL=$(getbuildprop ro.telephony.ril_class)
1079 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
1082 rominfo () {
1083 echo "# VER= $VERSION" >> "$LOG"
1084 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
1085 echo "# VID= $VID" >> "$LOG"
1086 echo "# PID= ${PID[@]}" >> "$LOG"
1087 echo "# MID= $MID" >> "$LOG"
1088 echo "# RID= $RID" >> "$LOG"
1089 echo "# ANDR= $ANDR" >> "$LOG"
1090 echo "# BDID= $BDID" >> "$LOG"
1091 echo "# DID= $DID" >> "$LOG"
1092 echo "# BID= $BID" >> "$LOG"
1093 echo "Patches are $PID/$ANDR/$RID/$BID" >> "$LOG"
1095 if [ -d ../".git" ]; then
1096 echo "" >> "$LOG"
1097 echo -n "Current HEAD: " >> "$LOG"
1098 git log --pretty=oneline HEAD^..HEAD >> "$LOG"
1099 echo "" >> "$LOG"
1104 if [[ $1 == -h ]]; then
1105 if [ $# -gt 1 ]; then
1106 PID=$2
1107 mods_info
1108 echo ""
1109 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
1110 echo "*************************************************"
1111 echo ""
1112 echo "Mod Name: $PID"
1113 echo ""
1114 echo " $DESC"
1115 if [[ $DESC1 ]]; then # test to see is there is a second DESC line
1116 echo " $DESC1"
1118 if [[ $DESC2 ]]; then
1119 echo -n "$DESC2"
1121 echo ""
1122 echo "Developer: $DEV"
1123 echo "Dependancies: $DEPENDENCY"
1124 if [[ $WEBSITE ]]; then
1125 echo "Website: $WEBSITE"
1127 echo ""
1128 echo "Works on ROMs from Android $FLOOR -> $CEILING"
1129 echo
1130 brief_help
1131 exit
1135 [[ $# -lt 1 || -z $1 ]] && PID="mods" && mods_info
1136 [[ $1 == "-h" ]] && usage_help | less && display_help
1138 echo ""
1139 echo "The Auto-Patcher $VERSION"
1140 # by pastime1971 and mateorod
1141 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1142 echo " (auto-updated from $AUTO_PATCHER_OLD_VERSION)"
1143 print_changelog
1145 echo ""
1147 ROOT="$(abspath "$(dirname "$(abspath "$(type -p "$0")")")")"
1148 TOOL="$ROOT/patch_tools.tgz"
1149 PTCH="$ROOT/patch_patches.tgz"
1150 cleanup
1151 # set temporaray directory
1152 DATE=$(date +%Y%m%d%H%M%S)
1153 TEMP="$ROOT/tmp$DATE"
1154 TMP="$ROOT/tmp$DATE"
1155 TMPDIR="$ROOT/tmp$DATE"
1156 mkdir "$TEMP"
1157 ROM=$(abspath "$1")
1158 ROMX=$(extpath "$1")
1159 PINGCOUNT=" -c1 "
1161 if [[ $OSTYPE == "cygwin" ]]; then
1162 EXE=".exe"
1163 PGFORM="0x"
1164 AUTO_UPDATE=false # CYGWIN AUTO_UPDATE TESTERS COMMENT THIS LINE HERE!
1165 PINGCOUNT=" 1 1 "
1168 LOG=$(abspath ./log$DATE.txt)
1169 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
1170 echo "ROOT= $ROOT" >> "$LOG"
1171 echo "TOOL= $TOOL" >> "$LOG"
1172 echo "ROM= $ROM" >> "$LOG"
1173 echo "ROMX= $ROMX" >> "$LOG"
1176 # Auto-Update # excluding ApG/cygwin for now until I talk with kobik.
1177 # To turn off auto updating, set AUTO_UPDATE in .config to false
1180 # Check for git
1181 if [ $(which git) ]; then
1182 GIT=true
1183 else
1184 miss_git_error "Missing \"git\" utility"
1185 GIT=false
1188 # If program was updated, merge the logs
1189 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1190 cat .updated.log >> "$LOG"
1191 rm -If .updated.log
1194 if [[ "$AUTO_UPDATE" == true ]] && [[ "$GIT" == true ]]; then
1195 ping www.github.com $PINGCOUNT > /dev/null 2>&1 && NETWORK=true || no_network_access
1196 if [[ "$NETWORK" == true ]]; then
1197 printtask "### checking for updates ###"
1199 # establish the repo if not already present- one time operation.
1200 if [ ! -d ".git" ]; then
1201 printtask "... initial setup to allow automatic updating ..."
1202 backup_script && warn_of_overwrite
1203 establish_repo && export_log_and_variables
1204 printtask "### rerunning script with latest version ###"
1205 $0 "$@"
1206 exit 0
1209 # Here is the regular update process
1210 git fetch origin 2>&1 >> "$LOG" || no_network_access
1211 if !("$NETWORK"); then
1212 printtask "Updater: not able to run auto_update."
1213 else
1214 COMMITS_BEHIND=$(git rev-list HEAD..origin/master --count)
1215 case "$COMMITS_BEHIND" in
1217 printtask "Updater: Auto-Patcher is already up to date"
1220 ORIGINAL_HEAD=$(git rev-parse HEAD)
1221 printtask "... Updater: update found ..."
1222 backup_script
1223 printtask "... Updating Auto-Patcher ..."
1224 git merge --no-edit origin/master 2>&1 >> "$LOG" || auto_update_error
1225 export_log_and_variables
1226 printtask "### updated, now rerunning script with latest version ###"
1227 $0 "$@"
1228 exit 0
1230 esac
1231 echo ""
1236 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1237 if [[ $PATCHES_VERSION -gt $AUTO_PATCHER_OLD_PATCHES_VERSION ]]; then
1238 echo "... integrating new patches ..."
1239 sh batch.sh >> /dev/null 2>> "$LOG"
1243 #remove old zips, if built under identical parameters.
1244 \rm -f $RESTORE.zip $UPDATE.zip
1246 CHK=$(getconf LONG_BIT)
1247 if [[ $CHK = "64" ]]; then
1248 BIT=64
1249 else [[ $BIT = "32" ]];
1250 BIT=32
1253 printtask "### verify tools ###"
1254 which patch >> "$LOG" || misstools_error "Missing \"patch\" utility."
1255 which tar >> "$LOG" || misstools_error "Missing \"tar\" utility"
1256 which jar >> "$LOG" || misstools_error "Missing \"Java Development Kit\" (JDK)"
1257 which java >> "$LOG" || misstools_error "Missing \"Java Development Kit\" (JDK)"
1258 which cpio >> "$LOG" || misstools_error "Missing \"cpio\" utility"
1259 [ -f "$TOOL" ] || misspatch_error "patch_tool.tgz is missing"
1260 [ -f "$PTCH" ] || misspatch_error "patch_patches.tgz is missing"
1261 printtask "### verify ROM ###"
1262 [ -f "$ROM" ] || print_error "Cannot find $1!! Make sure you have the location and name right"
1263 echo "### running $0 $@" >> "$LOG"
1264 cd "$TEMP"
1266 PATH="$TEMP:$PATH"
1267 export PATH
1268 echo "PATH= $PATH" >> "$LOG"
1270 printtask "### unzip patch tools ###"
1271 tar xzf "$TOOL" > /dev/null || print_error "failed extracting tools !!!"
1273 # Get OS specific tools
1274 case $(uname -s) in
1275 CYGWIN*)
1276 \mv cygwin/aapt.exe .
1277 \mv cygwin/*.exe boot/
1278 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
1280 [Dd]arwin)
1281 \mv mac/aapt .
1283 [Ll]inux)
1284 \mv linux/aapt .
1287 \mv linux/aapt .
1289 esac
1290 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
1291 chmod a+x aapt$EXE
1293 printtask "### unzip patch patches ###"
1294 tar xzf "$PTCH" > /dev/null || print_error "failed extracting patches !!!"
1296 # we need build.prop for both RIL probing and ROM probing
1297 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || print_error "failed extracting build.prop from $ROMX !!!"
1299 # rom + ril type
1300 proberil
1301 printtask "### probe rom type ###"
1302 proberom
1304 # rom type
1305 if [ $# -gt 1 ]; then
1306 PIT=$2
1307 if [[ "$PIT" = "-h" ]]; then
1308 display_help
1312 if [ $# -gt 2 ]; then
1313 RID=$3
1314 case "$RID" in
1315 cm*|cyanogenmod*)
1316 RID=cm;
1318 aokp*|teamkang)
1319 RID=aokp;
1321 pa*)
1322 RID=pa;
1324 .aosp-ever)
1325 RID=".aosp-ever";
1327 .aosp-slim)
1328 RID=".aosp-slim"
1330 .aosp-pac)
1331 RID=".aosp-pac"
1333 aosp*)
1334 case "ANDR" in
1335 4.1)
1336 RID=$(aosp_mod_check);
1339 RID=$(ever_check)
1341 esac
1343 201*)
1344 date_error "You must specify ROMTYPE if designating a patch date!!"
1347 rom_error "$RID is not a valid ROMTYPE!!"
1349 esac
1350 romtype_set
1351 echo "... Using $ROMTYPE patches ..."
1352 else
1353 echo "... Using results of ROM check ..."
1356 # patch type
1357 if [ $# -gt 1 ]; then
1358 PIL=${2//,/ } # If more than one mod, make string separated by spaces
1359 else
1360 PIL="openpdroid"
1361 echo "No mods selected. Defaulting to openpdroid, since that's what you probably want..."
1364 # Ensure only 1 Pdroid mod at a time; PDroid first, so provisionals do not overwrite other mods...
1366 PID=(${PIL// / }) # turn string of requested mods into array
1367 COPYPID=("${PID[@]}") # working copy to iterate over
1368 MODS_NUMBER=${#COPYPID[@]} # number of elements (mods)
1370 if [[ $MODS_NUMBER > 1 ]]; then # because if only one mod, not needed
1371 INDEX=0
1372 for p in ${COPYPID[@]}; do
1373 # this first loop detects presence of any pdroid mod and sets it to be first applied (SPID[0])
1374 if [ "$p" = "pdroid" ] || [ "$p" = "pd2.0" ] ||[ "$p" = "openpdroid" ]; then
1375 SPID[0]=$p #set pdroid first
1376 unset COPYPID["$INDEX"]
1377 break
1378 else
1379 INDEX=$((INDEX + 1)) # if (!pdroid), set as 1, 2...
1381 done
1382 for p in ${COPYPID[@]}; do
1383 # the second loop ensures they aren't trying to apply more than one pdroid mod, and slots in any other mods.
1384 if [ "$p" = "pdroid" ] || [ $p = "pd2.0" ] ||[ $p = "openpdroid" ]; then
1385 conflict_error "Those mods conflict! Only one pdroid mod at a time!"
1386 else
1387 i=${#SPID[@]}
1388 SPID[$i]=$p
1389 i+=1
1391 done
1392 else
1393 SPID=("${COPYPID[@]}")
1395 # reset the mod list, with the pdroid-type mod applied first (for provisional use's sake)
1396 PID=("${SPID[@]}")
1398 # Check if selected mods are available for rom's Android version.
1399 compat_check
1401 # Make sure mod and rom don't conflict (e.g. pa and tabletUI)
1402 for T in ${PID[@]}; do
1403 PID=$T #Set PID so mods_info function returns different values for each mod
1404 mods_info
1405 if [[ ${ROM_CONFLICTS[@]} != "None" ]]; then
1406 rom_compat_check
1408 done
1409 # reset to original ordered list
1410 PID=("${SPID[@]}")
1412 # Build date
1413 if [ $# -gt 3 ]; then # if a date is specified on command line...
1414 # Set date to match argument and ensure that patches with that date exist
1415 BID=$4
1416 [ -d patches/$PID/$ANDR/$RID/$BID ] || print_error "No $PID patches for $RID on $BID!! Try the help menu!!"
1417 # Run build_query- this overrides the above but gets useful info
1418 build_query
1419 # Reset patch date to argument (basically undo the effects of the build_query call)
1420 BID=$4
1421 echo "... $PID patch date set manually to: $BID ..."
1422 else
1423 build_query # if no date specified, use one from build_query
1426 # echo ROM info
1427 rominfo
1429 if [[ ( "$PID" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
1430 #Although this placement may be perfect for romfilter. although it throws the scheme...
1431 display_help
1433 #Begin cycle
1435 for P in ${PID[@]}; do
1436 [ -d patches/$P ] || print_error "$P is not available"
1437 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1438 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1439 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1441 unset FILES
1442 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1443 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1444 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1445 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1446 for FILE in ${FILES[@]}; do
1447 case "$FILE" in
1448 +system/*)
1449 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
1451 -system/*)
1452 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
1454 system/*.jar)
1455 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
1456 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1458 # added for the use-case of apktool failure
1459 @system/*apk) # apks to decompile with smali binaries instead of apktool
1460 [[ ${JID[@]} =~ ${FILE:1} ]] || JID=(${JID[@]} ${FILE:1})
1461 FORMATTED_FILE=${FILE:1}
1462 echo "set_perm(0, 0, 0644, \"/$FORMATTED_FILE\");" >> UPDATE.txt
1464 system/*.apk)
1465 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
1466 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1467 # $APKID will have elements removed sometimes--$AID is the master list for the update.zip
1468 declare -a APKID=( "${AID[@]}" )
1470 *.img)
1471 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
1473 system/*)
1474 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
1476 esac
1477 done
1478 done
1479 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
1480 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
1481 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
1482 echo "### APK FILES= ${AID[@]}" >> "$LOG"
1483 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
1484 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
1486 # extract system files
1487 printtask "### unzip rom ###"
1488 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || print_error "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
1491 # Update/Restore.zip scripts and prep
1492 printtask "### create updater script ###"
1493 UPDATER_LOC=META-INF/com/google/android
1494 UPDS=updater-script
1495 UPDATE="update-$ROMTYPE-$DID-$BDID-${PIL// /-}"
1496 RESTORE="restore-$ROMTYPE-$DID-$BDID"
1498 jar -xvf "$ROMX" $UPDATER_LOC/$UPDS $UPDATER_LOC/update-binary
1499 jar -xvf "$ROMX" $UPDATER_LOC/update-binary-installer 1> /dev/null 2> /dev/null
1501 # Determine Installer- Aroma or ClockworkMod
1502 if [ -f $UPDATER_LOC/update-binary-installer ]; then
1503 printtask "... using Aroma installer ..."
1504 \mv $UPDATER_LOC/update-binary-installer $UPDATER_LOC/update-binary
1505 else
1506 printtask "... using Clockworkmod installer ..."
1509 # Create updater scripts
1510 cat patches/.common/updater-message.txt >> $UPDS
1511 cat $UPDATER_LOC/$UPDS | grep ^mount | grep "/system" | head -n 1 >> $UPDS
1512 [ -s $UPDS ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" >> $UPDS
1513 # restore the original
1514 for FILE in ${EID[@]}; do
1515 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
1516 done
1517 # replace with the original or delete it
1518 for FILE in ${CID[@]}; do
1519 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> $UPDS
1520 done
1521 echo "package_extract_dir(\"system\", \"/system\");" >> $UPDS
1522 # permission management for files that need specific perms
1523 cat $UPDATER_LOC/$UPDS | grep set_perm | grep "/system" >> $UPDS
1524 for P in ${PID[@]}; do
1525 if [ -s patches/$P/$A/set_perm.txt ]; then
1526 echo "...setting permissions..."
1527 cat patches/$P/$A/set_perm.txt >> $UPDS
1529 done
1530 cat $UPDATER_LOC/$UPDS | grep ^unmount | grep "/system" | head -n 1 >> $UPDS
1531 [[ ${IID[@]} =~ boot.img ]] && cat $UPDATER_LOC/$UPDS | grep "boot.img" >> $UPDS
1532 echo "ui_print(\" .\");" >> $UPDS
1533 echo "ui_print(\" .\");" >> $UPDS
1534 echo "ui_print(\" done!\");" >> $UPDS
1535 cat $UPDS > $UPDATER_LOC/$UPDS
1536 echo "# generated $UPDS" >> "$LOG"
1537 cat $UPDS >> "$LOG"
1539 printtask "### create restore.zip ###"
1540 jar -cvf tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
1541 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
1542 \mv signed.zip $RESTORE.zip
1543 \rm -f tmp.zip
1546 # Begin patching process
1548 # decompile system files
1549 printtask "### decompile system files ###"
1550 for FILE in ${JID[@]}; do
1551 JAR=${FILE##*/}
1552 printtask "... decompile $JAR ..."
1553 java -jar baksmali.jar -b -a $API -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
1554 if [ $FILE == "system/framework/framework.jar" ]; then
1555 printtask "... extract preloaded-classes ..."
1556 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
1557 \mv preloaded-classes tmp/${FILE}.out/
1559 done
1561 # install framework-files for APK...
1562 if [ ${#AID[@]} -gt 0 ]; then
1563 jar -xvf "$ROMX" system/framework/framework-res.apk >> "$LOG"
1564 printtask "... installing framework files ..."
1565 java -jar apktool.jar if system/framework/framework-res.apk
1566 # Decompile APKs
1567 for FILE in ${AID[@]}; do
1568 APK=${FILE##*/}
1569 if [ -f $FILE ]; then
1570 printtask "... decompile $APK ..."
1571 java -jar apktool.jar d -f $FILE tmp/$FILE.out 2>> "$LOG"
1573 done
1576 # Unpack image files {boot.img only so far...}
1577 for FILE in ${IID[@]}; do
1578 printtask "### unpacking $FILE ###"
1579 case "$FILE" in
1580 boot.img)
1581 if [ -f boot.img ]; then
1582 cd boot
1583 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
1584 mkdir ramdisk
1585 cd ramdisk
1586 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
1587 cd ../../
1588 else
1589 print_error "A mod needs to patch boot.img! This rom does not contains boot.img."
1593 print_error "cannot process $FILE"
1595 esac
1596 done
1598 # apply system modification
1600 for P in ${PID[@]}; do
1601 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1602 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1603 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1604 PAR=patches/$P/$A/$R
1605 PARB=patches/$P/$A/$R/$B
1607 unset FILES COPY DELS JARS APKS IMGS TXTS
1608 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
1609 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
1610 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
1611 [ -f patches/$P/$A/$R/$B/files.txt ] && FILES=$(cat patches/$P/$A/$R/$B/files.txt)
1612 for FILE in ${FILES[@]}; do
1613 case $FILE in
1614 +system/*)
1615 COPY=(${COPY[@]} ${FILE:1})
1617 -system/*)
1618 DELS=(${DELS[@]} ${FILE:1})
1620 system/*.jar)
1621 JARS=(${JARS[@]} $FILE)
1623 @system/*)
1624 JARS=(${JARS[@]} ${FILE:1})
1626 system/*.apk)
1627 APKS=(${APKS[@]} $FILE)
1629 *.img)
1630 IMGS=(${IMGS[@]} $FILE)
1632 system/*)
1633 TXTS=(${TXTS[@]} $FILE)
1635 esac
1636 done
1638 [[ -n ${COPY[@]} ]] && echo "### copy patch $P/$A/$ROMTYPE/$B ###"
1639 echo "### copy patch $P/$A/$R/$B ###" >> "$LOG"
1640 for FILE in ${COPY[@]}; do
1641 printtask "... copying $FILE ..."
1642 DEST=${FILE%/*}
1643 mkdir -p ./$DEST
1644 if [ -e patches/$P/$A/$R/$B/$FILE ]; then
1645 printtask "... overwriting $FILE from $P ..."
1646 \cp -av patches/$P/$A/$R/$B/$FILE ./$DEST >> "$LOG" 2>&1
1647 elif [ -e patches/$P/common/$FILE ]; then
1648 printtask "... overwriting $FILE from $P ..."
1649 echo " ### SOMETHING WENT WRONG!! Could not find file-- using common. ###" >> "$LOG"
1650 \cp -av patches/$P/common/$FILE ./$DEST >> "$LOG" 2>&1
1651 else
1652 print_error "$FILE is missing in the patch. Please upload your logfile to the support thread!"
1654 done
1656 # unconditional smali copying- For particularly troublesome files
1657 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
1658 [ -f patches/$P/$A/smali.txt ] && SMALI=$(cat patches/$P/$A/smali.txt)
1659 [ -f patches/$P/$A/$R/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/smali.txt)
1660 [ -f patches/$P/$A/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/$B/smali.txt)
1661 MOVE=${SMALI##*/}
1662 for SMALI in ${SMALI[@]}; do
1663 if [ -f patches/$P/$A/$R/$B/$SMALI ]; then
1664 printtask "... overwriting $MOVE ..."
1665 \cp -a patches/$P/$ANDR/$R/$B/$SMALI tmp/$SMALI >> "$LOG" 2>&1
1666 # This lower area should be deprecated now...wait and see. Each BID has own link to provisionals now.
1667 elif [ -f patches/$P/$A/.provisionals/$SMALI ]; then
1668 printtask "... overwriting $MOVE ..."
1669 \cp -a patches/$P/$ANDR/.provisionals/$SMALI tmp/$SMALI >> "$LOG"
1671 done
1673 [[ -n ${DELS[@]} ]] && echo "### delete patch $P/$A/$ROMTYPE/$B ###"
1674 echo "### delete patch $P/$A/$R/$B ###" >> "$LOG"
1675 for FILE in ${DELS[@]}; do
1676 printtask "... deleting $FILE ..."
1677 \rm -rf ./$FILE
1678 done
1679 [[ -n ${JARS[@]} ]] && echo "### jar patch $P/$A/$ROMTYPE/$B ###"
1680 echo "### jar patch $P/$A/$R/$B ###" >> "$LOG"
1682 # Iterate through jars and patch. If fails, try prepatched provisionals or look for alternative patch.
1683 ALT_PATCH_NUMBER=2
1684 for (( current_jar=0; current_jar < ${#JARS[@]}; current_jar++)); do
1685 FILE=${JARS[$current_jar]}
1686 JAR=${FILE##*/}
1687 if [[ $FILE == *".jar" ]]; then # allows for *.apks to be decompiled by baksmali
1688 NAME=${JAR%.jar}
1689 else
1690 # check for abscense of any apks decompiled by baksmali (~* in files.txt). Missing jars will still error
1691 if [ ! -d "tmp/${FILE}.out" ] ; then
1692 echo "No $JAR in your ROM. Not able to patch this file."
1693 echo "## No $JAR in ROM ###" >> "$LOG"
1694 declare -a JID=( ${JID[@]/$FILE/} )
1695 break;
1697 NAME=$JAR # TODO: Maybe rename this, since it now encompases apks at times
1699 printtask "... apply $NAME.patch ..."
1700 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
1701 for INCREMENTAL in $(ls $PARB/${NAME}-*.patch 2>/dev/null); do
1702 printtask "... apply $(basename $INCREMENTAL) ..."
1703 patch -Nls -p1 -d tmp/${FILE}.out < $INCREMENTAL 2>&1 >> ${JAR}.log
1704 done
1705 cat ${JAR}.log >> "$LOG"
1706 case "$NAME" in
1707 framework)
1708 # patch preloaded-classes only if a patch exists
1709 if [ -f $PARB/preloaded.patch ]; then
1710 printtask "... apply preloaded.patch ..."
1711 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
1712 cat preloaded.log >> "$LOG"
1713 [[ $(grep FAILED preloaded.log) != "" ]] && print_error "failed preloaded.patch"
1717 echo -n "" # do nothing else
1719 esac
1720 # substitute failed smali with provisional (a prepatched smali file)
1721 unset FAILS
1722 FAILS=($(grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'))
1723 if [[ -n ${FAILS[@]} ]]; then
1724 print_to_log "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
1725 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
1726 for FAIL in ${FAILS[@]}; do
1727 PROVISIONAL="patches/$P/$ANDR/.provisionals/${FILE}.out/smali/${FAIL}"
1728 ALTERNATIVE_PATCH=$(ls $PARB/${NAME}$ALT_PATCH_NUMBER*.patch 2>/dev/null)
1729 if [ ! -f "$PROVISIONAL" ]; then
1730 if [ -f "$ALTERNATIVE_PATCH" ]; then
1731 printtask "## trying alternative ${NAME} patch ###"
1732 prep_alternate_patch
1733 else
1734 print_error "failed $FAIL in $JAR cannot be remedied"
1736 else
1737 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1738 [[ ${SID[@]} =~ $FAIL ]] && print_error "$FAIL was already replaced before"
1739 copy_prepatched_provisional
1741 done
1743 [[ $(grep FAILED ${JAR}.log) != "" ]] && print_error "failed $NAME.patch"
1744 garbage tmp/${FILE}.out
1746 # run special $JAR.sh scripts if any JAR needs special attention
1747 if [ -f patches/$P/$A/$R/$B/${JAR}.sh ]; then
1748 printtask "... apply $JAR.sh ..."
1749 . patches/$P/$A/$R/$B/${JAR}.sh 2>&1 > ${JAR}.log
1750 cat ${JAR}.log | tee -a "$LOG"
1752 done
1754 [[ -n ${APKS[@]} ]] && echo "### apk patch $P/$A/$ROMTYPE/$B ###"
1755 echo "### apk patch $P/$A/$R/$B ###" >> "$LOG"
1756 for FILE in ${APKS[@]}; do
1757 APK=${FILE##*/}
1758 if [ -d "tmp/${FILE}.out" ] ; then
1759 printtask "... apply $APK.patch ..."
1760 patch -Nls -p2 -d tmp/${FILE}.out < $PARB/${APK}.patch 2>&1 > ${APK}.log
1761 cat ${APK}.log >> "$LOG"
1763 if [[ $(grep FAILED ${APK}.log) != "" ]]; then
1764 apk_copy
1765 declare -a APKID=( ${APKID[@]/$FILE/} )
1767 garbage tmp/${FILE}.out
1768 else
1769 echo "No $APK in your ROM. Not able to patch this file."
1770 echo "## No $APK in ROM ###" >> "$LOG"
1772 done
1773 [[ -n ${IMGS[@]} ]] && echo "### img patch $P/$A/$ROMTYPE/$B ###"
1774 echo "### img patch $P/$A/$R/$B ###" >> "$LOG"
1775 for FILE in ${IMGS[@]}; do
1776 IMG=${FILE##*/}
1777 printtask "... applying $IMG.patch ..."
1778 patch -Nls -p1 -d boot/ramdisk < $PARB/${IMG}.patch >> "$LOG" || print_error "failed patching $FILE"
1779 done
1781 # Text Editing Functions --this can really do just about anything. Needs a working restore!
1782 [[ -n ${TXTS[@]} ]] && echo "### text patch $P/$A/$ROMTYPE/$B ###"
1783 echo "### text patch $P/$A/$R/$B ###" >> "$LOG"
1784 for FILE in ${TXTS[@]}; do
1785 TXT=${FILE##*/}
1786 if [[ -f $PARB/${TXT}.patch ]]; then
1787 printtask "... apply $TXT.patch ..."
1788 patch -Nls -p2 -d system/ < $PARB/${TXT}.patch 2>&1 > ${TXT}.log
1789 #cat ${TXT}.log | tee -a "$LOG"
1790 [[ $(grep FAILED ${TXT}.log) != "" ]] && print_error "failed $TXT.patch"
1792 if [[ -f $PAR/${TXT}.awk ]]; then
1793 printtask "... apply $TXT.awk ..."
1794 awk -f $PAR/${TXT}.awk $FILE > text || print_error "failed $TXT.awk"
1795 mv text $FILE
1797 if [[ -f $PAR/${TXT}.sed ]]; then
1798 printtask "... apply $TXT.sed ..."
1799 sed -f $PAR/${TXT}.sed $FILE > text || print_error "failed $TXT.sed"
1800 mv text $FILE
1802 if [[ -f $PAR/${TXT}.sh ]]; then
1803 printtask "... apply $TXT.sh ..."
1804 . $PAR/${TXT}.sh 2>&1 >> ${TXT}.log || print_error "failed $TXT.sh"
1806 garbage system/
1807 done
1808 done
1810 # Device specific scripts- Placement is up-for-review
1811 if [ -f patches/.devices/$DID/$DID.sh ]; then
1812 . patches/.devices/$DID/$DID.sh
1815 # Replace updater-script for CM7- it formats system -Testing
1816 if [ "$ANDR" == "gingerbread" ]; then
1817 replace_updater
1820 # Rebuilding system files
1822 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
1823 for FILE in ${JID[@]}; do
1824 JAR=${FILE##*/}
1825 printtask "... rebuild $JAR ..."
1826 java -Xmx512M -jar smali.jar -a $API tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
1827 [ -f tmp/${FILE}.out/classes.dex ] || smali_error "failed compiling $JAR !!!"
1828 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
1829 if [ $FILE == "system/framework/framework.jar" ]; then
1830 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
1832 done
1834 [[ -n ${APKID[@]} ]] && printtask "### rebuild apk ###"
1835 for FILE in ${APKID[@]}; do
1836 APK=${FILE##*/}
1837 if [ -d tmp/${FILE}.out ]; then
1838 apk_was_copied=false
1839 printtask "... rebuild $APK ..."
1840 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || apk_copy
1841 if !("$apk_was_copied"); then
1842 jar -uvf $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
1845 done
1847 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
1848 for FILE in ${IID[@]}; do
1849 printtask "### rebuild $FILE ###"
1850 case $FILE in
1851 boot.img)
1852 # Rebuilding boot.img
1853 cd boot
1854 printtask "... rebuilding ramdisk ..."
1855 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
1856 printtask "... composing boot.img ..."
1857 BASE=$(cat boot.img-base)
1858 # hex to decimal in cygwin prefixing "0x" w/ C arithmetic
1859 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
1860 CMDLINE=$(cat boot.img-cmdline)
1861 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
1862 echo "pagesize = $PGSIZE" >> "$LOG"
1863 echo "base = $BASE" >> "$LOG"
1864 printtask "... rebuilding boot.img ..."
1865 ./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"
1866 cd ..
1869 print_error "cannot process $FILE"
1871 esac
1872 done
1874 printtask "### create $UPDATE.zip ###"
1875 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
1876 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip $UPDATE.zip 2>> "$LOG"
1878 \mv $RESTORE.zip $UPDATE.zip ..
1879 printtask "### finished ###"
1880 printtask ""
1881 printtask "$(colorize_bold ${red}Congratulations), the patching was $(colorize_bold ${red}successful)."
1882 printtask "Any errors you may have seen were succesfully handled!"
1883 printtask ""
1884 printtask "!!! Only file a bug report if the software is $(colorize_bold ${grn}not) behaving as expected !!!"
1885 printtask ""
1886 echo "to install patched files, flash:"
1887 printtask "---$(colorize_bold ${grn}$UPDATE.zip)"
1888 echo ""
1889 printtask "to restore original system, flash:"
1890 printtask "---$(colorize_bold ${grn}$RESTORE.zip)"
1891 echo ""
1893 # add announcement- optional.
1894 for P in ${PID[@]}; do
1895 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
1896 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
1897 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
1898 if [ -f patches/$P/$A/$R/$B/README.txt ]; then
1899 cat patches/$P/$A/$R/$B/README.txt
1900 elif [ -f patches/$P/$A/$R/README.txt ]; then
1901 cat patches/$P/$A/$R/README.txt
1902 elif [ -f patches/$P/$A/README.txt ]; then
1903 cat patches/$P/$A/README.txt
1905 done
1907 cd ..
1908 \rm -rf "$TEMP"