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
146 # SHELL PROGRAMMING NOTES:
148 # [[ -n STRING ]] or [[ -z STRING ]]
151 # PATCHES_VERSION needs to be incremented every time ANY changes occur to patches.
152 PATCHES_VERSION
="20130714"
153 CURRENT_ANDROID
="4.2.2"
155 # Available ROMTYPES.
156 # ROMTYPES that are hidden can be forced on the command line. But they are best left
157 # blank to be automatically parsed by our romprobe or by just entering the parent...usually AOSP.
159 #Non-obvious ROMTYPE legend
160 # @.aosp-slim: SlimRom @.aosp-pac: PAC-man
161 # @.aosp-ever: Evervolv @pa: ParanoidAndroid (official jellybean branch only for now)
162 declare -a AVAILABLE_ROMTYPES
=('aokp' 'aosp' 'cm' 'pa' '.aosp-slim' '.aosp-pac' '.aosp-ever')
164 # pass variables to children
167 # Set any environmental variables
170 # Config file: For now hosting AUTO_UPDATE and PRODUCTION(currently unused). Not under version control.
171 if [ ! -f .config
]; then
172 cp -a ap_scripts
/config_template .config
176 # Colorize and add text parameters
177 red
=$
(tput setaf
1) # red
178 grn
=$
(tput setaf
2) # green
179 cyan
=$
(tput setaf
6) # cyan
180 txtBold
=$
(tput bold
) # Bold
181 txtReset
=$
(tput sgr0
) # Reset
184 # pass color and then reset
185 echo -e $@
${txtReset}
189 echo -e ${txtBold}$@
${txtReset}
193 PID
="openpdroid,3gdongle" # default example
198 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
199 echo " example: ./auto_patcher CM10.zip $PID cm"
201 echo "Use ./auto_patcher -h for the help menu"
210 echo "Multiple MODS can be combined by separating them with a comma and NO SPACES!!!"
212 echo " usage: ./auto_patcher <ROM> <MODS> <ROMTYPE>"
214 echo " example: ./auto_patcher CM10.zip openpdroid,3gdongle cm"
220 echo "* press 'q' available patches or CTRL-c to quit the help menu *"
226 echo "AVAILABLE PATCHES"
228 echo "*******************************************************************"
229 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
231 find -H * \
( -name aokp
-o -name cm
-o -name aosp
-o -name pa
-o -name all
-o -name generic \
) -prune |
column -c 85 |
more -d -7
233 echo "!!! Do not put Android Version number on command line !!!!"
234 echo "*****************************************************************"
235 echo "Specific auto_patcher script options"
236 echo " ./auto_patcher -h mods Lists mods"
237 echo " -h <MODNAME> Specific <MOD> info"
238 echo " -h advanced Advanced usage+lists all available patch dates"
245 # From rom_error (bad romtype) and date_error (patch date w/o specifying romtype)
247 echo "!!!There are only four supported ROMTYPES: 1) cm 2) aokp 3) aosp 4) pa"
249 echo "Find out which of the above ROMTYPES your rom is based on and try again!"
250 echo "**********************************************"
258 echo "The Auto-Patcher Advanced Usage"
259 echo "*********************************"
261 echo "For those of you determined to try everything..."
263 echo "You can also try adding a patch date as a final argument."
265 echo " ./auto_patcher <ROM> <MOD> <ROMTYPE> <DATE>"
267 echo "Please note: There are only four ROMTYPES: {pa, aokp, aosp and cm}"
268 echo " -The various appellations after that are for internal use only!"
270 echo "The Auto-Patcher has a pretty great rom probe, specifying the date is"
271 echo " deprecated...you don't need to, we promise."
276 [[ -n $ROOT ]] && \rm
-rf "$ROOT"/tmp
*
281 GARBAGE
=($
(find $@
-name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
282 GARBAGE
=($
(find $@
-name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
287 # General purpose error. Used for errors in main, as opposed to probe or set-up.
289 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
290 printtask
"!!! error: $@"
291 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
297 # Smali binary error. Problem often goes away on second run.
299 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
300 printtask
"!!! error: $@"
301 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
303 if [[ $
(grep 'method index is too large' "$LOG") != "" ]]; then
304 printtask
"!!! Problem with method cap !!!"
305 printtask
"... attempting fix ..."
306 . patches
/.common
/framework.jar.sh
2>&1 > ${JAR}.log
307 printtask
"... rebuild framework.jar ..."
308 java
-Xmx512M -jar smali.jar
-a $API tmp
/${FILE}.out
/smali
-o tmp
/${FILE}.out
/classes.dex
>> "$LOG" 2>> "$LOG"
309 [ -f tmp
/${FILE}.out
/classes.dex
] || print_error
"Could not resolve method cap issue- please submit log"
311 printtask
"!!! This error is generally due to an unknown bug in the smali binary!"
312 echo "In our experience, it goes away if you run the patcher a second time."
313 echo " Please run the Auto-Patcher with the same command once again."
315 echo "If after the third attempt the same thing happens,"
316 echo " please upload your logfile to our support thread!"
323 unknown_mod_error
() {
325 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
326 printtask
"!!! error: $@"
327 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
334 # Function that exposes attempts to apply a mod to an upsupported Android version
336 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
337 printtask
"!!! error: $@"
338 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
345 # Remind users to include a romtype if they are going to specify a patch date
347 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
348 printtask
"!!! error: $@"
349 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
351 echo "Please put a ROMTYPE before the patch date and run again!!"
356 # For when an unsupported romtype is manually entered on the command-line
358 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
359 printtask
"!!! error: $@"
360 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
365 # For conflicting packages
367 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
368 printtask
"!!! error: $@"
369 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
376 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
377 printtask
"!! error: $@ "
378 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
380 printtask
"!! The Auto-Patcher could not find its patches and/or tools!"
382 echo "* Did you run ./batch.sh first?"
384 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
385 echo " one way or another..."
392 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
393 printtask
"!! error: $@ "
394 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
395 printtask
"Your set-up is missing a dependency."
396 echo "We require JDK, tar, patch and cpio."
399 echo "Each distro is different"
400 echo "but ensure you have them all installed and try again."
407 printtask
"Updater: disabled"
409 printtask
"You will not be able to get automatic updates because we could not find 'git'."
410 printtask
"Find out how to install git for your system and that feature should work automatically"
416 echo -e $@ |
tee -a "$LOG"
423 copy_prepatched_provisional
() {
424 print_to_log
"File for which patching failed:"
425 print_to_log
"---------------------------------------------"
427 print_to_log
"${FAIL##*/}"
429 print_to_log
"---------------------------------------------"
431 print_to_log
"We are adding a pre-patched copy of those files."
433 print_to_log
"Please only file a bug report if running the program gives you problems!!!"
434 print_to_log
"... replace $FAIL ..."
435 \rm
-rf tmp
/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
436 \
cp -av "$PROVISIONAL" tmp
/${FILE}.out
/smali
/${FAIL} >> "$LOG" 2>&1
437 SID
=(${SID[@]} $FAIL)
438 print_to_log
"... failed patch sucessfully resolved ..."
441 prep_alternate_patch
() {
442 # Use alt.patch, if exists. Increment in case there are multiple alternates.
443 mv -v $ALTERNATIVE_PATCH $PARB/${NAME}.
patch >> "$LOG"
444 ALT_PATCH_NUMBER
=$
((PATCH_NUMBER
+ 1))
446 # Get fresh files/variables + decompile again (use rm b/c privacy files wouldn't get overwritten)
447 rm -rf tmp
/${FILE}.out
/smali
448 java
-jar baksmali.jar
-b -a $API -o tmp
/${FILE}.out
/smali
${FILE} >> "$LOG" 2>> "$LOG"
449 unset FAILS
&& unset SID
450 current_jar
=$
(($current_jar - 1))
454 no_network_access
() {
455 ping -c1 www.github.com
>> "$LOG" 2>&1 && NETWORK
=true
# second try and check github
456 ping -c1 www.google.com
>> "$LOG" 2>&1 # test for internet in general
457 if [[ "$NETWORK" == true
]]; then
460 printtask
"Check for update failed, probably because of no internet access."
461 echo "The autopatcher will continue with current local version: $VERSION"
468 auto_update_error
() {
470 printtask
"### Update failed ###"
472 printtask
"It appears you may have made some changes to the script that prevent automatic updating."
473 printtask
"You could run 'git reset --hard' to return the autopatcher to its original form"
474 printtask
" or set AUTO_UPDATE to false in the .config file to stop getting this message."
480 printtask
"... backing up auto_patcher to auto_patcher.bak ..."
481 cp -av auto_patcher auto_patcher.bak
>> "$LOG" #backup for user in case of changes
485 warn_of_overwrite
() {
486 # Only seen once, by users without ".git" directories
487 # Only users who got program @ download page see this, all others (ApG included) use git
488 echo "This is a one time set-up process that will overwrite all local changes!"
489 echo "If this is not ok with you press ctrl-C and set AUTO_UPDATE to false in .config"
494 printtask
"### establishing the repo ###"
495 echo "... please be patient, this should only be needed once ..."
497 git clone https
://github.com
/mateor
/auto-patcher
>> "$LOG" || no_network_access
499 mv -v auto-patcher
/".git" .
>> "$LOG"
501 git checkout
-q master || auto_update_error
502 git
reset --hard 2>&1 >> "$LOG"
507 export_log_and_variables
() {
508 cp -a "$LOG" .updated.log
510 AUTO_PATCHER_OLD_VERSION
=$VERSION
511 AUTO_PATCHER_OLD_PATCHES_VERSION
=$PATCHES_VERSION
512 AUTO_PATCHER_WAS_UPDATED
=true
516 CHANGELOG
="changelog.txt"
517 echo "" > "$CHANGELOG"
518 CURRENT_HEAD
=$
(git rev-parse HEAD
)
519 echo "Changelog from Autopatcher$AUTO_PATCHER_OLD_VERSION to Autopatcher$VERSION" >> "$CHANGELOG"
520 echo "---------------------------------------------------------------------------" >> "$CHANGELOG"
521 echo "" >> "$CHANGELOG"
522 echo " Get more info about any individual commit by entering 'git show \$NUMBER'" >> "$CHANGELOG"
523 echo "" >> "$CHANGELOG"
524 git log
--pretty=oneline
$ORIGINAL_HEAD...
$CURRENT_HEAD >> changelog.txt
525 printtask
"... "$CHANGELOG" has been updated ..."
530 # Function for devices that use SDcard installs. Also to be tested for CM7
531 # since CM7 seems to use an updater-script that wipes EMMC. Testing
533 \rm
$UPDATER_LOC/$UPDS 2>&1
534 \
cp patches
/.common
/$UPDATER_LOC/$UPDS $UPDATER_LOC >> "$LOG" 2>&1
535 echo "run_program(\"/sbin/busybox\", \"umount\", \"/system\");" >> UPDATE.txt
536 cat UPDATE.txt
>> $UPDATER_LOC/$UPDS
538 echo "New updater-script being used:" >> "$LOG"
539 echo "-----------------------------" >> "$LOG"
540 cat $UPDATER_LOC/$UPDS >> "$LOG"
546 echo $
(cygpath
-ua "$1") |
sed 's:/$::g'
549 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
550 [[ ${1:0:1} == "/" ]] && echo "$1" ||
echo "$PWD/$1"
553 echo $
(readlink
-f "$1")
556 if [[ ${1:0:1} == "/" ]]; then
558 elif [[ ${1:0:2} == "./" ]]; then
569 echo "The Auto-Patcher $VERSION"
570 echo "*******************************"
572 echo "The available mods are"
573 echo "****************************************************"
574 echo "* pdroid openpdroid voice v6supercharger *"
575 echo "* voice insecure secure external_internal *"
576 echo "* tabletUI 3gdongle pd2.0 *"
577 echo "****************************************************"
579 echo "To find out more about any mod, simply enter:"
580 echo " ./auto_patcher -h <MODNAME>"
589 CEILING
=$CURRENT_ANDROID
599 echo "**************************************"
600 echo "The Auto-Patcher ate a kitten once..."
601 echo "**************************************"
603 DEV
="mateor and Caldair"
604 WEBSITE
="https://github.com/mateor/auto-patcher"
609 (advanced_help
&& find -H * -name 201*) |
more -d
615 DESC
="Use on wifi-only tablets to have the software register as 'voice-enabled'. Allows VOIP like Google Voice to function."
616 DESC
="bongostl's setup method can be seen at the link."
617 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1823701"
623 DESC
="A memory-management tool. It requires smali edits for Android roms 4.0+. The Auto-Patcher applies all 50+ edits recommended by the dev."
625 DEPENDENCY
="The V6 Supercharger Script. Get it at the link"
626 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=991276"
628 PID
="v6supercharger" # allows shorthand 'v6' to find patches.
633 DESC
="Security Software that manages access to personal data w/o causing FC's. No longer under development."
634 DESC1
="Try the open-source expansion of this program, OpenPdroid."
635 DESC2
="(It's the 'openpdroid' mod within the Auto-Patcher)."
637 DEPENDENCY
="The Pdroid app. You can get it at the link"
638 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1923576"
644 DESC
="An expansion of the PDroid application/framework."
646 DEPENDENCY
="The free PDroid2.0 app available at the link"
647 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1923576"
652 DESC
="A fork of the open-source PDroid and Pdroid2.0 framework."
653 DEV
="CollegeDev/FFU5y/wbedard/mateorod/Community"
654 DEPENDENCY
="PDroidManager(opensource) or PDroid2.0(CollegeDev)"
655 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1994860"
659 echo "No mod named 'opendroid'. You probably mean 'openpdroid'. Try again."
666 DESC
="Swap internal and external storage."
670 DESC
="Make any boot.img insecure and allow remount as well as adb push/pull of system files. True root."
674 DESC
="Make any boot.img secure."
679 DESC
="Allows 3gdongles to work on wifi tablets w/o 3rd party applications."
681 DEPENDENCY
="None, but read the troubleshooting guide at the link"
682 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=1798631"
687 if [[ $ANDR == "4.2" ]]; then
688 ROM_CONFLICTS
=(pa .aosp-ever aokp
)
690 ROM_CONFLICTS
=(pa .aosp-slim
)
692 DESC
="Changes the user interface of Phones and Phablets to the popular Tablet UI."
693 DEV
="barmullio/Caldair"
694 WEBSITE
="http://forum.xda-developers.com/showthread.php?t=2154075"
700 DESC
="??? Unknown modtype ??? Check your spelling or the mod list!"
701 DESC1
=" Try: \"./auto_patcher -h mods\""
704 # strip decimals from android version (i.e. 2.3.7 becomes 237) so we can do math
706 COMPATF
=${FLOOR//[.]/}
707 COMPATC
=${CEILING//[.]/}
711 if [ -f patches
/$P/$A/$R/$B/$FILE ]; then
714 # Move the certs and manifests from the ROM's apk into the prepatched copy
715 jar
-xvf ..
/"$FILE" META-INF AndroidManifest.xml
>> "$LOG"
716 jar
-ufv ..
/patches
/$P/$A/$R/$B/$FILE META-INF
/CERT
* AndroidManifest.xml
>> "$LOG" 2>> "$LOG"
718 \
cp -av patches
/$P/$A/$R/$B/$FILE $FILE >> "$LOG" 2>&1
719 echo "... Patching $APK failed, but we have successfuly copied over a prepatched file ..."
722 print_error
"failed patching $APK!!!"
726 no_mod_selected_error
() {
728 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
729 printtask
"!!! error: $@"
730 printtask
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
732 printtask
"You need to enter a MOD before you try and specify the ROMTYPE."
733 printtask
"Check the help menu for the list of available MODS"
738 check_against_rom_types
() {
739 # this checks to see if the user has entered a ROMTYPE in the MOD spot and outputs advice if so.
740 NUMBER_OF_AVAILABLE_ROMTYPES
=${#AVAILABLE_ROMTYPES[@]}
741 for ((i
=0; i
< $NUMBER_OF_AVAILABLE_ROMTYPES; i
++)); do
742 if [[ ${AVAILABLE_ROMTYPES[i]} == "$P" ]]; then
743 no_mod_selected_error
"\"$P\" is a ROMTYPE not a MOD"
749 for P
in ${PID[@]}; do
751 if ($UNKNOWN_MOD); then
752 check_against_rom_types
753 unknown_mod_error
"\"$P\" is not a valid mod. Check your spelling or the mod list!!!"
754 elif [[ "$NVID" -lt "$COMPATF" ]]; then
755 mismatch_error
"Your Android $VID rom is too old! The minimum for $P is \n !!! Android $FLOOR!"
756 elif [[ "$NVID" -gt "$COMPATC" ]]; then
757 mismatch_error
"Sorry, $P has not been made available for Android $VID yet!"
762 rom_compat_check
() {
763 for P
in ${PID[@]}; do
764 N
=${#ROM_CONFLICTS[@]}
765 for ((i
=0; i
< $N; i
++)); do
766 if [[ $RID == ${ROM_CONFLICTS[$i]} ]]; then
773 rom_compat_error
() {
774 print_error
"$RID is incompatible with $PID!!!"
780 echo $
(cygpath
-da "$1")
788 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
790 parse
() { echo "${1%%_*}"; }
793 if [ -f system
/build.prop
]; then
794 result
=($
(grep $1 system
/build.prop |
tr -d '\r' |
tr '=' ' '))
803 jar
-xvf "$ROMX" system
/framework
/framework2.jar
>> "$LOG"
804 if [ -s system
/framework
/framework2.jar
]; then
813 MID
=$
(getbuildprop ro.build.romversion
)
814 if [[ $MID == "Evervolv"* ]]; then
817 MID
=$
(getbuildprop ro.build.display.id
)
818 if [[ "$MID" == "ev"* ]]; then
828 MID
=$
(getbuildprop ro.build.romversion
)
829 if [[ "$MID" == "pac"* ]] ||
[[ "$MID" == "PAC"* ]]; then
832 MID
=$
(getbuildprop ro.build.display.id
)
833 if [[ "$MID" == "pac"* ]] ||
[[ "$MID" == "PAC"* ]]; then
842 SLMID
=$
(getbuildprop ro.modversion
)
843 SLMMID
=$
(getbuildprop updateme.name
)
844 if [[ "$SLMMID" == "Slim"* ]] ||
[[ $SLMMID == "slim"* ]]; then
846 elif [[ "$SLMID" == "Slim"* ]] ||
[[ $SLMID == "slim"* ]]; then
849 if [[ "$ANDR" == "4.1" ]]; then
858 CMID
=$
(getbuildprop ro.modversion
)
859 PAID
=$
(getbuildprop ro.pa.version
)
860 MID
=$
(getbuildprop ro.build.display.id
)
861 [[ "$MID" == "" ]] && MID
=$
(parse $
(getbuildprop ro.build.display.id
))
862 DID
=$
(getbuildprop ro.product.device
)
863 [[ "$DID" == "" ]] && DID
=$
(getbuildprop ro.build.product
)
864 if [[ -n $PAID ]]; then
896 VID
=$
(getbuildprop ro.build.version.release
)
897 if [ ${#VID} -lt 4 ]; then # in case of non-standard versioning in build.prop (defy!)
900 ANDR
="${VID%.*}" # Cut to 1 significant digit to cover specific range or release.
902 if [ "$ANDR" == "2.3" ]; then
906 elif [ "$ANDR" == "4.0" ]; then
909 MID
=$
(getbuildprop ro.rommanager.developerid
)
910 [[ "$MID" == "" ]] && MID
=$
(parse $
(getbuildprop ro.modversion
))
911 DID
=$
(getbuildprop ro.product.device
)
912 [[ "$DID" == "" ]] && DID
=$
(getbuildprop ro.build.product
)
915 pa|cm9|cm|cyanogenmod
*)
925 echo "!!! $MID is not supported yet, trying aosp !!!"
929 elif [ "$ANDR" == "4.1" ]; then
932 CMID
=$
(getbuildprop ro.cm.version
)
933 if [[ -n $CMID ]]; then
936 MID
=$
(getbuildprop ro.build.display.id
)
937 [[ "$MID" == "" ]] && MID
=$
(parse $
(getbuildprop ro.build.display.id
))
938 DID
=$
(getbuildprop ro.product.device
)
939 [[ "$DID" == "" ]] && DID
=$
(getbuildprop ro.build.product
)
941 cm10|cm
*|cyanogenmod
*)
954 RID
=$
(aosp_mod_check
);
958 elif [ "$ANDR" == "4.2" ]; then
961 CMID
=$
(getbuildprop ro.cm.version
)
962 MID
=$
(getbuildprop ro.build.display.id
)
963 [[ "$MID" == "" ]] && MID
=$
(parse $
(getbuildprop ro.build.display.id
))
964 DID
=$
(getbuildprop ro.product.device
)
965 [[ "$DID" == "" ]] && DID
=$
(getbuildprop ro.build.product
)
968 cm10|cm
*|cyanogenmod
*)
975 if [[ "$MID" == "pac"* ]] ||
[[ "$MID" == "PAC"* ]]; then
989 print_error
"unknown ROM version $VID: generally means cannot find/read build.prop"
991 # romtype_set allows hiding ".aosp-*" types from users while leaving them as options on CLI
993 echo "... result of ROM check: version= $VID rom= $ROMTYPE ..."
997 # Advanced build date query
998 # This should set the patch date automatically.
1001 UTC
=$
(getbuildprop ro.build.
date.utc
)
1003 # Difference in how OS X and Linux/Cygwin handles 'date' utility
1006 BDID
=$
(date -r $UTC +%Y
%m
%d
)
1007 echo "#### Darwin Build Query used ####" >> "$LOG"
1010 BDID
=$
(date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d")
1011 echo "#### Standard Build Query ####" >> "$LOG"
1015 # If patch date is specified on CLI, use that patch date
1016 if [ $# -gt 3 ]; then
1022 # CM7 roms do not have UTC time stamp- so no build query.
1024 echo "*** CM7 roms default to latest patches. If using an older rom ***"
1025 echo "*** specify patch date on command line. Use -h to see available patches ***"
1028 for P
in ${PID[@]}; do
1029 [ -d patches
/$P/$ANDR ] && A
=$ANDR || A
=all
1030 [ -d patches
/$P/$A/"$RID" ] && R
=$RID || R
=generic
1031 [ -d patches
/$P/$A/$R/$BID ] && B
=$BID || B
=latest
1032 PAR
=patches
/$P/$A/$R
1033 PARB
=patches
/$P/$A/$R/$B
1034 DATES
=$
(ls patches
/$P/$A/"$R" |
grep '201*')
1035 # Intialize variable - an upperbound to determine lowest in first loop.
1037 # find earliest available patch date
1039 if [[ $i -lt $BID ]]; then
1043 # Check if earliest patches are from before build date. Else use earliest
1045 # If rom is newer than earliest patch set, find best match
1046 if [[ $
(($BID-$BDID)) -lt 0 ]]; then
1048 # use any patch that matches $UTC
1049 if [[ $
(($BDID-$g)) -eq 0 ]]; then
1052 # Set highest $BID w/o going over $UTC
1053 elif [[ $
(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
1058 # Error catch if query fails.
1059 [[ $BID == "20201231" ]] && BID
=latest
&& echo "Build Query Failed!! Default to latest!" >> "$LOG"
1060 echo "... $PID patch date has been set to: $BID ..."
1070 RIL
=$
(getbuildprop ro.telephony.ril_class
)
1071 [[ -n $RIL ]] && printtask
"... result of ROM check: RIL= $RIL"
1075 echo "# VER= $VERSION" >> "$LOG"
1076 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
1077 echo "# VID= $VID" >> "$LOG"
1078 echo "# PID= ${PID[@]}" >> "$LOG"
1079 echo "# MID= $MID" >> "$LOG"
1080 echo "# RID= $RID" >> "$LOG"
1081 echo "# ANDR= $ANDR" >> "$LOG"
1082 echo "# BDID= $BDID" >> "$LOG"
1083 echo "# DID= $DID" >> "$LOG"
1084 echo "# BID= $BID" >> "$LOG"
1085 echo "Patches are $PID/$ANDR/$RID/$BID" >> "$LOG"
1087 if [ -d ..
/".git" ]; then
1089 echo -n "Current HEAD: " >> "$LOG"
1090 git log
--pretty=oneline HEAD^..HEAD
>> "$LOG"
1096 if [[ $1 == -h ]]; then
1097 if [ $# -gt 1 ]; then
1101 echo "The Auto-Patcher $VERSION by Mateorod and Pastime1971"
1102 echo "*************************************************"
1104 echo "Mod Name: $PID"
1107 if [[ $DESC1 ]]; then # test to see is there is a second DESC line
1110 if [[ $DESC2 ]]; then
1114 echo "Developer: $DEV"
1115 echo "Dependancies: $DEPENDENCY"
1116 if [[ $WEBSITE ]]; then
1117 echo "Website: $WEBSITE"
1120 echo "Works on ROMs from Android $FLOOR -> $CEILING"
1127 [[ $# -lt 1 ||
-z $1 ]] && PID
="mods" && mods_info
1128 [[ $1 == "-h" ]] && usage_help |
less && display_help
1131 echo "The Auto-Patcher $VERSION"
1132 # by pastime1971 and mateorod
1133 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1134 echo " (auto-updated from $AUTO_PATCHER_OLD_VERSION)"
1139 ROOT
="$(abspath "$
(dirname "$(abspath "$
(type -p "$0")")")")"
1140 TOOL
="$ROOT/patch_tools.tgz"
1141 PTCH
="$ROOT/patch_patches.tgz"
1143 # set temporaray directory
1144 DATE
=$
(date +%Y
%m
%d
%H
%M
%S
)
1145 TEMP
="$ROOT/tmp$DATE"
1146 TMP
="$ROOT/tmp$DATE"
1147 TMPDIR
="$ROOT/tmp$DATE"
1150 ROMX
=$
(extpath
"$1")
1152 if [[ $OSTYPE == "cygwin" ]]; then
1155 AUTO_UPDATE
=false
# CYGWIN AUTO_UPDATE TESTERS COMMENT THIS LINE HERE!
1158 LOG
=$
(abspath .
/log
$DATE.txt
)
1159 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
1160 echo "ROOT= $ROOT" >> "$LOG"
1161 echo "TOOL= $TOOL" >> "$LOG"
1162 echo "ROM= $ROM" >> "$LOG"
1163 echo "ROMX= $ROMX" >> "$LOG"
1166 # Auto-Update # excluding ApG/cygwin for now until I talk with kobik.
1167 # To turn off auto updating, set AUTO_UPDATE in .config to false
1171 if [ $
(which git
) ]; then
1174 miss_git_error
"Missing \"git\" utility"
1178 # If program was updated, merge the logs
1179 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1180 cat .updated.log
>> "$LOG"
1184 if [[ "$AUTO_UPDATE" == true
]] && [[ "$GIT" == true
]]; then
1185 ping -c1 www.github.com
> /dev
/null
2>&1 && NETWORK
=true || no_network_access
1186 if [[ "$NETWORK" == true
]]; then
1187 printtask
"### checking for updates ###"
1189 # establish the repo if not already present- one time operation.
1190 if [ ! -d ".git" ]; then
1191 printtask
"... initial setup to allow automatic updating ..."
1192 backup_script
&& warn_of_overwrite
1193 establish_repo
&& export_log_and_variables
1194 printtask
"### rerunning script with latest version ###"
1199 # Here is the regular update process
1200 git fetch origin
2>&1 >> "$LOG" || no_network_access
1201 if !("$NETWORK"); then
1202 printtask
"Updater: not able to run auto_update."
1204 COMMITS_BEHIND
=$
(git rev-list HEAD..origin
/master
--count)
1205 case "$COMMITS_BEHIND" in
1207 printtask
"Updater: Auto-Patcher is already up to date"
1210 ORIGINAL_HEAD
=$
(git rev-parse HEAD
)
1211 printtask
"... Updater: update found ..."
1213 printtask
"... Updating Auto-Patcher ..."
1214 git merge
--no-edit origin
/master
2>&1 >> "$LOG" || auto_update_error
1215 export_log_and_variables
1216 printtask
"### updated, now rerunning script with latest version ###"
1226 if [[ -n "$AUTO_PATCHER_WAS_UPDATED" ]]; then
1227 if [[ $PATCHES_VERSION -gt $AUTO_PATCHER_OLD_PATCHES_VERSION ]]; then
1228 echo "... integrating new patches ..."
1229 sh
batch.sh
>> /dev
/null
2>> "$LOG"
1233 #remove old zips, if built under identical parameters.
1234 \rm
-f $RESTORE.
zip $UPDATE.
zip
1236 CHK
=$
(getconf LONG_BIT
)
1237 if [[ $CHK = "64" ]]; then
1239 else [[ $BIT = "32" ]];
1243 printtask
"### verify tools ###"
1244 which patch >> "$LOG" || misstools_error
"Missing \"patch\" utility."
1245 which tar >> "$LOG" || misstools_error
"Missing \"tar\" utility"
1246 which jar
>> "$LOG" || misstools_error
"Missing \"Java Development Kit\" (JDK)"
1247 which java
>> "$LOG" || misstools_error
"Missing \"Java Development Kit\" (JDK)"
1248 which cpio >> "$LOG" || misstools_error
"Missing \"cpio\" utility"
1249 [ -f "$TOOL" ] || misspatch_error
"patch_tool.tgz is missing"
1250 [ -f "$PTCH" ] || misspatch_error
"patch_patches.tgz is missing"
1251 printtask
"### verify ROM ###"
1252 [ -f "$ROM" ] || print_error
"Cannot find $1!! Make sure you have the location and name right"
1253 echo "### running $0 $@" >> "$LOG"
1258 echo "PATH= $PATH" >> "$LOG"
1260 printtask
"### unzip patch tools ###"
1261 tar xzf
"$TOOL" > /dev
/null || print_error
"failed extracting tools !!!"
1263 # Get OS specific tools
1266 \
mv cygwin
/aapt.exe .
1267 \
mv cygwin
/*.exe boot
/
1268 \rm
-rf cygwin
# why? If you want to we can keep/add it to mac/linux, though.
1280 # Ensure aapt permissions - possibly to one day be expanded to all tools in a function.
1283 printtask
"### unzip patch patches ###"
1284 tar xzf
"$PTCH" > /dev
/null || print_error
"failed extracting patches !!!"
1286 # we need build.prop for both RIL probing and ROM probing
1287 jar
-xvf "$ROMX" system
/build.prop
2>> "$LOG" || print_error
"failed extracting build.prop from $ROMX !!!"
1291 printtask
"### probe rom type ###"
1295 if [ $# -gt 1 ]; then
1297 if [[ "$PIT" = "-h" ]]; then
1302 if [ $# -gt 2 ]; then
1326 RID
=$
(aosp_mod_check
);
1334 date_error
"You must specify ROMTYPE if designating a patch date!!"
1337 rom_error
"$RID is not a valid ROMTYPE!!"
1341 echo "... Using $ROMTYPE patches ..."
1343 echo "... Using results of ROM check ..."
1347 if [ $# -gt 1 ]; then
1348 PIL
=${2//,/ } # If more than one mod, make string separated by spaces
1351 echo "No mods selected. Defaulting to openpdroid, since that's what you probably want..."
1354 # Ensure only 1 Pdroid mod at a time; PDroid first, so provisionals do not overwrite other mods...
1356 PID
=(${PIL// / }) # turn string of requested mods into array
1357 COPYPID
=("${PID[@]}") # working copy to iterate over
1358 MODS_NUMBER
=${#COPYPID[@]} # number of elements (mods)
1360 if [[ $MODS_NUMBER > 1 ]]; then # because if only one mod, not needed
1361 INDEX
=0 # 'pd2.0' didn't work with unset; regex use bars multiple 'pdroid's
1362 for p
in ${COPYPID[@]}; do
1363 if [ "$p" = "pdroid" ] ||
[ "$p" = "pd2.0" ] ||
[ "$p" = "openpdroid" ]; then
1364 SPID
[0]=$p #set pdroid first
1365 unset COPYPID
["$INDEX"]
1368 INDEX
=$
((INDEX
+ 1)) # if (!pdroid), set as 1, 2...
1371 for p
in ${COPYPID[@]}; do
1372 if [ "$p" = "pdroid" ] ||
[ $p = "pd2.0" ] ||
[ $p = "openpdroid" ]; then
1373 conflict_error
"Those mods conflict! Only one pdroid mod at a time!"
1383 for P
in ${PIL[@]}; do
1384 [[ ${PID[@]} =~
$P ]] || PID
=(${PID[@]} $P)
1387 # Check if selected mods are available for rom's Android version.
1390 # Make sure mod and rom don't conflict (e.g. pa and tabletUI)
1391 if [[ $ROM_CONFLICTS != "None" ]]; then
1396 if [ $# -gt 3 ]; then # if a date is specified on command line...
1397 # Set date to match argument and ensure that patches with that date exist
1399 [ -d patches
/$P/$ANDR/$RID/$BID ] || print_error
"No $P patches for $RID on $BID!! Try the help menu!!"
1400 # Run build_query- this overrides the above but gets useful info
1402 # Reset patch date to argument (basically undo the effects of the build_query call)
1404 echo "... $PID patch date set manually to: $BID ..."
1406 build_query
# if no date specified, use one from build_query
1412 if [[ ( "$PID" == "-h" ||
"$RID" == "-h" ||
"$BID" == "-h" ) ]]; then
1413 #Although this placement may be perfect for romfilter. although it throws the scheme...
1418 for P
in ${PID[@]}; do
1419 [ -d patches
/$P ] || print_error
"$P is not available"
1420 [ -d patches
/$P/$ANDR ] && A
=$ANDR || A
=all
1421 [ -d patches
/$P/$A/$RID ] && R
=$RID || R
=generic
1422 [ -d patches
/$P/$A/$R/$BID ] && B
=$BID || B
=latest
1425 [ -f patches
/$P/files.txt
] && FILES
=$
(cat patches
/$P/files.txt
)
1426 [ -f patches
/$P/$A/files.txt
] && FILES
=$
(cat patches
/$P/$A/files.txt
)
1427 [ -f patches
/$P/$A/$R/files.txt
] && FILES
=$
(cat patches
/$P/$A/$R/files.txt
)
1428 [ -f patches
/$P/$A/$R/$B/files.txt
] && FILES
=$
(cat patches
/$P/$A/$R/$B/files.txt
)
1429 for FILE
in ${FILES[@]}; do
1432 [[ ${CID[@]} =~ ${FILE:1} ]] && print_error "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
1435 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
1438 [[ ${JID[@]} =~
$FILE ]] || JID
=(${JID[@]} $FILE)
1439 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1441 # added for the use-case of apktool failure
1442 ~system
/*apk
) # apks to decompile with smali binaries instead of apktool
1443 [[ ${JID[@]} =~ ${FILE:1} ]] || JID=(${JID[@]} ${FILE:1})
1444 FORMATTED_FILE
=${FILE:1}
1445 echo "set_perm(0, 0, 0644, \"/$FORMATTED_FILE\");" >> UPDATE.txt
1448 [[ ${AID[@]} =~
$FILE ]] || AID
=(${AID[@]} $FILE)
1449 echo "set_perm(0, 0, 0644, \"/$FILE\");" >> UPDATE.txt
1450 # $APKID will have elements removed sometimes--$AID is the master list for the update.zip
1451 declare -a APKID
=( "${AID[@]}" )
1454 [[ ${IID[@]} =~
$FILE ]] || IID
=(${IID[@]} $FILE)
1457 [[ ${TID[@]} =~
$FILE ]] || TID
=(${TID[@]} $FILE)
1462 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
1463 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
1464 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
1465 echo "### APK FILES= ${AID[@]}" >> "$LOG"
1466 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
1467 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
1469 # extract system files
1470 printtask
"### unzip rom ###"
1471 jar
-xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || print_error "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from
$ROMX !!!"
1474 # Update/Restore.zip scripts and prep
1475 printtask "### create updater script ###"
1476 UPDATER_LOC
=META-INF
/com
/google
/android
1478 UPDATE
="update-$ROMTYPE-$DID-$BDID-${PIL// /-}"
1479 RESTORE
="restore-$ROMTYPE-$DID-$BDID"
1481 jar
-xvf "$ROMX" $UPDATER_LOC/$UPDS $UPDATER_LOC/update-binary
1482 jar
-xvf "$ROMX" $UPDATER_LOC/update-binary-installer
1> /dev
/null
2> /dev
/null
1484 # Determine Installer- Aroma or ClockworkMod
1485 if [ -f $UPDATER_LOC/update-binary-installer
]; then
1486 printtask
"... using Aroma installer ..."
1487 \
mv $UPDATER_LOC/update-binary-installer
$UPDATER_LOC/update-binary
1489 printtask
"... using Clockworkmod installer ..."
1492 # Create updater scripts
1493 cat patches
/.common
/updater-message.txt
>> $UPDS
1494 cat $UPDATER_LOC/$UPDS |
grep ^mount |
grep "/system" |
head -n 1 >> $UPDS
1495 [ -s $UPDS ] ||
echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" >> $UPDS
1496 # restore the original
1497 for FILE
in ${EID[@]}; do
1498 jar
-xvf "$ROMX" $FILE 2> /dev
/null || printtask
"!!! warning $FILE cannot be restored !!!"
1500 # replace with the original or delete it
1501 for FILE
in ${CID[@]}; do
1502 jar
-xvf "$ROMX" $FILE 2> /dev
/null ||
echo "delete(\"/$FILE\");" >> $UPDS
1504 echo "package_extract_dir(\"system\", \"/system\");" >> $UPDS
1505 # permission management for files that need specific perms
1506 cat $UPDATER_LOC/$UPDS |
grep set_perm |
grep "/system" >> $UPDS
1507 for P
in ${PID[@]}; do
1508 if [ -s patches
/$P/$A/set_perm.txt
]; then
1509 echo "...setting permissions..."
1510 cat patches
/$P/$A/set_perm.txt
>> $UPDS
1513 cat $UPDATER_LOC/$UPDS |
grep ^unmount |
grep "/system" |
head -n 1 >> $UPDS
1514 [[ ${IID[@]} =~ boot.img
]] && cat $UPDATER_LOC/$UPDS |
grep "boot.img" >> $UPDS
1515 echo "ui_print(\" .\");" >> $UPDS
1516 echo "ui_print(\" .\");" >> $UPDS
1517 echo "ui_print(\" done!\");" >> $UPDS
1518 cat $UPDS > $UPDATER_LOC/$UPDS
1519 echo "# generated $UPDS" >> "$LOG"
1522 printtask
"### create restore.zip ###"
1523 jar
-cvf tmp.
zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF
> /dev
/null
2>> "$LOG"
1524 java
-jar signapk.jar updatecert.pem updatekey.pk8 tmp.
zip signed.
zip 2>> "$LOG"
1525 \
mv signed.
zip $RESTORE.
zip
1529 # Begin patching process
1531 # decompile system files
1532 printtask
"### decompile system files ###"
1533 for FILE
in ${JID[@]}; do
1535 printtask
"... decompile $JAR ..."
1536 java
-jar baksmali.jar
-b -a $API -o tmp
/${FILE}.out
/smali
${FILE} >> "$LOG" 2>> "$LOG"
1537 if [ $FILE == "system/framework/framework.jar" ]; then
1538 printtask
"... extract preloaded-classes ..."
1539 jar
-xvf ${FILE} preloaded-classes
>> "$LOG" 2>> "$LOG"
1540 \
mv preloaded-classes tmp
/${FILE}.out
/
1544 # install framework-files for APK...
1545 if [ ${#AID[@]} -gt 0 ]; then
1546 jar
-xvf "$ROMX" system
/framework
/framework-res.apk
>> "$LOG"
1547 printtask
"... installing framework files ..."
1548 java
-jar apktool.jar
if system
/framework
/framework-res.apk
1550 for FILE
in ${AID[@]}; do
1552 if [ -f $FILE ]; then
1553 printtask
"... decompile $APK ..."
1554 java
-jar apktool.jar d
-f $FILE tmp
/$FILE.out
2>> "$LOG"
1559 # Unpack image files {boot.img only so far...}
1560 for FILE
in ${IID[@]}; do
1561 printtask
"### unpacking $FILE ###"
1564 if [ -f boot.img
]; then
1566 .
/unpackbootimg
$EXE -i ..
/boot.img
>> "$LOG" 2>> "$LOG"
1569 gzip -dc ..
/boot.img-ramdisk.gz |
cpio -i >> "$LOG" 2>> "$LOG"
1572 print_error
"A mod needs to patch boot.img! This rom does not contains boot.img."
1576 print_error
"cannot process $FILE"
1581 # apply system modification
1583 for P
in ${PID[@]}; do
1584 [ -d patches
/$P/$ANDR ] && A
=$ANDR || A
=all
1585 [ -d patches
/$P/$A/$RID ] && R
=$RID || R
=generic
1586 [ -d patches
/$P/$A/$R/$BID ] && B
=$BID || B
=latest
1587 PAR
=patches
/$P/$A/$R
1588 PARB
=patches
/$P/$A/$R/$B
1590 unset FILES COPY DELS JARS APKS IMGS TXTS
1591 [ -f patches
/$P/files.txt
] && FILES
=$
(cat patches
/$P/files.txt
)
1592 [ -f patches
/$P/$A/files.txt
] && FILES
=$
(cat patches
/$P/$A/files.txt
)
1593 [ -f patches
/$P/$A/$R/files.txt
] && FILES
=$
(cat patches
/$P/$A/$R/files.txt
)
1594 [ -f patches
/$P/$A/$R/$B/files.txt
] && FILES
=$
(cat patches
/$P/$A/$R/$B/files.txt
)
1595 for FILE
in ${FILES[@]}; do
1598 COPY
=(${COPY[@]} ${FILE:1})
1601 DELS
=(${DELS[@]} ${FILE:1})
1604 JARS
=(${JARS[@]} $FILE)
1607 JARS
=(${JARS[@]} ${FILE:1})
1610 APKS
=(${APKS[@]} $FILE)
1613 IMGS
=(${IMGS[@]} $FILE)
1616 TXTS
=(${TXTS[@]} $FILE)
1621 [[ -n ${COPY[@]} ]] && echo "### copy patch $P/$A/$ROMTYPE/$B ###"
1622 echo "### copy patch $P/$A/$R/$B ###" >> "$LOG"
1623 for FILE
in ${COPY[@]}; do
1624 printtask
"... copying $FILE ..."
1627 if [ -e patches
/$P/$A/$R/$B/$FILE ]; then
1628 printtask
"... overwriting $FILE from $P ..."
1629 \
cp -av patches
/$P/$A/$R/$B/$FILE .
/$DEST >> "$LOG" 2>&1
1630 elif [ -e patches
/$P/common
/$FILE ]; then
1631 printtask
"... overwriting $FILE from $P ..."
1632 echo " ### SOMETHING WENT WRONG!! Could not find file-- using common. ###" >> "$LOG"
1633 \
cp -av patches
/$P/common
/$FILE .
/$DEST >> "$LOG" 2>&1
1635 print_error
"$FILE is missing in the patch. Please upload your logfile to the support thread!"
1639 # unconditional smali copying- For particularly troublesome files
1640 [ -f patches
/$P/smali.txt
] && SMALI
=$
(cat patches
/$P/smali.txt
)
1641 [ -f patches
/$P/$A/smali.txt
] && SMALI
=$
(cat patches
/$P/$A/smali.txt
)
1642 [ -f patches
/$P/$A/$R/smali.txt
] && SMALI
=$
(cat patches
/$P/$A/$R/smali.txt
)
1643 [ -f patches
/$P/$A/$R/$B/smali.txt
] && SMALI
=$
(cat patches
/$P/$A/$R/$B/smali.txt
)
1645 for SMALI
in ${SMALI[@]}; do
1646 if [ -f patches
/$P/$A/$R/$B/$SMALI ]; then
1647 printtask
"... overwriting $MOVE ..."
1648 \
cp -a patches
/$P/$ANDR/$R/$B/$SMALI tmp
/$SMALI >> "$LOG" 2>&1
1649 # This lower area should be deprecated now...wait and see. Each BID has own link to provisionals now.
1650 elif [ -f patches
/$P/$A/.provisionals
/$SMALI ]; then
1651 printtask
"... overwriting $MOVE ..."
1652 \
cp -a patches
/$P/$ANDR/.provisionals
/$SMALI tmp
/$SMALI >> "$LOG"
1656 [[ -n ${DELS[@]} ]] && echo "### delete patch $P/$A/$ROMTYPE/$B ###"
1657 echo "### delete patch $P/$A/$R/$B ###" >> "$LOG"
1658 for FILE
in ${DELS[@]}; do
1659 printtask
"... deleting $FILE ..."
1662 [[ -n ${JARS[@]} ]] && echo "### jar patch $P/$A/$ROMTYPE/$B ###"
1663 echo "### jar patch $P/$A/$R/$B ###" >> "$LOG"
1665 # Iterate through jars and patch. If fails, try prepatched provisionals or look for alternative patch.
1667 for (( current_jar
=0; current_jar
< ${#JARS[@]}; current_jar
++)); do
1668 FILE
=${JARS[$current_jar]}
1670 if [[ $FILE == *".jar" ]]; then # allows for *.apks to be decompiled by baksmali
1673 NAME
=$JAR # TODO: Maybe rename this, since it now encompases apks at times
1675 printtask
"... apply $NAME.patch ..."
1676 patch -Nls -p1 -d tmp
/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
1677 for INCREMENTAL
in $
(ls $PARB/${NAME}-*.
patch 2>/dev
/null
); do
1678 printtask
"... apply $(basename $INCREMENTAL) ..."
1679 patch -Nls -p1 -d tmp
/${FILE}.out
< $INCREMENTAL 2>&1 > ${JAR}.log
1681 cat ${JAR}.log
>> "$LOG"
1684 # patch preloaded-classes only if a patch exists
1685 if [ -f $PARB/preloaded.
patch ]; then
1686 printtask
"... apply preloaded.patch ..."
1687 patch -Nls -p1 -d tmp
/${FILE}.out
< $PARB/preloaded.
patch 2>&1 > preloaded.log
1688 cat preloaded.log
>> "$LOG"
1689 [[ $
(grep FAILED preloaded.log
) != "" ]] && print_error
"failed preloaded.patch"
1693 echo -n "" # do nothing else
1696 # substitute failed smali with provisional (a prepatched smali file)
1698 FAILS
=($
(grep FAILED
${JAR}.log |
sed -e 's/.*smali\///' |
sed -e 's/\.rej//'))
1699 if [[ -n ${FAILS[@]} ]]; then
1700 print_to_log
"!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
1701 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
1702 for FAIL
in ${FAILS[@]}; do
1703 PROVISIONAL
="patches/$P/$ANDR/.provisionals/${FILE}.out/smali/${FAIL}"
1704 ALTERNATIVE_PATCH
=$
(ls $PARB/${NAME}$ALT_PATCH_NUMBER*.
patch 2>/dev
/null
)
1705 if [ ! -f "$PROVISIONAL" ]; then
1706 if [ -f "$ALTERNATIVE_PATCH" ]; then
1707 printtask
"## trying alternative ${NAME} patch ###"
1708 prep_alternate_patch
1710 print_error
"failed $FAIL in $JAR cannot be remedied"
1713 echo "!!! patch error for $FAIL !!!" >> "$LOG"
1714 [[ ${SID[@]} =~
$FAIL ]] && print_error
"$FAIL was already replaced before"
1715 copy_prepatched_provisional
1719 [[ $
(grep FAILED
${JAR}.log
) != "" ]] && print_error
"failed $NAME.patch"
1720 garbage tmp
/${FILE}.out
1722 # run special $JAR.sh scripts if any JAR needs special attention
1723 if [ -f patches
/$P/$A/$R/$B/${JAR}.sh
]; then
1724 printtask
"... apply $JAR.sh ..."
1725 . patches
/$P/$A/$R/$B/${JAR}.sh
2>&1 > ${JAR}.log
1726 cat ${JAR}.log |
tee -a "$LOG"
1730 [[ -n ${APKS[@]} ]] && echo "### apk patch $P/$A/$ROMTYPE/$B ###"
1731 echo "### apk patch $P/$A/$R/$B ###" >> "$LOG"
1732 for FILE
in ${APKS[@]}; do
1734 if [ -d "tmp/${FILE}.out" ] ; then
1735 printtask
"... apply $APK.patch ..."
1736 patch -Nls -p2 -d tmp
/${FILE}.out < $PARB/${APK}.patch 2>&1 > ${APK}.log
1737 cat ${APK}.log
>> "$LOG"
1739 if [[ $
(grep FAILED
${APK}.log
) != "" ]]; then
1741 declare -a APKID
=( ${APKID[@]/$FILE/} )
1743 garbage tmp
/${FILE}.out
1745 echo "No $APK in your ROM. Not able to patch this file."
1746 echo "## No $APK in ROM ###" >> "$LOG"
1749 [[ -n ${IMGS[@]} ]] && echo "### img patch $P/$A/$ROMTYPE/$B ###"
1750 echo "### img patch $P/$A/$R/$B ###" >> "$LOG"
1751 for FILE
in ${IMGS[@]}; do
1753 printtask
"... applying $IMG.patch ..."
1754 patch -Nls -p1 -d boot
/ramdisk
< $PARB/${IMG}.
patch >> "$LOG" || print_error
"failed patching $FILE"
1757 # Text Editing Functions --this can really do just about anything. Needs a working restore!
1758 [[ -n ${TXTS[@]} ]] && echo "### text patch $P/$A/$ROMTYPE/$B ###"
1759 echo "### text patch $P/$A/$R/$B ###" >> "$LOG"
1760 for FILE
in ${TXTS[@]}; do
1762 if [[ -f $PARB/${TXT}.
patch ]]; then
1763 printtask
"... apply $TXT.patch ..."
1764 patch -Nls -p2 -d system
/ < $PARB/${TXT}.
patch 2>&1 > ${TXT}.log
1765 #cat ${TXT}.log | tee -a "$LOG"
1766 [[ $
(grep FAILED
${TXT}.log
) != "" ]] && print_error
"failed $TXT.patch"
1768 if [[ -f $PAR/${TXT}.
awk ]]; then
1769 printtask
"... apply $TXT.awk ..."
1770 awk -f $PAR/${TXT}.
awk $FILE > text || print_error
"failed $TXT.awk"
1773 if [[ -f $PAR/${TXT}.
sed ]]; then
1774 printtask
"... apply $TXT.sed ..."
1775 sed -f $PAR/${TXT}.
sed $FILE > text || print_error
"failed $TXT.sed"
1778 if [[ -f $PAR/${TXT}.sh
]]; then
1779 printtask
"... apply $TXT.sh ..."
1780 .
$PAR/${TXT}.sh
2>&1 >> ${TXT}.log || print_error
"failed $TXT.sh"
1786 # Device specific scripts- Placement is up-for-review
1787 if [ -f patches
/.devices
/$DID/$DID.sh
]; then
1788 . patches
/.devices
/$DID/$DID.sh
1791 # Replace updater-script for CM7- it formats system -Testing
1792 if [ "$ANDR" == "gingerbread" ]; then
1796 # Rebuilding system files
1798 [[ -n ${JID[@]} ]] && printtask
"### rebuild jar ###"
1799 for FILE
in ${JID[@]}; do
1801 printtask
"... rebuild $JAR ..."
1802 java
-Xmx512M -jar smali.jar
-a $API tmp
/${FILE}.out
/smali
-o tmp
/${FILE}.out
/classes.dex
>> "$LOG" 2>> "$LOG"
1803 [ -f tmp
/${FILE}.out
/classes.dex
] || smali_error
"failed compiling $JAR !!!"
1804 jar
-ufv ${FILE} -C tmp
/${FILE}.out
/ classes.dex
>> "$LOG" 2>> "$LOG"
1805 if [ $FILE == "system/framework/framework.jar" ]; then
1806 jar
-ufv ${FILE} -C tmp
/${FILE}.out
/ preloaded-classes
>> "$LOG" 2>> "$LOG"
1810 [[ -n ${APKID[@]} ]] && printtask
"### rebuild apk ###"
1811 for FILE
in ${APKID[@]}; do
1813 if [ -d tmp
/${FILE}.out
]; then
1814 apk_was_copied
=false
1815 printtask
"... rebuild $APK ..."
1816 java
-jar apktool.jar b tmp
/${FILE}.out
>> "$LOG" 2>> "$LOG" || apk_copy
1817 if !("$apk_was_copied"); then
1818 jar
-uvf $FILE -C tmp
/${FILE}.out
/build
/apk
/ .
> /dev
/null
2>> "$LOG"
1823 [[ -n ${IID[@]} ]] && printtask
"### rebuild img ###"
1824 for FILE
in ${IID[@]}; do
1825 printtask
"### rebuild $FILE ###"
1828 # Rebuilding boot.img
1830 printtask
"... rebuilding ramdisk ..."
1831 .
/mkbootfs
$EXE .
/ramdisk |
gzip > ramdisk-new.gz
1832 printtask
"... composing boot.img ..."
1833 BASE
=$
(cat boot.img-base
)
1834 # hex to decimal in cygwin prefixing "0x" w/ C arithmetic
1835 PGSIZE
=$
((${PGFORM}$
(cat boot.img-pagesize
)))
1836 CMDLINE
=$
(cat boot.img-cmdline
)
1837 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
1838 echo "pagesize = $PGSIZE" >> "$LOG"
1839 echo "base = $BASE" >> "$LOG"
1840 printtask
"... rebuilding boot.img ..."
1841 .
/mkbootimg
$EXE --kernel boot.img-zImage
--ramdisk ramdisk-new.gz
--cmdline "no_console_suspend=1 console=null $CMDLINE" --base "$BASE" --pagesize "$PGSIZE" -o ..
/boot.img || print_error
"failed building boot.img"
1845 print_error
"cannot process $FILE"
1850 printtask
"### create $UPDATE.zip ###"
1851 jar
-cfv tmp.
zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF
>> "$LOG" 2>> "$LOG"
1852 java
-jar signapk.jar updatecert.pem updatekey.pk8 tmp.
zip $UPDATE.
zip 2>> "$LOG"
1854 \
mv $RESTORE.
zip $UPDATE.
zip ..
1855 printtask
"### finished ###"
1857 printtask
"$(colorize_bold ${red}Congratulations), the patching was $(colorize_bold ${red}successful)."
1858 printtask
"Any errors you may have seen were succesfully handled!"
1860 printtask
"!!! Only file a bug report if the software is $(colorize_bold ${grn}not) behaving as expected !!!"
1862 echo "to install patched files, flash:"
1863 printtask
"---$(colorize_bold ${grn}$UPDATE.zip)"
1865 printtask
"to restore original system, flash:"
1866 printtask
"---$(colorize_bold ${grn}$RESTORE.zip)"
1869 # add announcement- optional.
1870 for P
in ${PID[@]}; do
1871 [ -d patches
/$P/$ANDR ] && A
=$ANDR || A
=all
1872 [ -d patches
/$P/$A/$RID ] && R
=$RID || R
=generic
1873 [ -d patches
/$P/$A/$R/$BID ] && B
=$BID || B
=latest
1874 if [ -f patches
/$P/$A/$R/$B/README.txt
]; then
1875 cat patches
/$P/$A/$R/$B/README.txt
1876 elif [ -f patches
/$P/$A/$R/README.txt
]; then
1877 cat patches
/$P/$A/$R/README.txt
1878 elif [ -f patches
/$P/$A/README.txt
]; then
1879 cat patches
/$P/$A/README.txt