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
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:
149 # [[ -n STRING ]] or [[ -z STRING ]]
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
168 # Set any environmental variables
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
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
185 # pass color and then reset
186 echo -e $@
${txtReset}
190 echo -e ${txtBold}$@
${txtReset}
194 PID
="openpdroid,3gdongle" # default example
199 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
200 echo " example: ./auto_patcher CM10.zip $PID cm"
202 echo "Use ./auto_patcher -h for the help menu"
211 echo "Multiple MODS can be combined by separating them with a comma and NO SPACES!!!"
213 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
215 echo " example: ./auto_patcher CM10.zip openpdroid,3gdongle cm"
221 echo "* press 'q' available patches or CTRL-c to quit the help menu *"
227 echo "AVAILABLE PATCHES"
229 echo "*******************************************************************"
230 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
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
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"
246 # From rom_error (bad romtype) and date_error (patch date w/o specifying romtype)
248 echo "!!!There are only four supported ROMTYPES: 1) cm 2) aokp 3) aosp 4) pa"
250 echo "Find out which of the above ROMTYPES your rom is based on and try again!"
251 echo "**********************************************"
259 echo "The Auto-Patcher Advanced Usage"
260 echo "*********************************"
262 echo "For those of you determined to try everything..."
264 echo "You can also try adding a patch date as a final argument."
266 echo " ./auto_patcher <ROM> <MOD> <ROMTYPE> <DATE>"
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!"
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."
277 [[ -n $ROOT ]] && \rm
-rf "$ROOT"/tmp
*
282 GARBAGE
=($
(find $@
-name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
283 GARBAGE
=($
(find $@
-name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
288 # General purpose error. Used for errors in main, as opposed to probe or set-up.
290 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
291 printtask
"!!! error: $@"
292 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
298 # Smali binary error. Problem often goes away on second run.
300 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
301 printtask
"!!! error: $@"
302 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
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"
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."
316 echo "If after the third attempt the same thing happens,"
317 echo " please upload your logfile to our support thread!"
324 unknown_mod_error
() {
326 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
327 printtask
"!!! error: $@"
328 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
335 # Function that exposes attempts to apply a mod to an upsupported Android version
337 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
338 printtask
"!!! error: $@"
339 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
346 # Remind users to include a romtype if they are going to specify a patch date
348 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
349 printtask
"!!! error: $@"
350 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
352 echo "Please put a ROMTYPE before the patch date and run again!!"
357 # For when an unsupported romtype is manually entered on the command-line
359 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
360 printtask
"!!! error: $@"
361 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
366 # For conflicting packages
368 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
369 printtask
"!!! error: $@"
370 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
377 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
378 printtask
"!! error: $@ "
379 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
381 printtask
"!! The Auto-Patcher could not find its patches and/or tools!"
383 echo "* Did you run ./batch.sh first?"
385 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
386 echo " one way or another..."
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."
400 echo "Each distro is different"
401 echo "but ensure you have them all installed and try again."
408 printtask
"Updater: disabled"
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"
417 echo -e $@ |
tee -a "$LOG"
424 copy_prepatched_provisional
() {
425 print_to_log
"File for which patching failed:"
426 print_to_log
"---------------------------------------------"
428 print_to_log
"${FAIL##*/}"
430 print_to_log
"---------------------------------------------"
432 print_to_log
"We are adding a pre-patched copy of those files."
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))
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
461 printtask
"Check for update failed, probably because of no internet access."
462 echo "The autopatcher will continue with current local version: $VERSION"
469 auto_update_error
() {
471 printtask
"### Update failed ###"
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."
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
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"
495 printtask
"### establishing the repo ###"
496 echo "... please be patient, this should only be needed once ..."
498 git clone https
://github.com
/mateor
/auto-patcher
>> "$LOG" || no_network_access
500 mv -v auto-patcher
/".git" .
>> "$LOG"
502 git checkout
-q master || auto_update_error
503 git
reset --hard 2>&1 >> "$LOG"
508 export_log_and_variables
() {
509 cp -a "$LOG" .updated.log
511 AUTO_PATCHER_OLD_VERSION
=$VERSION
512 AUTO_PATCHER_OLD_PATCHES_VERSION
=$PATCHES_VERSION
513 AUTO_PATCHER_WAS_UPDATED
=true
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 ..."
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
539 echo "New updater-script being used:" >> "$LOG"
540 echo "-----------------------------" >> "$LOG"
541 cat $UPDATER_LOC/$UPDS >> "$LOG"
547 echo $
(cygpath
-ua "$1") |
sed 's:/$::g'
550 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
551 [[ ${1:0:1} == "/" ]] && echo "$1" ||
echo "$PWD/$1"
554 echo $
(readlink
-f "$1")
557 if [[ ${1:0:1} == "/" ]]; then
559 elif [[ ${1:0:2} == "./" ]]; then
570 echo "The Auto-Patcher $VERSION"
571 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 "****************************************************"
580 echo "To find out more about any mod, simply enter:"
581 echo " ./auto_patcher -h <MODNAME>"
590 CEILING
=$CURRENT_ANDROID
600 echo "**************************************"
601 echo "The Auto-Patcher ate a kitten once..."
602 echo "**************************************"
604 DEV
="mateor and Caldair"
605 WEBSITE
="https://github.com/mateor/auto-patcher"
610 (advanced_help
&& find -H * -name 201*) |
more -d
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"
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."
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.
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)."
638 DEPENDENCY
="The Pdroid app. You can get it at the link"
639 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1923576"
645 DESC
="An expansion of the PDroid application/framework."
647 DEPENDENCY
="The free PDroid2.0 app available at the link"
648 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1923576"
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"
660 echo "No mod named 'opendroid'. You probably mean 'openpdroid'. Try again."
667 DESC
="Swap internal and external storage."
671 DESC
="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
675 DESC
="Make any boot.img secure."
680 DESC
="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
682 DEPENDENCY
="None, but read the troubleshooting guide at the link"
683 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1798631"
688 if [[ $ANDR == "4.2" ]]; then
689 ROM_CONFLICTS
=(.aosp-ever aokp pa
)
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"
701 DESC
="??? Unknown modtype ??? Check your spelling or the mod list!"
702 DESC1
=" Try: \"./auto_patcher -h mods\""
705 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
707 COMPATF
=${FLOOR//[.]/}
708 COMPATC
=${CEILING//[.]/}
712 if [ -f patches
/$P/$A/$R/$B/$FILE ]; then
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"
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 ..."
723 print_error
"failed patching $APK!!!"
727 no_mod_selected_error
() {
729 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
730 printtask
"!!! error: $@"
731 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
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"
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"
750 for G
in ${PID[@]}; do
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!"
763 rom_compat_check
() {
764 N
=${#ROM_CONFLICTS[@]}
765 for ((i
=0; i
< $N; i
++)); do
766 if [[ $RID == ${ROM_CONFLICTS[$i]} ]]; then
772 rom_compat_error
() {
773 print_error
"$RID is incompatible with $PID!!!"
779 echo $
(cygpath
-da "$1")
787 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
789 parse
() { echo "${1%%_*}"; }
792 if [ -f system
/build.prop
]; then
793 result
=($
(grep $1 system
/build.prop |
tr -d '\r' |
tr '=' ' '))
802 jar
-xvf "$ROMX" system
/framework
/framework2.jar
>> "$LOG"
803 if [ -s system
/framework
/framework2.jar
]; then
812 MID
=$
(getbuildprop ro.build.romversion
)
813 if [[ $MID == "Evervolv"* ]]; then
816 MID
=$
(getbuildprop ro.build.display.id
)
817 if [[ "$MID" == "ev"* ]]; then
827 MID
=$
(getbuildprop ro.build.romversion
)
828 if [[ "$MID" == "pac"* ]] ||
[[ "$MID" == "PAC"* ]]; then
831 MID
=$
(getbuildprop ro.build.display.id
)
832 if [[ "$MID" == "pac"* ]] ||
[[ "$MID" == "PAC"* ]]; then
841 SLMID
=$
(getbuildprop ro.modversion
)
842 SLMMID
=$
(getbuildprop updateme.name
)
843 if [[ "$SLMMID" == "Slim"* ]] ||
[[ $SLMMID == "slim"* ]]; then
845 elif [[ "$SLMID" == "Slim"* ]] ||
[[ $SLMID == "slim"* ]]; then
848 if [[ "$ANDR" == "4.1" ]]; then
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
895 VID
=$
(getbuildprop ro.build.version.release
)
896 if [ ${#VID} -lt 4 ]; then # in case of non-standard versioning in build.prop (defy!)
899 ANDR
="${VID%.*}" # Cut to 1 significant digit to cover specific range or release.
901 if [ "$ANDR" == "2.3" ]; then
905 elif [ "$ANDR" == "4.0" ]; then
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
)
914 pa|cm9|cm|cyanogenmod
*)
924 echo "!!! $MID is not supported yet, trying aosp !!!"
928 elif [ "$ANDR" == "4.1" ]; then
931 CMID
=$
(getbuildprop ro.cm.version
)
932 if [[ -n $CMID ]]; then
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
)
940 cm10|cm
*|cyanogenmod
*)
953 RID
=$
(aosp_mod_check
);
957 elif [ "$ANDR" == "4.2" ]; then
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
)
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
980 if [[ "$MID" == "pac"* ]] ||
[[ "$MID" == "PAC"* ]]; then
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
998 echo "... result of ROM check: version= $VID rom= $ROMTYPE ..."
1002 # Advanced build date query
1003 # This should set the patch date automatically.
1006 UTC
=$
(getbuildprop ro.build.
date.utc
)
1008 # Difference in how OS X and Linux/Cygwin handles 'date' utility
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"
1020 # If patch date is specified on CLI, use that patch date
1021 if [ $# -gt 3 ]; then
1027 # CM7 roms do not have UTC time stamp- so no build query.
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.
1042 # find earliest available patch date
1044 if [[ $i -lt $BID ]]; then
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
1053 # use any patch that matches $UTC
1054 if [[ $
(($BDID-$g)) -eq 0 ]]; then
1057 # Set highest $BID w/o going over $UTC
1058 elif [[ $
(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
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
1068 echo "... $PID patch date has been set to: $BID ..."
1078 RIL
=$
(getbuildprop ro.telephony.ril_class
)
1079 [[ -n $RIL ]] && printtask
"... result of ROM check: RIL= $RIL"
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
1097 echo -n "Current HEAD: " >> "$LOG"
1098 git log
--pretty=oneline HEAD^..HEAD
>> "$LOG"
1104 if [[ $1 == -h ]]; then
1105 if [ $# -gt 1 ]; then
1109 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
1110 echo "*************************************************"
1112 echo "Mod Name: $PID"
1115 if [[ $DESC1 ]]; then # test to see is there is a second DESC line
1118 if [[ $DESC2 ]]; then
1122 echo "Developer: $DEV"
1123 echo "Dependancies: $DEPENDENCY"
1124 if [[ $WEBSITE ]]; then
1125 echo "Website: $WEBSITE"
1128 echo "Works on ROMs from Android $FLOOR -> $CEILING"
1135 [[ $# -lt 1 ||
-z $1 ]] && PID
="mods" && mods_info
1136 [[ $1 == "-h" ]] && usage_help |
less && display_help
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)"
1147 ROOT
="$(abspath "$
(dirname "$(abspath "$
(type -p "$0")")")")"
1148 TOOL
="$ROOT/patch_tools.tgz"
1149 PTCH
="$ROOT/patch_patches.tgz"
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"
1158 ROMX
=$
(extpath
"$1")
1161 if [[ $OSTYPE == "cygwin" ]]; then
1164 AUTO_UPDATE
=false
# CYGWIN AUTO_UPDATE TESTERS COMMENT THIS LINE HERE!
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
1181 if [ $
(which git
) ]; then
1184 miss_git_error
"Missing \"git\" utility"
1188 # If program was updated, merge the logs
1189 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1190 cat .updated.log
>> "$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 ###"
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."
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 ..."
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 ###"
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
1249 else [[ $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"
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
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.
1290 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
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 !!!"
1301 printtask
"### probe rom type ###"
1305 if [ $# -gt 1 ]; then
1307 if [[ "$PIT" = "-h" ]]; then
1312 if [ $# -gt 2 ]; then
1336 RID
=$
(aosp_mod_check
);
1344 date_error
"You must specify ROMTYPE if designating a patch date!!"
1347 rom_error
"$RID is not a valid ROMTYPE!!"
1351 echo "... Using $ROMTYPE patches ..."
1353 echo "... Using results of ROM check ..."
1357 if [ $# -gt 1 ]; then
1358 PIL
=${2//,/ } # If more than one mod, make string separated by spaces
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
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"]
1379 INDEX
=$
((INDEX
+ 1)) # if (!pdroid), set as 1, 2...
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!"
1393 SPID
=("${COPYPID[@]}")
1395 # reset the mod list, with the pdroid-type mod applied first (for provisional use's sake)
1398 # Check if selected mods are available for rom's Android version.
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
1405 if [[ ${ROM_CONFLICTS[@]} != "None" ]]; then
1409 # reset to original ordered list
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
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
1419 # Reset patch date to argument (basically undo the effects of the build_query call)
1421 echo "... $PID patch date set manually to: $BID ..."
1423 build_query
# if no date specified, use one from build_query
1429 if [[ ( "$PID" == "-h" ||
"$RID" == "-h" ||
"$BID" == "-h" ) ]]; then
1430 #Although this placement may be perfect for romfilter. although it throws the scheme...
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
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
1449 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
1452 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
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
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[@]}" )
1471 [[ ${IID[@]} =~
$FILE ]] || IID
=(${IID[@]} $FILE)
1474 [[ ${TID[@]} =~
$FILE ]] || TID
=(${TID[@]} $FILE)
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
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
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 !!!"
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
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
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"
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
1546 # Begin patching process
1548 # decompile system files
1549 printtask
"### decompile system files ###"
1550 for FILE
in ${JID[@]}; do
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
/
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
1567 for FILE
in ${AID[@]}; do
1569 if [ -f $FILE ]; then
1570 printtask
"... decompile $APK ..."
1571 java
-jar apktool.jar d
-f $FILE tmp
/$FILE.out
2>> "$LOG"
1576 # Unpack image files {boot.img only so far...}
1577 for FILE
in ${IID[@]}; do
1578 printtask
"### unpacking $FILE ###"
1581 if [ -f boot.img
]; then
1583 .
/unpackbootimg
$EXE -i ..
/boot.img
>> "$LOG" 2>> "$LOG"
1586 gzip -dc ..
/boot.img-ramdisk.gz |
cpio -i >> "$LOG" 2>> "$LOG"
1589 print_error
"A mod needs to patch boot.img! This rom does not contains boot.img."
1593 print_error
"cannot process $FILE"
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
1615 COPY
=(${COPY[@]} ${FILE:1})
1618 DELS
=(${DELS[@]} ${FILE:1})
1621 JARS
=(${JARS[@]} $FILE)
1624 JARS
=(${JARS[@]} ${FILE:1})
1627 APKS
=(${APKS[@]} $FILE)
1630 IMGS
=(${IMGS[@]} $FILE)
1633 TXTS
=(${TXTS[@]} $FILE)
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 ..."
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
1652 print_error
"$FILE is missing in the patch. Please upload your logfile to the support thread!"
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
)
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"
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 ..."
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.
1684 for (( current_jar
=0; current_jar
< ${#JARS[@]}; current_jar
++)); do
1685 FILE
=${JARS[$current_jar]}
1687 if [[ $FILE == *".jar" ]]; then # allows for *.apks to be decompiled by baksmali
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/} )
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
1705 cat ${JAR}.log
>> "$LOG"
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
1720 # substitute failed smali with provisional (a prepatched smali file)
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
1734 print_error
"failed $FAIL in $JAR cannot be remedied"
1737 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1738 [[ ${SID[@]} =~
$FAIL ]] && print_error
"$FAIL was already replaced before"
1739 copy_prepatched_provisional
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"
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
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
1765 declare -a APKID
=( ${APKID[@]/$FILE/} )
1767 garbage tmp
/${FILE}.out
1769 echo "No $APK in your ROM. Not able to patch this file."
1770 echo "## No $APK in ROM ###" >> "$LOG"
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
1777 printtask
"... applying $IMG.patch ..."
1778 patch -Nls -p1 -d boot
/ramdisk
< $PARB/${IMG}.
patch >> "$LOG" || print_error
"failed patching $FILE"
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
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"
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"
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"
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
1820 # Rebuilding system files
1822 [[ -n ${JID[@]} ]] && printtask
"### rebuild jar ###"
1823 for FILE
in ${JID[@]}; do
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"
1834 [[ -n ${APKID[@]} ]] && printtask
"### rebuild apk ###"
1835 for FILE
in ${APKID[@]}; do
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"
1847 [[ -n ${IID[@]} ]] && printtask
"### rebuild img ###"
1848 for FILE
in ${IID[@]}; do
1849 printtask
"### rebuild $FILE ###"
1852 # Rebuilding boot.img
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"
1869 print_error
"cannot process $FILE"
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 ###"
1881 printtask
"$(colorize_bold ${red}Congratulations), the patching was $(colorize_bold ${red}successful)."
1882 printtask
"Any errors you may have seen were succesfully handled!"
1884 printtask
"!!! Only file a bug report if the software is $(colorize_bold ${grn}not) behaving as expected !!!"
1886 echo "to install patched files, flash:"
1887 printtask
"---$(colorize_bold ${grn}$UPDATE.zip)"
1889 printtask
"to restore original system, flash:"
1890 printtask
"---$(colorize_bold ${grn}$RESTORE.zip)"
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