#!/bin/sh
#
# Super-mega crusher of doom
# Shrinks apks by running pngquant or pngcrush or optipng or pngout on png images
#
# Point APKCERTS at the full path to a generated apkcerts.txt file, such as:
# /home/shade/dev/sources/android-cm-eclair/out/target/product/dream_sapphire/obj/PACKAGING/target_files_intermediates/cyanogen_dream_sapphire-target_files-eng.shade/META/apkcerts.txt
#
# cyanogen - shade@chemlab.org
# ChrisSoyars - me@ctso.me
# Nougat fixes: Joe Maples - frap129@gmail.com

set -e
QUIET=1
BASE=`pwd`
TMPDIR=/tmp/crusher-$$

. $ANDROID_BUILD_TOP/vendor/bliss/tools/colors

if [ "$APKCERTS" = "" ];
then
    if [ "$TARGET_BUILD_VARIANT" = "userdebug" ]; then
       TARGET_BUILD_VARIANT="eng"
    elif [ "$TARGET_BUILD_VARIANT" = "user" ]; then
       TARGET_BUILD_VARIANT="eng"
    fi

    APKCERTS=$OUT/obj/PACKAGING/target_files_intermediates/$TARGET_PRODUCT-target_files-$TARGET_BUILD_VARIANT.$USER/META/apkcerts.txt
    if [ ! -f "$APKCERTS" ];
    then
        echo $CL_RED"Set APKCERTS to the path to your apkcerts.txt file"$CL_RST
        exit 1;
    fi
fi

if [ ! -f "$APKCERTS" ];
then
    echo $CL_RED"Invalid path to apkcerts.txt, set APKCERTS to the correct path."$CL_RST
fi

if [ "$(which pngquant)" != "" ];
then
    if [ "$(which optipng)" != "" ];
    then
        OPTSTRING='Quantizing and optimizing'
        optimize_png () {
            pngquant --speed 1 --force --ext .png $1 1> /dev/null 2> /dev/null;
            optipng -o7 $1 1> /dev/null 2> /dev/null;
        }
    else
        OPTSTRING='Quantizing'
        optimize_png () {
            pngquant --speed 1 --force --ext .png $1 1> /dev/null 2> /dev/null
        }
    fi
else
    if [ "$(which optipng)" != "" ];
    then
        OPTSTRING='Optimizing'
        optimize_png () {
            optipng -o7 $1 1> /dev/null 2> /dev/null;
        }
    else
        echo $CL_RED"Please install pngquant or optipng (or both, for improved crushing)"$CL_RST
        exit 1;
    fi
fi

if [ "`which aapt`" = "" ];
then
    echo $CL_RED"Please ensure aapt is in your \$PATH"$CL_RST
    exit 1;
fi

if [ "`which zipalign`" = "" ];
then
    echo $CL_RED"Please ensure zipalign is in your \$PATH"$CL_RST
    exit 1;
fi

if [ -e "$1" ];
then
    NAME=`basename $1`;
    echo $CL_CYN$OPTSTRING $CL_YLW"$NAME..."$CL_RST;

    if [ "$2" != "" ];
    then
        CERT=build/target/product/security/$2.x509.pem
        KEY=build/target/product/security/$2.pk8
        if [ ! -f "$ANDROID_BUILD_TOP/$CERT" ];
        then
            echo $CL_RED"$CERT does not exist!";$CL_RST
            exit 1;
        fi
    else
        APKINFO=`grep "name=\"$NAME\"" $APKCERTS`;
        [ $QUIET ] || echo "APKINFO: $APKINFO";
        if [ "$APKINFO" = "" ];
        then
            echo $CL_RED"No apk info for $NAME";$CL_RST
            exit 1;
        fi
        CERT=`echo $APKINFO | awk {'print $2'} | cut -f 2 -d "=" | tr -d "\""`;
        KEY=`echo $APKINFO | awk {'print $3'} | cut -f 2 -d "=" | tr -d "\""`;
        if [ "$CERT" = "" ];
        then
            echo -e $CL_RED"Unable to find certificate for $NAME"$CL_RST
            exit 1;
        fi
        if [ "$CERT" = "PRESIGNED" ];
        then
            echo $CL_GRN"$NAME is presigned, skipping"$CL_RST
            exit 1;
        fi
    fi

    [ $QUIET ] || echo $CL_YLW"Certificate:"$CL_RST" $CERT";

    [ -d $TMPDIR/$NAME ] && rm -rf $TMPDIR/$NAME
    mkdir -p $TMPDIR/$NAME
    trap "rm -rf $TMPDIR; exit" INT TERM EXIT
    cd $TMPDIR/$NAME
    unzip -q $BASE/$1
    for x in `find . -name "*.png" | grep -v "\.9.png$" | tr "\n" " "`
    do
        [ $QUIET ] || echo $CL_GRN"Crushing $x"$CL_RST
        optimize_png $x
    done
    cp $BASE/$1 $BASE/$1.old

    [ $QUIET ] || echo $CL_GRN"Repacking apk.."$CL_RST
    aapt p -0 .dat -0 .dict -0 .arsc -F $NAME .

    [ $QUIET ] || echo $CL_YLW"Resigning with cert: `echo $CERT`"$CL_RST

    [ $QUIET ] || echo java -Djava.library.path=$SIGNAPK_JNI_LIBRARY_PATH -jar $ANDROID_HOST_OUT/framework/signapk.jar $ANDROID_BUILD_TOP/$CERT $ANDROID_BUILD_TOP/$KEY $NAME signed_$NAME
    java -Djava.library.path=$SIGNAPK_JNI_LIBRARY_PATH -jar $ANDROID_HOST_OUT/framework/signapk.jar $ANDROID_BUILD_TOP/$CERT $ANDROID_BUILD_TOP/$KEY $NAME signed_$NAME 
    [ $QUIET ] || echo $CL_GRN"Zipalign.."$CL_RST
    zipalign -f 4 signed_$NAME $BASE/$1
    if [ ! $QUIET ]; then
        ls -l $BASE/$1.old
        ls -l $BASE/$1
    fi
    rm $BASE/$1.old
else
    echo "Usage: $0 [apk file]"
fi
