Remove second askconsent
[auto-patcher.git] / auto_patcher
blobfbd5386bb610980b8cd54f31d67aae4211ccf3bd
1 #!/bin/bash
3 # version: beta v2.2.1, patches 2012.010.20.
5 # PDroid created by svyat. Official PDroid thread is
6 # http://forum.xda-developers.com/showthread.php?t=1357056
8 # The Auto-Patcher created by pastime1971 and mateorod
9 # Thread and support for the Auto-Patcher can be found at
10 # http://forum.xda-developers.com/showthread.php?p=27589651#post27589651
12 # ChangeLog
13 # 2012.05.00. (v0.1)
14 # ...........
15 # 2012.05.12. (v0.2) allows user to specify a different version of patches
16 # 2012.05.13. (v0.3.0) force "patch -N", remove temp upon failure, generate log output
17 # 2012.05.13. (v0.3.1) revised the generation of updater-script (SGS2)
18 # 2012.05.15. added AOSP patches
19 # 2012.05.15. added crespo-aosp patches, added device-specific patching if patch exists
20 # 2012.05.15. remove restore.zip upon failure
21 # 2012.05.15. (v0.4.1) added CM7 (GB) patches
22 # 2012.05.18. (v0.4.2) added checking for tool commands
23 # 2012.05.21. (v0.4.3) apply device-specific patches only when it is specified
24 # 2012.05.26. added task title to log
25 # 2012.05.31. (v0.4.4) CM9 patches updated, crespo-aosp added
26 # 2012.06.04. (v0.4.5) added checking tools and rom, added aroma installer support, 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. (1.9.6) Conditional support for Official cm10 and aokp-jb builds
57 # 2012.08.23. (1.9.7) Final/confirmed pdroid support for Official CM10 and AOKP-JB
58 # 2012.09.04 (1.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. (2.0.0) Added .apk patching
62 # Added 3G Dongle support for Nexus 7
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
68 # 2012.09.11. (2.0.1) Cygwin support fixes
69 # 2012.09.11. (2.0.2) Bugfix for 3gdongle (all)
70 # 2012.09.16. (2.1.0) Significant restructuring of core operations; added edit text file
71 # fix for "method-cap" errors in pdroid.
72 # 2012.09.20. (2.1.1) Fix for Phone FC's; OSX support finalized; ContentResolver resolved
73 # 2012.09.28. (2.1.2) Hotfix for failed pdroid patching. Logging improvements.
74 # 2012.10.07. (2.1.5) Final pdroid support for CM7.2 Official Releases
75 # Added aosp-mod patches for pdroid patching of AOSP kangs
76 # Switched to Chainfire's (f)aapt for speed/space reasons
77 # 2012.10.13. (2.1.6) New PDroid patches for aokp-jb and cm10 4.1.2
78 # Revert (f)aapt- temporary due to reported issues
79 # 2012.10.15. (2.17) New (again) CM10 pdroid patches.
80 # Move files to be copied into $p/$R/$B
81 # -This required a bunch of file moving-report broken symlinks.
82 # Some error check on the old RIL delete functions (thanks bundrik)
83 # 2012.10.16. (2.1.7.5) Fix FC on phone with CM10 pdroid patches
84 # 2012.10.19. (2.1.9) Testing CM10 support for PDroid Extension by CollegeDev.
85 # 2012.10.22. (2.2.0) aosp/aokp and cm10 support for pdroid extension by CollegeDev
86 # MAJOR reworking of patches and improved query. only 4 mod types:
87 # cm, aokp, aosp, and pa. See our OP for details.
88 # 2012.10.23. (2.2.0.1) Some fixes for the breakage due to update.
89 # Adjust aapt permissions and add fix_aapt.sh script.
90 # Fix for aosp probing and mod/jb determining. Test Update.
91 # 2012.10.23. (2.2.0.2) Add the '-h' menu back, bump version for log purposes.
92 # 2012.10.24. (2.2.0.3) Fixes for -h menu- Mms.apk as a copy file; aapt permission fix
93 # 2012.10.24. (2.2.0.4) Change Mms.apk to copy file for now, for non-phone devices.
94 # 2012.10.24. (2.2.0.5) Small fixes as we are almost to 2.1.1 stability (I hope)
95 # 2012.10.24. (2.2.1) Final merge of restructure. Fixes for OSX helper scripts
96 # Rename 'extension' to 'pd2.0'
98 # SHELL PROGRAMMING NOTES:
99 # [ -s FILE ]
100 # [[ -n STRING ]] or [[ -z STRING ]]
102 VERSION="Auto-Patcher v2.2.1"
104 echo ""
105 echo "The $VERSION"
106 echo ""
107 # by pastime1971 and mateorod
110 # pass variables to children
111 set -a
113 # function for converting hex to binary- for testing
114 #function h2b { echo "obase=2; ibase=16; $( echo "$*" | sed -e 's/0x//g' -e 's/\([a-z]\)/\u\1/g' )" | bc; }
116 printusage () {
117 echo " The $VERSION"
118 echo ""
119 echo "usage: $0 ROM.ZIP MODS [ROMTYPE] [PATCHDATE]"
120 echo ""
121 echo "MODS can be pdroid, extension, v6supercharger, tabletUI, etc..."
122 echo "recommended: [ROMTYPE] can be cm, aokp, aosp or pa"
123 echo "optional: [PATCHDATE] can be specified to use older patch versions."
124 echo "try \"$0 ROM.ZIP -h\" to see what is available"
125 echo ""
126 exit
129 debug () {
130 echo "! please refer to $LOG for any debugging"
131 echo ""
132 echo "! patching failed."
133 echo "! it may be possible to patch $ROM using other patch version"
134 echo ""
135 cleanup
136 printusage
139 cleanup () {
140 [ -d "$TEMP" ] && \rm -rf "$TEMP"
142 printerror () {
143 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
144 echo "!!! error: $@"
145 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
146 echo ""
147 debug
149 misspatch () {
150 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
151 echo "!! error: $@ "
152 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
153 echo ""
154 echo "!! The Auto-Patcher could not find its patches and/or tools!"
155 echo ""
156 echo "* Did you run ./batch.sh first?"
157 echo ""
158 echo "The patch_patches.tgz and patch_tools.tgz need to be in this directory,"
159 echo " one way or another..."
160 echo ""
161 cleanup
162 printusage
165 misstools () {
166 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
167 echo "Your set-up is missing a dependency."
168 echo "We require JDK, patch and cpio."
169 echo ""
170 echo ""
171 echo "Each distro is different"
172 echo "but you must ensure you have them all installed and try again."
173 echo ""
174 cleanup
175 printusage
178 printtask () {
179 echo "" >> "$LOG"
180 echo $@ | tee -a "$LOG"
183 copyfailed () {
184 echo ""
185 echo "File for which patching failed:"
186 echo "---------------------------------------------"
187 echo ""
188 echo "${FAIL##*/}"
189 echo ""
190 echo "---------------------------------------------"
191 echo ""
192 echo "We can try to add a premade copy of those files."
193 echo "This sometimes works."
194 echo ""
195 echo "But IT MAY NOT WORK!!!"
196 echo ""
197 echo ""
198 askconsent && return 0 || return 1
201 askconsent () {
202 sleep 1
203 echo -n "Do you want to proceed ? (YES/no) "
204 read PROCEED
205 echo "askconsent final = ${PROCEED}: for $FAIL" >> "$LOG"
206 case $PROCEED in
207 [Yy] | [Yy][Ee][Ss])
208 return 0; # successful:
211 return 1; # error
213 esac
216 abspath () {
217 case `uname -s` in
218 CYGWIN*)
219 echo $(cygpath -ua "$1")
221 Darwin)
222 #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
223 [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
225 Linux)
226 echo $(readlink -f "$1")
229 if [[ ${1:0:1} == "/" ]]; then
230 echo "$1"
231 elif [[ ${1:0:2} == "./" ]]; then
232 echo "$PWD/${1:2}"
233 else
234 echo "$PWD/$1"
237 esac
240 extpath () {
241 case `uname -s` in
242 CYGWIN*)
243 echo $(cygpath -da "$1")
246 echo $(abspath "$1")
248 esac
251 #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
253 parse () { echo "${1%%_*}"; }
255 getbuildprop () {
256 if [ -f system/build.prop ]; then
257 result=(`grep $1 system/build.prop | tr -d '\r' | tr '=' ' '`)
258 echo "${result[1]}"
259 else
260 echo ""
265 aosp_mod_check() {
266 jar -xvf "$ROMX" system/framework/framework2.jar >> $LOG
267 if [ -s system/framework/framework2.jar ]; then
268 AOSP=aosp-mod
269 else
270 AOSP=aosp-jb
272 echo $AOSP
275 proberom () {
276 VID=$(getbuildprop ro.build.version.release)
278 if [ "${VID%.*}" == "2.3" ]; then
279 ANDR=gingerbread
280 RID=cm;
281 elif [ "${VID%.*}" == "4.0" ]; then
282 ANDR=ics
283 MID=$(getbuildprop ro.rommanager.developerid)
284 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
285 DID=$(getbuildprop ro.product.device)
286 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
288 case "$MID" in
289 pa|cm9|cm|cyanogenmod*)
290 RID=cm;
292 aokp|teamkang)
293 RID=aokp;
296 RID=aosp;
297 echo "!!! $MID is not supported yet, trying generic latest !!!"
299 esac
300 elif [ "${VID%.*}" == "4.1" ]; then
301 ANDR=jellybean
302 MID=$(getbuildprop ro.build.display.id)
303 [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
304 DID=$(getbuildprop ro.product.device)
305 [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
307 case "$MID" in
308 cm10|cm*|cyanogenmod*)
309 RID=cm;
311 aokp*|teamkang)
312 RID=aokp;
314 pa*)
315 RID=pa;
318 RID=`aosp_mod_check`;
320 esac
321 else
322 printerror "unknown ROM version $VID"
324 echo "... result of ROM check: version= $ANDR rom= $RID ..."
327 # NEW # Advanced build date query
328 # This should set the patch date automatically.
330 buildquery() {
331 UTC=$(getbuildprop ro.build.date.utc)
332 case `uname -s` in
333 [D]darwin)
334 BDID=`date -r $UTC +%Y%m%d`
335 echo "#### Darwin Build Query used ####" >> "$LOG"
338 BDID=`date -d "1970-01-01 UTC $UTC seconds" +"%Y%m%d"`
339 echo "#### Standard Build Query ####" >> "$LOG"
341 esac
343 if [ $# -gt 3 ]; then
344 BID=${4//,/ };
345 elif
346 [[ ${#PID[@]} -gt 1 ]]; then
347 BID=latest;
348 else
349 for P in ${PID[@]}; do
350 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
351 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
352 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
353 PAR=patches/$P/$A/$R
354 PARB=patches/$P/$A/$R/$B
355 DATES=`ls patches/$P/$A/$R/ | grep '201*'`
356 # attempt to set builds before extant patches to earliest
357 for i in $DATES; do
358 if [[ $i -lt $BID ]]; then
359 BID=$i
361 if [[ $(($BID-$BDID)) -lt 0 ]]; then
362 BID=$i
363 else
364 for g in $DATES; do
365 if [[ $(($BDID-$g)) -eq 0 ]]; then
366 BID=$g
367 break
368 elif [[ $(($BDID-$g)) -gt 0 ]] && [[ $g -gt $BID ]]; then
369 BID=$g
371 done
373 done
374 echo "... $PID patch date has been set to: $BID..."
375 B=$BID
376 done
380 proberil () {
381 RIL=$(getbuildprop ro.telephony.ril_class)
382 [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
385 garbage () {
386 unset GARBAGE
387 GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
388 GARBAGE=($(find $@ -name "*.rej")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE= ${GARBAGE[@]}" >> "$LOG"
391 rominfo () {
392 echo "# VER= $VERSION" >> "$LOG"
393 echo "# OS= $OSTYPE ${BIT}bit" >> "$LOG"
394 echo "# VID= $VID" >> "$LOG"
395 echo "# PID= ${PID[@]}" >> "$LOG"
396 echo "# MID= $MID" >> "$LOG"
397 echo "# RID= $RID" >> "$LOG"
398 echo "# ANDR= $ANDR" >> "$LOG"
399 echo "# BDID= $BDID" >> "$LOG"
400 echo "# DID= $DID" >> "$LOG"
401 echo "# BID= $BID" >> "$LOG"
405 [[ $# -lt 1 || $1 == "-h" || -z $1 ]] && printusage
407 ROOT=$(abspath `dirname "$0"`)
408 TOOL="$ROOT/patch_tools.tgz"
409 PTCH="$ROOT/patch_patches.tgz"
410 ROM=$(abspath "$1")
411 ROMX=$(extpath "$1")
413 if [[ $OSTYPE == "cygwin" ]]; then
414 EXE=".exe"
415 PGFORM="0x"
418 DATE=`date +%Y%m%d%H%M%S`
419 TEMP=$(abspath ./tmp$DATE)
420 LOG=$(abspath ./log$DATE.txt)
421 #echo $ROOT $TOOL $ROM $TEMP "$LOG"
422 echo "ROOT= $ROOT" >> "$LOG"
423 echo "TOOL= $TOOL" >> "$LOG"
424 echo "ROM= $ROM" >> "$LOG"
425 echo "ROMX= $ROMX" >> "$LOG"
427 \rm -f restore.zip update.zip
429 CHK=$(getconf LONG_BIT)
430 if [[ $CHK = "64" ]]; then
431 BIT=64
432 else [[ $BIT = "32" ]];
433 BIT=32
437 printtask "### verify tools ###"
438 which patch >> "$LOG" || misstools "Missing \"patch diff command\""
439 which tar >> "$LOG" || misstools "Missing \"tar archive command\""
440 which jar >> "$LOG" || misstools "Missing \"jar (JDK)\""
441 which java >> "$LOG" || misstools "Missing \"java (JRE)\""
442 which cpio >> "$LOG" || misstools "Missing \"cpio archive command\""
443 [ -f "$TOOL" ] || misspatch "patch tool is missing"
444 [ -f "$PTCH" ] || misspatch "patch patches are missing"
445 printtask "### verify ROM ###"
446 [ -f "$ROM" ] || printerror "Cannot find $ROM"
447 echo "### running $0 $@" >> "$LOG"
448 mkdir "$TEMP"
449 cd "$TEMP"
451 PATH="$TEMP:$PATH"
452 export PATH
453 echo "PATH= $PATH" >> "$LOG"
455 printtask "### unzip patch tools ###"
456 tar xvzf "$TOOL" > /dev/null || printerror "failed extracting tools !!!"
458 # Get OS specific tools
459 case `uname -s` in
460 CYGWIN*)
461 \mv cygwin/aapt.exe .
462 \mv cygwin/*.exe boot/
463 \rm -rf cygwin # why? If you want to we can keep/add it to mac/linux, though.
465 [Dd]arwin)
466 \mv mac/aapt .
468 [Ll]inux)
469 \mv linux/aapt .
472 \mv linux/aapt .
474 esac
476 printtask "### unzip patch patches ###"
477 tar xvzf "$PTCH" > /dev/null || printerror "failed extracting patches !!!"
479 # we need build.prop for both RIL probing and ROM probing
480 jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || printerror "failed extracting build.prop from $ROMX !!!"
482 # rom + ril type
483 proberil
484 printtask "### probe rom type ###"
485 proberom
487 # rom type
488 if [ $# -gt 2 ]; then
489 RID=$3
490 case "$RID" in
491 cm10|cm*|cyanogenmod*)
493 aokp*|teamkang)
494 RID=aokp;
496 pa*)
497 RID=pa;
500 RID=`aosp_mod_check`;
502 esac
503 echo "... Using $RID patches ..."
504 else
505 echo "... Using results of ROM check ..."
508 # patch type
509 if [ $# -gt 1 ]; then
510 PIL=${2//,/ }
511 else
512 #PIL=`ls patches/`
513 PIL="pdroid v6supercharger"
514 echo "No mods selected. Defaulting to the v6 and Pdroid, just because we can."
516 # a hack to make sure pdroid is the first mod
517 [[ ${PIL[@]} =~ pdroid ]] && PID=(pdroid)
518 for P in ${PIL[@]}; do
519 [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
520 done
522 # Build date
523 if [ $# -gt 3 ]; then
524 BID=$4
525 echo "... $PID patch date set manually to $BID ..."
526 else
527 buildquery
530 # echo ROM info
531 rominfo
533 if [[ ( "$PID" == "-h" || "$ANDR" == "-h" || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
534 echo "### supported patch candidates ###"
535 MODS=$(ls --ignore "extension" patches)
536 #echo ${MODS[@]}
538 for M in ${MODS[@]}; do
539 AND=$(ls --ignore="common" --ignore="*.txt" patches/$M)
540 #echo $M: ${AND[@]}
541 for A in ${AND[@]}; do
542 RID=$(ls --ignore="common" --ignore="*.sh" --ignore "provisionals" --ignore="*.txt" patches/$M/$A)
543 #echo $M: $A: ${RID[@]}
544 for R in ${RID[@]}; do
545 BID=$(ls --ignore "common" --ignore="*.sh" --ignore="*.txt" --ignore=".awk" -v patches/$M/$A/$R)
546 echo $M: $A: $R: ${BID[@]}
547 done
548 done
549 done
550 echo ""
551 echo "*****************************************************************"
552 echo ""
553 echo "Note: There are ONLY 4 ROMTYPES: [pa, cm, aokp, and aosp]."
554 echo "The Auto-Patcher will automatically slot if you need aosp-jb or aosp-mod"
555 echo ""
557 else
558 for P in ${PID[@]}; do
559 [ -d patches/$P ] || printerror "$P is not available"
560 [ -d patches/$P/$ANDR ] && R=$ANDR || A=all
561 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
562 #[ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
564 unset FILES
565 [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
566 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
567 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
568 for FILE in ${FILES[@]}; do
569 case "$FILE" in
570 +system/*)
571 [[ ${CID[@]} =~ ${FILE:1} ]] && printerror "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
573 -system/*)
574 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
576 system/*.jar)
577 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
579 system/*.apk)
580 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
582 *.img)
583 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
585 system/*)
586 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
588 esac
589 done
590 done
591 echo "### DELETE FILES= ${EID[@]}" >> "$LOG"
592 echo "### COPY FILES= ${CID[@]}" >> "$LOG"
593 echo "### JAR FILES= ${JID[@]}" >> "$LOG"
594 echo "### APK FILES= ${AID[@]}" >> "$LOG"
595 echo "### IMG FILES= ${IID[@]}" >> "$LOG"
596 echo "### TXT FILES= ${TID[@]}" >> "$LOG"
598 printtask "### unzip rom ###"
599 # extract system files
600 jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || printerror "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
601 #\cp -a system/ backup # only for debugging purpose
603 printtask "### create updater script ###"
604 jar -xvf "$ROMX" META-INF/com/google/android/updater-script META-INF/com/google/android/update-binary
605 jar -xvf "$ROMX" META-INF/com/google/android/update-binary-installer 1> /dev/null 2> /dev/null
606 if [ -f META-INF/com/google/android/update-binary-installer ]; then
607 printtask "... using Aroma installer ..."
608 \mv META-INF/com/google/android/update-binary-installer META-INF/com/google/android/update-binary
609 else
610 printtask "... using Clockworkmod installer ..."
612 if [ -f META-INF/com/google/android/update-binary ]; then
613 #echo "# original updater-script" >> "$LOG"
614 #cat META-INF/com/google/android/updater-script >> "$LOG"
616 cat META-INF/com/google/android/updater-script | grep ^mount | grep "/system" | head -n 1 > updater-script
617 [ -s updater-script ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" > updater-script
619 for FILE in ${EID[@]}; do
620 # restore the original
621 jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
622 done
623 for FILE in ${CID[@]}; do
624 # replace with the original or delete it
625 jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> updater-script
626 done
628 echo "package_extract_dir(\"system\", \"/system\");" >> updater-script
629 # add permission management
630 cat META-INF/com/google/android/updater-script | grep set_perm | grep "/system" >> updater-script
631 # TODO: remove if we don't need it any more
632 for P in ${PID[@]}; do
633 if [ -s patches/$P/$A/set_perm.txt ]; then
634 echo "...adding permissions..."
635 cat patches/$P/$A/set_perm.txt >> updater-script
637 done
639 cat META-INF/com/google/android/updater-script | grep ^unmount | grep "/system" | head -n 1 >> updater-script
641 [[ ${IID[@]} =~ boot.img ]] && cat META-INF/com/google/android/updater-script | grep "boot.img" >> updater-script
643 cat updater-script > META-INF/com/google/android/updater-script
645 echo "# generated updater-script" >> "$LOG"
646 cat updater-script >> "$LOG"
647 else
648 # this is not enough any more
649 jar -xvf update-template.zip META-INF/com/google/android/update-binary META-INF/com/google/android/updater-script
652 printtask "### create restore.zip ###"
653 jar -cfv tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF > /dev/null 2>> "$LOG"
654 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip 2>> "$LOG"
655 \mv signed.zip restore.zip
656 \rm -f tmp.zip
658 printtask "### decompile system files ###"
660 # decompile system files
661 for FILE in ${JID[@]}; do
662 JAR=${FILE##*/}
663 printtask "... decompile $JAR ..."
664 java -jar baksmali.jar -b -a 15 -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
665 if [ $FILE == "system/framework/framework.jar" ]; then
666 printtask "... extract preloaded-classes ..."
667 jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
668 \mv preloaded-classes tmp/${FILE}.out/
670 done
671 for FILE in ${AID[@]}; do
672 APK=${FILE##*/}
673 printtask "... decompile $APK ..."
674 if [ $FILE == "system/framework/framework-res.apk" ]; then
675 printtask "... installing framework files ..."
676 java -jar apktool.jar if $FILE
678 java -jar apktool.jar d -f $FILE tmp/$FILE.out
680 done
681 for FILE in ${IID[@]}; do
682 printtask "### unpacking $FILE ###"
683 case "$FILE" in
684 boot.img)
685 cd boot
686 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
688 mkdir ramdisk
689 cd ramdisk
690 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
691 cd ../../
694 printerror "cannot process $FILE"
696 esac
697 done
700 # apply system modification
702 for P in ${PID[@]}; do
703 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
704 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
705 [ -d patches/$P/$A/$R/$BID ] && B=$BID || B=latest
706 PAR=patches/$P/$A/$R
707 PARB=patches/$P/$A/$R/$B
709 unset FILES COPY DELS JARS APKS IMGS TXTS
710 [ -f patches/$P/$A/files.txt ] && FILES=$(cat patches/$P/$A/files.txt)
711 [ -f patches/$P/$A/$R/files.txt ] && FILES=$(cat patches/$P/$A/$R/files.txt)
712 for FILE in ${FILES[@]}; do
713 case $FILE in
714 +system/*)
715 COPY=(${COPY[@]} ${FILE:1})
717 -system/*)
718 DELS=(${DELS[@]} ${FILE:1})
720 system/*.jar)
721 JARS=(${JARS[@]} $FILE)
723 system/*.apk)
724 APKS=(${APKS[@]} $FILE)
726 *.img)
727 IMGS=(${IMGS[@]} $FILE)
729 system/*)
730 TXTS=(${TXTS[@]} $FILE)
732 esac
733 done
735 [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$A/$R/$B ###"
736 for FILE in ${COPY[@]}; do
737 printtask "... copying $FILE ..."
738 DEST=${FILE%/*}
739 mkdir -p ./$DEST
740 if [ -e patches/$P/$A/$R/$B/$FILE ]; then
741 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
742 \cp -av patches/$P/$A/$R/$B/$FILE ./$DEST >> "$LOG"
743 else
744 printerror "$FILE is missing in the patch"
746 done
748 # unconditional smali copying
749 [ -f patches/$P/smali.txt ] && SMALI=$(cat patches/$P/smali.txt)
750 [ -f patches/$P/$A/smali.txt ] && SMALI=$(cat patches/$P/$A/smali.txt)
751 [ -f patches/$P/$A/$R/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/smali.txt)
752 [ -f patches/$P/$A/$R/$B/smali.txt ] && SMALI=$(cat patches/$P/$A/$R/$B/smali.txt)
753 MOVE=${SMALI##*/}
754 for SMALI in ${SMALI[@]}; do
755 printtask "... overwriting $MOVE ..."
756 \cp -av patches/$P/$ANDR/provisionals/$SMALI tmp/$SMALI >> "$LOG"
757 done
760 [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$A/$R/$B ###"
761 for FILE in ${DELS[@]}; do
762 printtask "... deleting $FILE ..."
763 \rm -rf ./$FILE
764 done
766 [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$A/$R/$B ###"
767 for FILE in ${JARS[@]}; do
768 JAR=${FILE##*/}
769 NAME=${JAR%.jar}
770 printtask "... apply $NAME.patch ..."
771 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/${NAME}.patch 2>&1 > ${JAR}.log
772 cat ${JAR}.log | tee -a "$LOG"
773 case "$NAME" in
774 framework)
775 # patch preloaded-classes only if a patch exists
776 if [ -f $PARB/preloaded.patch ]; then
777 printtask "... apply preloaded.patch ..."
778 patch -Nls -p1 -d tmp/${FILE}.out < $PARB/preloaded.patch 2>&1 > preloaded.log
779 cat preloaded.log | tee -a "$LOG"
780 [[ `grep FAILED preloaded.log` != "" ]] && printerror "failed preloaded.patch"
784 echo -n "" # do nothing else
786 esac
787 # substitute failed smali with premade jar
788 unset FAILS
789 FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'`)
790 if [[ -n ${FAILS[@]} ]]; then
791 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
792 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
793 for FAIL in ${FAILS[@]}; do
794 echo "!!! patch error for $FAIL !!!" >> "$LOG"
795 #cat tmp/$FILE.out/smali/${FAIL}.rej >> "$LOG"
796 [[ ${SID[@]} =~ $FAIL ]] && printerror "$FAIL was already replaced before"
797 [ -f patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} ] || printerror "failed $FAIL in $JAR cannot be remedied"
798 copyfailed || printerror "failed $NAME.patch"
799 printtask "... replace $FAIL ..."
800 \rm -rf tmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL}.orig tmp/${FILE}.out/smali/${FAIL}.rej
801 \cp -av patches/$P/$ANDR/provisionals/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} >> "$LOG" || echo "FAILED to cp $FAIL" >> ${JAR}.log
802 SID=(${SID[@]} $FAIL)
803 done
805 [[ `grep FAILED ${JAR}.log` != "" ]] && printerror "failed $NAME.patch"
806 garbage tmp/${FILE}.out
807 if [ -f patches/$P/$A/$R/$B/{JAR}.sh ]; then
808 printtask "... apply $JAR.sh ..."
809 . patches/$P/$A/$R/$B/{JAR}.sh 2>&1 > ${JAR}.log
810 cat ${JAR}.log | tee -a "$LOG"
812 done
814 [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$R/$B ###"
815 for FILE in ${APKS[@]}; do
816 APK=${FILE##*/}
817 if [ -d "tmp/${FILE}.out" ] ; then
818 printtask "... apply $APK.patch ..."
819 patch -Nls -p2 -d tmp/${FILE}.out < $PARB/${APK}.patch 2>&1 >> ${APK}.log
820 cat ${APK}.log | tee -a "$LOG"
821 [[ `grep FAILED ${APK}.log` != "" ]] && printerror "failed $APK.patch"
822 garbage tmp/${FILE}.out
823 else
824 echo "No $APK in your ROM. Not able to patch this file."
825 echo "## No $APK in ROM ###" >> "$LOG"
827 done
828 [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$A/$R/$B ###"
829 for FILE in ${IMGS[@]}; do
830 IMG=${FILE##*/}
831 #NAME=${IMG%.img}
832 echo "... applying $IMG.patch ..."
833 patch -Nls -p1 -d boot/ramdisk < $PARB/${IMG}.patch >> "$LOG" || printerror "failed patching $FILE"
834 # Special Instructions- married to boot.img patching by necessity, not design. When
835 # added to it's own section, it only runs for one mod. WIP.
836 #if [ -f patches/$P/$R/special_instructions.sh ]; then
837 # . patches/$P/$R/special_instructions.sh
838 #elif [ -f patches/$P/special_instruction.sh ]; then
839 # . patches/$P/special_instructions.sh
841 done
843 [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$A/$R/$B ###"
844 for FILE in ${TXTS[@]}; do
845 TXT=${FILE##*/}
846 if [[ -f $PARB/${TXT}.patch ]]; then
847 printtask "... apply $TXT.patch ..."
848 patch -Nls -p2 -d system/ < $PARB/${TXT}.patch 2>&1 > ${TXT}.log
849 #cat ${TXT}.log | tee -a "$LOG"
850 [[ `grep FAILED ${TXT}.log` != "" ]] && printerror "failed $TXT.patch"
852 if [[ -f $PAR/${TXT}.awk ]]; then
853 printtask "... apply $TXT.awk ..."
854 awk -f $PAR/${TXT}.awk $FILE > text || printerror "failed $TXT.awk"
855 mv text $FILE
857 if [[ -f $PAR/${TXT}.sed ]]; then
858 printtask "... apply $TXT.sed ..."
859 sed -f $PAR/${TXT}.sed $FILE > text || printerror "failed $TXT.sed"
860 mv text $FILE
862 if [[ -f $PAR/${TXT}.sh ]]; then
863 printtask "... apply $TXT.sh ..."
864 . $PAR/${TXT}.sh 2>&1 >> ${TXT}.log || printerror "failed $TXT.sh"
866 garbage system/
867 done
868 done
870 # Rebuilding system files
872 [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
873 for FILE in ${JID[@]}; do
874 JAR=${FILE##*/}
875 printtask "... rebuild $JAR ..."
876 java -Xmx512M -jar smali.jar -a 15 tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
877 [ -f tmp/${FILE}.out/classes.dex ] || printerror "failed compiling $JAR !!!"
878 jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
879 if [ $FILE == "system/framework/framework.jar" ]; then
880 jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
882 done
884 [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
885 printtask "... Fixing aapt permissions ..."
886 chmod a+x ../patch_tools/mac/aapt
887 chmod a+x ../patch_tools/cygwin/aapt.exe
888 chmod a+x ../patch_tools/linux/aapt
889 for FILE in ${AID[@]}; do
890 APK=${FILE##*/}
891 printtask "... rebuild $APK ..."
892 java -jar apktool.jar b tmp/${FILE}.out >> "$LOG" 2>> "$LOG" || printerror "failed compiling $FILE !!!"
893 jar -ufv $FILE -C tmp/${FILE}.out/build/apk/ . > /dev/null 2>> "$LOG"
894 #\rm -r tmp/${FILE}.out
895 done
897 [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
898 for FILE in ${IID[@]}; do
899 printtask "### rebuild $FILE ###"
900 case $FILE in
901 boot.img)
902 # Rebuilding boot.img
903 cd boot
904 printtask "... rebuilding ramdisk ..."
905 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
907 printtask "... composing boot.img ..."
908 BASE=$(cat boot.img-base)
909 # convert hex to decimal in cygwin by prefixing "0x" and C-style arithmetic
910 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
911 CMDLINE=$(cat boot.img-cmdline)
912 echo "cmdline = no_console_suspend=1 console=null $CMDLINE" >> "$LOG"
913 echo "pagesize = $PGSIZE" >> "$LOG"
914 echo "base = $BASE" >> "$LOG"
916 printtask "... rebuilding boot.img ..."
917 ./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 || printerror "failed building boot.img"
918 cd ..
921 printerror "cannot process $FILE"
923 esac
924 done
926 printtask "### create update.zip ###"
927 jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
928 java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip update.zip 2>> "$LOG"
929 #\rm -f tmp.zip
931 #echo "# miscellaneous log" >> "$LOG"
933 \mv restore.zip update.zip ..
934 echo "### finished ###"
935 echo "flash update.zip to install the modified"
936 echo "flash restore.zip to restore the original"
938 # add announcement
939 for P in ${PID[@]}; do
940 [ -d patches/$P/$ANDR ] && A=$ANDR || A=all
941 [ -d patches/$P/$A/$RID ] && R=$RID || R=generic
942 if [ -f patches/$P/$A/$R/README.txt ]; then
943 cat patches/$P/$A/$R/README.txt
944 elif [ -f patches/$P/$A/README.txt ]; then
945 cat patches/$P/$A/README.txt
947 done
949 cd ..
950 \rm -rf "$TEMP"