blob: a869c6c69c780dd5381ae41e954fe509a836ea05 [file] [log] [blame]
Dark Eyes93765822015-12-13 23:07:44 -05001#!/bin/bash
2#
3# Super-mega LiquidSmooth opticharger of doom
4# Shrinks apks by running pngquant or pngcrush or optipng or pngout on png images
5#
6
7. $ANDROID_BUILD_TOP/vendor/bliss/tools/colors
8
9OUT_TARGET_HOST=$(uname -a | grep Darwin)
10if [ -z "$OUT_TARGET_HOST" ]
11then
12 OUT_TARGET_HOST=linux-x86
13else
14 OUT_TARGET_HOST=darwin-x86
15fi
16
17set -e
18QUIET=1
19BASE=`pwd`
20BRUTECRUSH="-brute"
21TMPDIR=/tmp/opticharge-$$
22
23if [ -z "$BRUTE_PNGCRUSH" ]
24then
25 BRUTECRUSH=""
26fi
27
28if [ "$APKCERTS" = "" ];
29then
30 if [ "$TARGET_BUILD_VARIANT" = "userdebug" ]; then
31 TARGET_BUILD_VARIANT="eng"
32 elif [ "$TARGET_BUILD_VARIANT" = "user" ]; then
33 TARGET_BUILD_VARIANT="eng"
34 fi
35
36 APKCERTS=$OUT/obj/PACKAGING/target_files_intermediates/$TARGET_PRODUCT-target_files-$TARGET_BUILD_VARIANT.$USER/META/apkcerts.txt
37 if [ ! -f "$APKCERTS" ];
38 then
39 echo -e ${red}"Set APKCERTS to the path to your apkcerts.txt file"${txtrst}
40 exit 1;
41 fi
42fi
43
44if [ ! -f "$APKCERTS" ];
45then
46 echo -e ${red}"Invalid path to apkcerts.txt, set APKCERTS to the correct path."${txtrst}
47fi
48
49if [ "$(which pngquant)" != "" ];
50then
51 optimize_png () {
52 pngquant --speed 1 --force --ext .png $1 1> /dev/null 2> /dev/null
53 }
54elif [ "$(which pngcrush)" != "" ];
55then
56 optimize_png () {
57 pngcrush -q ${BRUTECRUSH} $1 ${1}.out 1> /dev/null 2> /dev/null
58 mv ${1}.out ${1} 2> /dev/null
59 }
60elif [ "$(which optipng)" != "" ];
61then
62 optimize_png () {
63 optipng -o7 -quiet $1 1> /dev/null 2> /dev/null
64 }
65elif [ "$(which pngout-static)" != "" ];
66then
67 optimize_png () {
68 pngout-static $1
69 }
70elif [ "$(which pngout)" != "" ];
71then
72 optimize_png () {
73 pngout $1
74 }
75else
76 echo -e ${red}"Please install pngquant, pngcrush, optipng, or pngout"${txtrst}
77 exit 1;
78fi
79
80if [ "`which aapt`" = "" ];
81then
82 echo -e ${red}"Please ensure aapt is in your \$PATH"${txtrst}
83 exit 1;
84fi
85
86if [ "`which zipalign`" = "" ];
87then
88 echo -e ${red}"Please ensure zipalign is in your \$PATH"${txtrst}
89 exit 1;
90fi
91
92if [ -e "$1" ];
93then
94 NAME=`basename $1`;
95 echo -e ${bldgrn}"Optimizing:${txtrst} $NAME...";
96
97 if [ "$2" != "" ];
98 then
99 if [ "$DEFAULT_SYSTEM_DEV_CERTIFICATE" ]; then
100 CERT_PATH=`dirname $DEFAULT_SYSTEM_DEV_CERTIFICATE`
101 else
102 CERT_PATH=build/target/product/security
103 fi
104 CERT="$CERT_PATH"/$2.x509.pem
105 KEY="$CERT_PATH"/$2.pk8
106 if [ ! -f "$ANDROID_BUILD_TOP/$CERT" ];
107 then
108 echo -e ${red}"$CERT does not exist!"${txtrst};
109 exit 1;
110 fi
111 else
112 APKINFO=`grep "name=\"$NAME\"" $APKCERTS`;
113 [ $QUIET ] || echo -e "APKINFO: $APKINFO";
114 if [ "$APKINFO" = "" ];
115 then
116 echo -e ${red}"No apk info for $NAME"${txtrst};
117 exit 1;
118 fi
119 CERT=`echo -e $APKINFO | awk {'print $2'} | cut -f 2 -d "=" | tr -d "\""`;
120 KEY=`echo -e $APKINFO | awk {'print $3'} | cut -f 2 -d "=" | tr -d "\""`;
121 if [ "$CERT" = "" ];
122 then
123 echo -e ${red}"Unable to find certificate for $NAME"${txtrst}
124 exit 1;
125 fi
126 if [ "$CERT" = "PRESIGNED" ];
127 then
128 echo -e ${cya}"$NAME is presigned, skipping"${txtrst}
129 exit 1;
130 fi
131 fi
132
133 [ $QUIET ] || echo -e ${bldylw}"Certificate:${txtrst} $CERT";
134
135 [ -d $TMPDIR/$NAME ] && rm -rf $TMPDIR/$NAME
136 mkdir -p $TMPDIR/$NAME
137 trap "rm -rf $TMPDIR; exit" INT TERM EXIT
138 cd $TMPDIR/$NAME
139 unzip -q $BASE/$1
140 for x in `find . -name "*.png" | grep -v "\.9.png$" | tr "\n" " "`
141 do
142 [ $QUIET ] || echo -e ${bldgrn}"Crushing${txtrst} $x"
143 optimize_png $x
144 done
145 cp $BASE/$1 $BASE/$1.old
146
147 [ $QUIET ] || echo -e ${bldgrn}"Repacking apk.."${txtrst}
148 aapt p -0 .dat -0 .dict -0 .arsc -F $NAME .
149
150 [ $QUIET ] || echo -e ${bldgrn}"Resigning with cert:${txtrst} `echo -e $CERT`"
151
152 [ $QUIET ] || echo java -jar $ANDROID_HOST_OUT/framework/signapk.jar $ANDROID_BUILD_TOP/$CERT $ANDROID_BUILD_TOP/$KEY $NAME signed_$NAME
153 java -jar $ANDROID_HOST_OUT/framework/signapk.jar $ANDROID_BUILD_TOP/$CERT $ANDROID_BUILD_TOP/$KEY $NAME signed_$NAME
154 [ $QUIET ] || echo -e ${bldgrn}"Zipalign.."${txtrst}
155 zipalign -f 4 signed_$NAME $BASE/$1
156 if [ ! $QUIET ]; then
157 ls -l $BASE/$1.old
158 ls -l $BASE/$1
159 fi
160 rm $BASE/$1.old
161else
162 echo -e "Usage: $0 [apk file]"
163fi