Advertisement
mateorod

auto_patcher

Aug 17th, 2012
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 24.61 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # version: beta v2.1.0, patches 2012.09.13.
  4.  
  5. # PDroid created by svyat. Official PDroid thread is
  6. # http://forum.xda-developers.com/showthread.php?t=1357056
  7.  
  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
  11.  
  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 patche 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
  67. #
  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.  
  73. # SHELL PROGRAMMING NOTES:
  74. # [ -s FILE ]
  75. # [[ -n STRING ]] or [[ -z STRING ]]
  76.  
  77. echo " "
  78. echo "The Auto-Patcher v2.1.0"
  79. echo " "
  80. # by pastime1971 and mateorod
  81.        
  82.  
  83. # pass variables to children
  84. set -a
  85.  
  86. # function for converting hex to binary- for testing
  87. #function h2b { echo "obase=2; ibase=16; $( echo "$*" | sed -e 's/0x//g' -e 's/\([a-z]\)/\u\1/g' )" | bc; }
  88.  
  89. printusage () {
  90.     echo "smali auto patcher v2.1.0"
  91.     echo "      pdroid 1.32 patches 2012.09.13."
  92.     echo "      v6supercharger patches 2012.08.17."
  93.     echo ""
  94.     echo "usage: $0 ROM.ZIP MODS [ROMTYPE] [PATCHDATE]"
  95.     echo ""
  96.     echo "MODS can be pdroid,v6supercharger or pdroid or v6supercharger"
  97.     echo "optional [ROMTYPE] can be cm9, aokp, etc."
  98.     echo "optional [PATCHDATE] can be specified to use older patch versions."
  99.     echo "try \"$0 ROM.ZIP -h\" to see what is available"
  100.     echo ""
  101.     exit
  102. }
  103.  
  104. debug () {
  105.     echo "! please refer to $LOG for any debugging"
  106.     echo ""
  107.     echo "! patching failed."
  108.     echo "! it may be possible to patch $ROM using other patch version"
  109.     echo ""
  110.     [ -d "$TEMP" ] && \rm -rf "$TEMP"
  111.     printusage
  112. }
  113.  
  114. printerror () {
  115.     echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
  116.     echo "!!! error:" $@
  117.     echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
  118.     echo ""
  119.     cat tmp/$FILE.out/smali/$FAIL.rej >> "$LOG"
  120.     debug
  121. }
  122.  
  123. printtask () {
  124.     echo "" >> "$LOG"
  125.     echo $@ | tee -a "$LOG"
  126. }
  127.  
  128. copyfailed () {
  129.     echo ""
  130.     echo "These are the files for which patching failed:"
  131.     echo "---------------------------------------------"
  132.     echo ""
  133.     grep FAILED ${JAR}.log | sed -e "s/.*.\///"
  134.     echo ""
  135.     echo "---------------------------------------------"
  136.     echo ""
  137.     echo "We can try to add a premade copy of those files."
  138.     echo "This sometimes works."
  139.     echo ""
  140.     echo "But IT MAY NOT WORK!!!"
  141.     echo ""
  142.     echo ""
  143.     askconsent && return 0 || return 1
  144. }
  145.  
  146. askconsent () {
  147.     sleep 1
  148.     echo -n "Do you want to proceed ? (YES/no) "
  149.     read PROCEED
  150.     case $PROCEED in
  151.         [Yy] | [Yy][Ee][Ss])
  152.             echo ""
  153.             ;;
  154.         *)
  155.             return 1;   # error
  156.             ;;
  157.     esac
  158.     echo -n "Are you sure ? (YES/no) "
  159.     read PROCEED
  160.     case $PROCEED in
  161.         [Yy] | [Yy][Ee][Ss])
  162.             return 0;   # successful
  163.             ;;
  164.         *)
  165.             return 1;   # error
  166.             ;;
  167.     esac
  168. }
  169.  
  170. abspath () {
  171.     case `uname -s` in
  172.     CYGWIN*)
  173.         echo $(cygpath -ua "$1")
  174.         ;;
  175.     Darwin)
  176.         #[[ $(echo $1 | awk '/^\//') == $1 ]] && echo "$1" || echo "$PWD/$1"
  177.         [[ ${1:0:1} == "/" ]] && echo "$1" || echo "$PWD/$1"
  178.         ;;
  179.     Linux)
  180.         echo $(readlink -f "$1")
  181.         ;;
  182.     *)
  183.         if [[ ${1:0:1} == "/" ]]; then
  184.             echo "$1"
  185.         elif [[ ${1:0:2} == "./" ]]; then
  186.             echo "$PWD/${1:2}"
  187.         else
  188.             echo "$PWD/$1"
  189.         fi
  190.         ;;
  191.     esac
  192. }
  193.  
  194. extpath () {
  195.     case `uname -s` in
  196.     CYGWIN*)
  197.         echo $(cygpath -da "$1")
  198.         ;;
  199.     *)
  200.         echo $(abspath "$1")
  201.         ;;
  202.     esac
  203. }
  204.  
  205. #contains () { for e in "${@:2}"; do [[ "$e" = "$1" ]] && return 0; done; return 1; }
  206.  
  207. parse () { echo "${1%%_*}"; }
  208.  
  209. getbuildprop () {
  210. if [ -f system/build.prop ]; then
  211.     result=(`grep $1 system/build.prop | tr '=' ' '`)
  212.     echo ${result[1]}
  213. else
  214.     echo ""
  215. fi
  216. }
  217.  
  218. proberom () {
  219.     VID=$(getbuildprop ro.build.version.release)
  220.  
  221.     if [ "${VID%.*}" == "2.3" ]; then
  222.         RID=cm7;
  223.     elif [ "${VID%.*}" == "4.0" ]; then
  224.         MID=$(getbuildprop ro.rommanager.developerid)
  225.         [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.modversion))
  226.         DID=$(getbuildprop ro.product.device)
  227.         [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
  228.  
  229.         case "$MID" in
  230.         cm9|cm|cyanogenmod*)
  231.             RID=cm9;
  232.             ;;
  233.         aokp|teamkang)
  234.             RID=aokp;
  235.             ;;
  236. #       aosp|AOSP)  # AOSP probing does not work yet
  237. #           RID=aosp;
  238. #           ;;
  239.         *)
  240.             RID=aosp;
  241.             echo "!!! $MID is not supported yet, trying generic latest !!!"
  242.             ;;
  243.         esac
  244.     elif [ "${VID%.*}" == "4.1" ]; then
  245.         MID=$(getbuildprop ro.build.display.id)
  246.         [[ "$MID" == "" ]] && MID=$(parse $(getbuildprop ro.build.display.id))
  247.         DID=$(getbuildprop ro.product.device)
  248.         [[ "$DID" == "" ]] && DID=$(getbuildprop ro.build.product)
  249.  
  250.         case "$MID" in
  251.         pa*|cm10|cm*|cyanogenmod*)
  252.             RID=cm10;
  253.             ;;
  254.         aokp*|teamkang)
  255.             RID=aokp-jb;
  256.             ;;
  257. #       aosp|AOSP)  # AOSP probing does not work yet
  258. #           RID=aosp
  259. #           ;;
  260.         *)
  261.             RID=aosp-jb;
  262.             echo "!!! $MID may not be supported yet, trying aosp-jb latest !!!"
  263.             ;;
  264.         esac
  265.     else
  266.         printerror "unknown ROM version $VID"
  267.     fi
  268.     printtask "... result of ROM check: version= $VID rom= $RID ..."
  269. }
  270.  
  271. proberil () {
  272.     RIL=$(getbuildprop ro.telephony.ril_class)
  273.     [[ -n $RIL ]] && printtask "... result of ROM check: RIL= $RIL"
  274. }
  275.  
  276. garbage () {
  277.     unset GARBAGE
  278.     GARBAGE=($(find $@ -name "*.orig")) && rm -rf ${GARBAGE[@]} && echo "GARBAGE=" ${GARBAGE[@]} >> "$LOG"
  279.     GARBAGE=($(find $@ -name "*.rej"))  && rm -rf ${GARBAGE[@]} && echo "GARBAGE=" ${GARBAGE[@]} >> "$LOG"
  280. }
  281.  
  282. [[ $# -lt 1 || $1 == "-h" || -z $1 ]] && printusage
  283.  
  284. ROOT=$(abspath `dirname "$0"`)
  285. TOOL="$ROOT/patch_tools.tgz"
  286. PTCH="$ROOT/patch_patches.tgz"
  287. ROM=$(abspath "$1")
  288. ROMX=$(extpath "$1")
  289.  
  290. if [[ $OSTYPE == "cygwin" ]]; then
  291.     EXE=".exe"
  292.     PGFORM="0x"
  293. fi
  294.  
  295. DATE=`date +%Y%m%d%H%M%S`
  296. TEMP=$(abspath ./tmp$DATE)
  297. LOG=$(abspath ./log$DATE)
  298. #echo $ROOT $TOOL $ROM $TEMP "$LOG"
  299. echo "ROOT= $ROOT" >> "$LOG"
  300. echo "TOOL= $TOOL" >> "$LOG"
  301. echo "ROM=  $ROM" >> "$LOG"
  302. echo "ROMX= $ROMX" >> "$LOG"
  303.  
  304. \rm -f restore.zip update.zip
  305.  
  306. #CHK=$(getconf LONG_BIT)
  307. #if [[ $CHK = "64" ]]; then
  308. #   BIT=64
  309. #else [[ $BIT = "32" ]];
  310. #   BIT=32
  311. #fi
  312. #echo "*** You are using a $BIT bit OS   ***" >> "$LOG"
  313. #echo "### You are using $BIT bit OS ###"
  314.  
  315. printtask "### verify tools ###"
  316. which patch >> "$LOG" || printerror "Missing \"patch diff tools\""
  317. which tar >> "$LOG" || printerror "Missing \"tar zip tools\""
  318. which jar >> "$LOG" || printerror "Missing \"jar (JDK)\""
  319. which java >> "$LOG" || printerror "Missing \"java (JRE)\""
  320. which cpio >> "$LOG" || printerror "Missing \"cpio (JRE)\""
  321. [ -f "$TOOL" ] || printerror "patch tool is missing"
  322. [ -f "$PTCH" ] || printerror "patch patches are missing"
  323. printtask "### verify ROM ###"
  324. [ -f "$ROM" ] || printerror "Cannot find $ROM"
  325. echo "# running" $0 $@ >> "$LOG"
  326. mkdir "$TEMP"
  327. cd "$TEMP"
  328.  
  329. PATH="$TEMP:$PATH"
  330. export PATH
  331. echo "PATH= $PATH" >> "$LOG"
  332.  
  333. printtask "### unzip patch tools ###"
  334. tar xvzf "$TOOL" >> "$LOG" 2>> "$LOG" || printerror "failed extracting tools !!!"
  335. # workaround for the recent cygwin filename issue
  336. \mv cygwin/aapt.exe .
  337. \mv cygwin/*.exe boot/
  338. \rm -rf cygwin
  339. printtask "### unzip patch patches ###"
  340. tar xvzf "$PTCH" > /dev/null || printerror "failed extracting patches !!!"
  341.  
  342. # build date
  343. if [ $# -gt 3 ]; then
  344.     BID=$4
  345. else
  346.     BID=latest
  347. fi
  348. # rom type
  349. if [ $# -gt 2 ]; then
  350.     RID=$3
  351. else
  352.     printtask "### probe rom type ###"
  353.     jar -xvf "$ROMX" system/build.prop 2>> "$LOG" || printerror "failed extracting build.prop from $ROMX !!!"
  354.     proberom
  355. fi
  356. # ril type
  357. proberil
  358. # patch type
  359. if [ $# -gt 1 ]; then
  360.     PIL=${2//,/ }
  361. else
  362.     #PIL=`ls patches/`
  363.     PIL="pdroid v6supercharger"
  364. fi
  365. # a hack to make sure pdroid is the first mod
  366. [[ ${PIL[@]} =~ pdroid ]] && PID=(pdroid)
  367. for P in ${PIL[@]}; do
  368.     [[ ${PID[@]} =~ $P ]] || PID=(${PID[@]} $P)
  369. done
  370.  
  371. echo "# VID=" $VID >> "$LOG"
  372. echo "# MID=" $MID >> "$LOG"
  373. echo "# RID=" $RID >> "$LOG"
  374. echo "# DID=" $DID >> "$LOG"
  375. echo "# BID=" $BID >> "$LOG"
  376. echo "# PID=" ${PID[@]} >> "$LOG"
  377.  
  378. if [[ ( "$PID" == "-h"  || "$RID" == "-h" || "$BID" == "-h" ) ]]; then
  379.     echo "### supported patch candidates ###"
  380.     [ "$PID" != "-h" ] && PL=${PID[@]} || PL=`ls patches/`
  381.     for P in ${PL[@]}; do
  382.         [ "$PID" != "-h" -a "$RID" != "-h" ] && RL=${RID[@]} || RL=`ls patches/$P/`
  383.         for R in ${RL[@]} ; do
  384.             [ $R == "common" -o ! -d patches/$P/$R ] && continue
  385.             echo -n "$P : $R : "
  386.             \ls --ignore="*.sh" --ignore="*.txt" -r patches/$P/$R/
  387.         done
  388.     done
  389. else
  390.     for P in ${PID[@]}; do
  391.         [ -d patches/$P ] || printerror "$P is not available"
  392.  
  393.         [ -d patches/$P/$RID ] && R=$RID || R=generic
  394.         #[ -d patches/$P/$R/$BID ] && B=$BID || B=latest
  395.  
  396.         unset FILES
  397.         [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
  398.         [ -f patches/$P/$R/files.txt ] && FILES=$(cat patches/$P/$R/files.txt)
  399.         for FILE in ${FILES[@]}; do
  400.             case "$FILE" in
  401.             +system/*)
  402.                 [[ ${CID[@]} =~ ${FILE:1} ]] && printerror "${FILE:1} is already being copied" || CID=(${CID[@]} ${FILE:1})
  403.                 ;;
  404.             -system/*)
  405.                 [[ ${EID[@]} =~ ${FILE:1} ]] || EID=(${EID[@]} ${FILE:1})
  406.                 ;;
  407.             system/*.jar)
  408.                 [[ ${JID[@]} =~ $FILE ]] || JID=(${JID[@]} $FILE)
  409.                 ;;
  410.             system/*.apk)
  411.                 [[ ${AID[@]} =~ $FILE ]] || AID=(${AID[@]} $FILE)
  412.                 ;;
  413.             *.img)
  414.                 [[ ${IID[@]} =~ $FILE ]] || IID=(${IID[@]} $FILE)
  415.                 ;;
  416.             system/*)
  417.                 [[ ${TID[@]} =~ $FILE ]] || TID=(${TID[@]} $FILE)
  418.                 ;;
  419.             esac
  420.         done
  421.     done
  422.     echo "### DELETE FILES=" ${EID[@]} >> "$LOG"
  423.     echo "### COPY FILES=" ${CID[@]} >> "$LOG"
  424.     echo "### JAR FILES=" ${JID[@]} >> "$LOG"
  425.     echo "### APK FILES=" ${AID[@]} >> "$LOG"
  426.     echo "### IMG FILES=" ${IID[@]} >> "$LOG"
  427.     echo "### TXT FILES=" ${TID[@]} >> "$LOG"
  428.  
  429.     printtask "### unzip rom ###"
  430.     # extract system files
  431.     jar -xvf "$ROMX" ${JID[@]} ${AID[@]} ${IID[@]} ${TID[@]} 2>> "$LOG" || printerror "failed extracting ${JID[@]} ${AID[@]} ${IID[@]} from $ROMX !!!"
  432.     #\cp -a system/ backup  # only for debugging purpose
  433.  
  434.     printtask "### create updater script ###"
  435.     jar -xvf "$ROMX" META-INF/com/google/android/updater-script META-INF/com/google/android/update-binary
  436.     jar -xvf "$ROMX" META-INF/com/google/android/update-binary-installer 1> /dev/null 2> /dev/null
  437.     if [ -f META-INF/com/google/android/update-binary-installer ]; then
  438.         printtask "... using Aroma installer ..."
  439.         \mv META-INF/com/google/android/update-binary-installer META-INF/com/google/android/update-binary
  440.     else
  441.         printtask "... using Clockworkmod installer ..."
  442.     fi
  443.     if [ -f META-INF/com/google/android/update-binary ]; then
  444.         #echo "# original updater-script" >> "$LOG"
  445.         #cat META-INF/com/google/android/updater-script >> "$LOG"
  446.  
  447.         cat META-INF/com/google/android/updater-script | grep ^mount | grep "/system" | head -n 1 > updater-script
  448.         [ -s updater-script ] || echo "run_program(\"/sbin/busybox\", \"mount\", \"/system\");" > updater-script
  449.  
  450.         for FILE in ${EID[@]}; do
  451.             # restore the original
  452.             jar -xvf "$ROMX" $FILE 2> /dev/null || printtask "!!! warning $FILE cannot be restored !!!"
  453.         done
  454.         for FILE in ${CID[@]}; do
  455.             # replace with the original or delete it
  456.             jar -xvf "$ROMX" $FILE 2> /dev/null || echo "delete(\"/$FILE\");" >> updater-script
  457.         done
  458.  
  459.         echo "package_extract_dir(\"system\", \"/system\");" >> updater-script
  460.         # add permission management
  461.         cat META-INF/com/google/android/updater-script | grep set_perm | grep "/system" >> updater-script
  462.         # TODO: remove if we don't need it any more
  463.         for P in ${PID[@]}; do
  464.             if [ -s patches/$P/set_perm.txt ]; then
  465.                 echo "...adding permissions..."
  466.                 cat patches/$P/set_perm.txt >> updater-script
  467.             fi
  468.         done
  469.  
  470.         cat META-INF/com/google/android/updater-script | grep ^unmount | grep "/system" | head -n 1 >> updater-script
  471.  
  472.         [[ ${IID[@]} =~ boot.img ]] && cat META-INF/com/google/android/updater-script | grep "boot.img" >> updater-script
  473.  
  474.         cat updater-script > META-INF/com/google/android/updater-script
  475.  
  476.         echo "# generated updater-script" >> "$LOG"
  477.         cat updater-script >> "$LOG"
  478.     else
  479.         # this is not enough any more
  480.         jar -xvf update-template.zip META-INF/com/google/android/update-binary META-INF/com/google/android/updater-script
  481.     fi
  482.  
  483.     printtask "### create restore.zip ###"
  484.     #\rm -f system/build.prop   # user may have modified it # now we handle build.prop as well
  485.     jar -cfv tmp.zip ${JID[@]} ${AID[@]} ${IID[@]} META-INF >> "$LOG" 2>> "$LOG"
  486.     java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip signed.zip
  487.     \mv signed.zip restore.zip
  488.     \rm -f tmp.zip
  489.  
  490.     printtask "### decompile system files ###"
  491.     # decompile system files
  492.     for FILE in ${JID[@]}; do
  493.         JAR=${FILE##*/}
  494.         printtask "... decompile $JAR ..."
  495.         java -jar baksmali.jar -b -a 15 -o tmp/${FILE}.out/smali ${FILE} >> "$LOG" 2>> "$LOG"
  496.         if [ $FILE == "system/framework/framework.jar" ]; then
  497.             printtask "... extract preloaded-classes ..."
  498.             jar -xvf ${FILE} preloaded-classes >> "$LOG" 2>> "$LOG"
  499.             \mv preloaded-classes tmp/${FILE}.out/
  500.         fi
  501.     done
  502.     for FILE in ${AID[@]}; do
  503.         APK=${FILE##*/}
  504.         printtask "... decompile $APK ..."
  505.         if [ $FILE == "system/framework/framework-res.apk" ]; then
  506.             printtask "... installing framework files ..."
  507.             java -jar apktool.jar if $FILE
  508.         fi
  509.         java -jar apktool.jar d -f $FILE tmp/$FILE.out
  510.        
  511.     done
  512.     for FILE in ${IID[@]}; do
  513.         printtask "### unpacking $FILE ###"
  514.         case "$FILE" in
  515.             boot.img)
  516.                 cd boot
  517.                 ./unpackbootimg$EXE -i ../boot.img >> "$LOG" 2>> "$LOG"
  518.  
  519.                 mkdir ramdisk
  520.                 cd ramdisk
  521.                 gzip -dc ../boot.img-ramdisk.gz | cpio -i >> "$LOG" 2>> "$LOG"
  522.                 cd ../../
  523.                 ;;
  524.             *)
  525.                 printerror "cannot process $FILE"
  526.                 ;;
  527.         esac
  528.     done
  529.  
  530.  
  531.     # apply system modification
  532.     for P in ${PID[@]}; do
  533.         [ -d patches/$P/$RID ] && R=$RID || R=generic
  534.         [ -d patches/$P/$R/$BID ] && B=$BID || B=latest
  535.         PR=patches/$P/$R
  536.         PRB=patches/$P/$R/$B
  537.  
  538.         unset FILES COPY DELS JARS APKS IMGS TXTS
  539.         [ -f patches/$P/files.txt ] && FILES=$(cat patches/$P/files.txt)
  540.         [ -f patches/$P/$R/files.txt ] && FILES=$(cat patches/$P/$R/files.txt)
  541.         for FILE in ${FILES[@]}; do
  542.             case $FILE in
  543.             +system/*)
  544.                 COPY=(${COPY[@]} ${FILE:1})
  545.                 ;;
  546.             -system/*)
  547.                 DELS=(${DELS[@]} ${FILE:1})
  548.                 ;;
  549.             system/*.jar)
  550.                 JARS=(${JARS[@]} $FILE)
  551.                 ;;
  552.             system/*.apk)
  553.                 APKS=(${APKS[@]} $FILE)
  554.                 ;;
  555.             *.img)
  556.                 IMGS=(${IMGS[@]} $FILE)
  557.                 ;;
  558.             system/*)
  559.                 TXTS=(${TXTS[@]} $FILE)
  560.                 ;;
  561.             esac
  562.         done
  563.  
  564.         [[ -n ${COPY[@]} ]] && printtask "### copy patch $P/$R/$B ###"
  565.         for FILE in ${COPY[@]}; do
  566.             printtask "... copying $FILE ..."
  567.             DEST=${FILE%/*}
  568.             mkdir -p ./$DEST
  569.             if [ -e patches/$P/common/$FILE ]; then
  570.                 [ -e $FILE ] && printtask "... overwriting $FILE from $P ..."
  571.                 \cp -a patches/$P/common/$FILE ./$DEST
  572.             else
  573.                 printerror "$FILE is missing in the patch"
  574.             fi
  575.         done
  576.  
  577.         [[ -n ${DELS[@]} ]] && printtask "### delete patch $P/$R/$B ###"
  578.         for FILE in ${DELS[@]}; do
  579.             printtask "... deleting $FILE ..."
  580.             \rm -rf ./$FILE
  581.         done
  582.  
  583.         [[ -n ${JARS[@]} ]] && printtask "### jar patch $P/$R/$B ###"
  584.         for FILE in ${JARS[@]}; do
  585.             JAR=${FILE##*/}
  586.             NAME=${JAR%.jar}
  587.             printtask "... apply $NAME.patch ..."
  588.             patch -Nls -p1 -d tmp/${FILE}.out < $PRB/${NAME}.patch 2>&1 > ${JAR}.log
  589.             cat ${JAR}.log | tee -a "$LOG"
  590.             case "$NAME" in
  591.             framework)
  592.                 # patch preloaded-classes only if a patch exists
  593.                 if [ -f $PRB/preloaded.patch ]; then
  594.                     printtask "... apply preloaded.patch ..."
  595.                     patch -Nls -p1 -d tmp/${FILE}.out < $PRB/preloaded.patch 2>&1 > preloaded.log
  596.                     cat preloaded.log | tee -a "$LOG"
  597.                     [[ `grep FAILED preloaded.log` != "" ]] && printerror "failed preloaded.patch"
  598.                 fi
  599.                 ;;
  600.             *)
  601.                 echo -n ""  # do nothing else
  602.                 ;;
  603.             esac
  604.             # substitute failed smali with premade jar
  605.             FAILS=(`grep FAILED ${JAR}.log | sed -e 's/.*smali\///' | sed -e 's/\.rej//'`)
  606.             if [[ -n ${FAILS[@]} ]]; then
  607.                 printtask "!!! PATCHING FAILED FOR ${FAILS[@]} !!!"
  608.                 echo "### replace ${FAILS[@]} ###" > ${JAR}.log
  609.                 for FAIL in ${FAILS[@]}; do
  610.                     [[ ${SID[@]} =~ $FAIL ]] && printerror "$FAIL was already replaced before"
  611.                     copyfailed || printerror "failed $NAME.patch"
  612.                     printtask "... replace $FAIL ..."
  613.                     \rm -rf tmp/${FILE}.out/smali/${FAIL}
  614.                     \cp -a  patches/$P/common/provisionals/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} || echo "FAILED to cp $FAIL" >> ${JAR}.log
  615.                     #echo "### replacing ${FAILS[@]} from patches/$P/common/${FILE} ###" > ${JAR}.log
  616.                     #java -jar baksmali.jar -b -a 15 -o pmp/${FILE}.out/smali patches/$P/common/provisionals/${FAIL} >> "$LOG" 2>> "$LOG" || echo "FAILED to baksmali $FILE" >> ${JAR}.log
  617.                     #\cp -a  pmp/${FILE}.out/smali/${FAIL} tmp/${FILE}.out/smali/${FAIL} || echo "FAILED to cp $FAIL" >> ${JAR}.log
  618.                     SID=(${SID[@]} $FAIL)
  619.                 done
  620.             fi
  621.             [[ `grep FAILED ${JAR}.log` != "" ]] &&  printerror "failed $NAME.patch"
  622.             garbage tmp/${FILE}.out
  623.             if [ -f patches/$P/$R/${JAR}.sh ]; then
  624.                 printtask "... apply $JAR.sh ..."
  625.                 . patches/$P/$R/${JAR}.sh 2>&1 > ${JAR}.log
  626.                 cat ${JAR}.log | tee -a "$LOG"
  627.             fi
  628.         done
  629.  
  630.         [[ -n ${APKS[@]} ]] && printtask "### apk patch $P/$R/$B ###"
  631.         for FILE in ${APKS[@]}; do
  632.             APK=${FILE##*/}
  633.             #NAME=${APK%.apk}
  634.             printtask "... apply $APK.patch ..."
  635.                 patch -Nls -p2 -d tmp/${FILE}.out < $PRB/${APK}.patch 2>&1 >> ${APK}.log
  636.                 cat ${APK}.log | tee -a "$LOG"
  637.             [[ `grep FAILED ${APK}.log` != "" ]] && printerror "failed $APK.patch"
  638.             garbage tmp/${FILE}.out
  639.         done
  640.  
  641.         [[ -n ${IMGS[@]} ]] && printtask "### img patch $P/$R/$B ###"
  642.         for FILE in ${IMGS[@]}; do
  643.             IMG=${FILE##*/}
  644.             #NAME=${IMG%.img}
  645.             echo "... applying $IMG.patch ..."
  646.             patch -Nls -p1 -d boot/ramdisk < $PRB/${IMG}.patch || printerror "failed patching $FILE"
  647.             # Special Instructions- married to boot.img patching by necessity, not design. When
  648.             # added to it's own section, it only runs for one mod. WIP.
  649.             #if [ -f patches/$P/$R/special_instructions.sh ]; then
  650.             #   . patches/$P/$R/special_instructions.sh
  651.             #elif [ -f patches/$P/special_instruction.sh ]; then
  652.             #   . patches/$P/special_instructions.sh
  653.             #fi
  654.         done
  655.  
  656.         [[ -n ${TXTS[@]} ]] && printtask "### text patch $P/$R/$B ###"
  657.         for FILE in ${TXTS[@]}; do
  658.             TXT=${FILE##*/}
  659.             if [[ -f $PRB/${TXT}.patch ]]; then
  660.                 printtask "... apply $TXT.patch ..."
  661.                 patch -Nls -p2 -d system/ < $PRB/${TXT}.patch 2>&1 > ${TXT}.log
  662.                 #cat ${TXT}.log | tee -a "$LOG"
  663.                 [[ `grep FAILED ${TXT}.log` != "" ]] && printerror "failed $TXT.patch"
  664.             fi
  665.             if [[ -f $PR/${TXT}.awk ]]; then
  666.                 printtask "... apply $TXT.awk ..."
  667.                 awk -f $PR/${TXT}.awk $FILE > text || printerror "failed $TXT.awk"
  668.                 mv text $FILE
  669.             fi
  670.             if [[ -f $PR/${TXT}.sed ]]; then
  671.                 printtask "... apply $TXT.sed ..."
  672.                 sed -f $PR/${TXT}.sed $FILE > text || printerror "failed $TXT.sed"
  673.                 mv text $FILE
  674.             fi
  675.             if [[ -f $PR/${TXT}.sh ]]; then
  676.                 printtask "... apply $TXT.sh ..."
  677.                 . $PR/${TXT}.sh 2>&1 >> ${TXT}.log || printerror "failed $TXT.sh"
  678.             fi
  679.             garbage system/
  680.         done
  681.     done
  682.  
  683.     [[ -n ${JID[@]} ]] && printtask "### rebuild jar ###"
  684.     for FILE in ${JID[@]}; do
  685.         JAR=${FILE##*/}
  686.         printtask "... rebuild $JAR ..."
  687.         java -Xmx512M -jar smali.jar -a 15 tmp/${FILE}.out/smali -o tmp/${FILE}.out/classes.dex >> "$LOG" 2>> "$LOG"
  688.         [ -f tmp/${FILE}.out/classes.dex ] || printerror "failed compiling $JAR !!!"
  689.         jar -ufv ${FILE} -C tmp/${FILE}.out/ classes.dex >> "$LOG" 2>> "$LOG"
  690.         if [ $FILE == "system/framework/framework.jar" ]; then
  691.             jar -ufv ${FILE} -C tmp/${FILE}.out/ preloaded-classes >> "$LOG" 2>> "$LOG"
  692.         fi
  693.     done
  694.  
  695.     [[ -n ${AID[@]} ]] && printtask "### rebuild apk ###"
  696.     for FILE in ${AID[@]}; do
  697.         APK=${FILE##*/}
  698.         printtask "... rebuild $APK ..."
  699.         java -jar apktool.jar b tmp/"${FILE}.out" >> "$LOG" 2>> "$LOG" || printerror "failed compiling $FILE !!!"
  700.         jar -ufv "$FILE" -C tmp/"${FILE}.out"/build/apk/ . >> "$LOG" 2>> "$LOG"
  701.         #\rm -r tmp/${FILE}.out
  702.     done   
  703.  
  704.     [[ -n ${IID[@]} ]] && printtask "### rebuild img ###"
  705.     for FILE in ${IID[@]}; do
  706.         printtask "### rebuild $FILE ###"
  707.         case $FILE in
  708.             boot.img)
  709.                 # Rebuilding boot.img
  710.                 cd boot
  711.                 printtask "... rebuilding ramdisk ..."
  712.                 ./mkbootfs$EXE ./ramdisk | gzip > ramdisk-new.gz
  713.  
  714.                 printtask "... composing boot.img ..."
  715.                 BASE=$(cat boot.img-base)
  716.                 # convert hex to decimal in cygwin by prefixing "0x" and C-style arithmetic
  717.                 PGSIZE=$((${PGFORM}$(cat boot.img-pagesize)))
  718.                 CMDLINE=$(cat boot.img-cmdline)
  719.                 echo "cmdline = no_console_suspend=1 console=null" $CMDLINE >> "$LOG"
  720.                 echo "pagesize =" $PGSIZE >> "$LOG"
  721.                 echo "base =" $BASE >> "$LOG"
  722.  
  723.                 printtask "... rebuilding boot.img ..."
  724.                 ./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"
  725.                 cd ..
  726.                 ;;
  727.             *)
  728.                 printerror "cannot process $FILE"
  729.                 ;;
  730.         esac
  731.     done
  732.  
  733.     printtask "### create update.zip ###"
  734.     jar -cfv tmp.zip ${IID[@]} ${JID[@]} ${AID[@]} ${CID[@]} ${TID[@]} META-INF >> "$LOG" 2>> "$LOG"
  735.     java -jar signapk.jar updatecert.pem updatekey.pk8 tmp.zip update.zip
  736.     \rm -f tmp.zip
  737.  
  738.     #echo "# miscellaneous log" >> "$LOG"
  739.  
  740.     \mv restore.zip update.zip ..
  741.     echo "### finished ###"
  742.     echo "flash update.zip to install the modified"
  743.     echo "flash restore.zip to restore the original"
  744.  
  745.     # add announcement
  746.     for P in ${PID[@]}; do
  747.         [ -d patches/$P/$RID ] && R=$RID || R=generic
  748.         if [ -f patches/$P/$R/README.txt ]; then
  749.             cat patches/$P/$R/README.txt
  750.         elif [ -f patches/$P/README.txt ]; then
  751.             cat patches/$P/README.txt
  752.         fi
  753.     done
  754. fi
  755. cd ..
  756. \rm -rf "$TEMP"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement