|  | #!/bin/bash | 
|  | # | 
|  | # Copyright (C) 2007 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | # | 
|  |  | 
|  | PROGNAME=`basename $0` | 
|  |  | 
|  | function fail () | 
|  | { | 
|  | if [ ! -z "$@" ] | 
|  | then | 
|  | echo "$PROGNAME: ERROR: $@" >&2 | 
|  | fi | 
|  | echo "$PROGNAME: ERROR: failed." >&2 | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | function usage () | 
|  | { | 
|  | cat << HERE | 
|  | usage: $PROGNAME <.jar/.apk-file-list> | 
|  | Dumps a summary of the compressed and uncompressed sizes of various | 
|  | types of files in each package.  Emits one line per package. | 
|  | Packages must be zipfiles, readable using "unzip". | 
|  |  | 
|  | Example output line: | 
|  |  | 
|  | filesize=642684 all=603288/919304 dex=119529/353815 name="out/App.apk" | 
|  |  | 
|  | filesize: the size of the package on disk | 
|  | name: the name of the package as passed to $PROGNAME | 
|  |  | 
|  | These fields are presented as <uncompressed bytes>/<compressed bytes>: | 
|  |  | 
|  | all: the sum of all entries in the package | 
|  | dex: the sum of all "*.dex" entries in the package | 
|  | HERE | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | if [ $# -lt 1 ] | 
|  | then | 
|  | usage | 
|  | fi | 
|  |  | 
|  | UNAME=`uname` | 
|  | if [ "x$UNAME" = "xDarwin" ] | 
|  | then | 
|  | statArgs="-f %z" | 
|  | elif [ "x$UNAME" = "xLinux" ] | 
|  | then | 
|  | statArgs="-c %s" | 
|  | else | 
|  | fail "Unknown uname $UNAME" | 
|  | fi | 
|  |  | 
|  | function printFileSize () | 
|  | { | 
|  | stat $statArgs $1 | 
|  | } | 
|  |  | 
|  | for file | 
|  | do | 
|  | if [ ! -f "$file" ] | 
|  | then | 
|  | fail "$file doesn't exist or isn't a file" | 
|  | fi | 
|  | unzip -lv "$file" | awk ' | 
|  | BEGIN { | 
|  | total_compressed = 0; | 
|  | total_uncompressed = 0; | 
|  | dex_compressed = 0; | 
|  | dex_uncompressed = 0; | 
|  | } | 
|  |  | 
|  | # Make sure the output of unzip -lv looks like something we expect. | 
|  | # | 
|  | NR == "1" { | 
|  | if ($1 != "Archive:") { | 
|  | print "'$PROGNAME': ERROR: Unexpected zip listing format" > \ | 
|  | "/dev/stderr"; | 
|  | print "'$PROGNAME': ERROR: Line 1 is \"" $0 "\"" > \ | 
|  | "/dev/stderr"; | 
|  | failed = 1; | 
|  | exit 1; | 
|  | } | 
|  | } | 
|  | NR == "2" { | 
|  | if (NF != "8" || | 
|  | $1 != "Length" || | 
|  | $2 != "Method" || | 
|  | $3 != "Size" || | 
|  | ($4 != "Ratio" && $4 != "Cmpr") || | 
|  | $5 != "Date" || | 
|  | $6 != "Time" || | 
|  | $7 != "CRC-32" || | 
|  | $8 != "Name") | 
|  | { | 
|  | print "'$PROGNAME': ERROR: Unexpected zip listing format" > \ | 
|  | "/dev/stderr"; | 
|  | print "'$PROGNAME': ERROR: Line 2 is \"" $0 "\"" > \ | 
|  | "/dev/stderr"; | 
|  | failed = 1; | 
|  | exit 1; | 
|  | } else { | 
|  | saw_listing = 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | # Only look for lines where the ratio is the fourth column; | 
|  | # this filters out the header and footer. | 
|  | # | 
|  | $4 ~ /%$/ { | 
|  | uncompressed = $1; | 
|  | compressed = $3; | 
|  | if ($0 ~ /.dex$/) { | 
|  | dex_compressed += compressed; | 
|  | dex_uncompressed += uncompressed; | 
|  | } | 
|  | total_compressed += compressed; | 
|  | total_uncompressed += uncompressed; | 
|  | } | 
|  | { next } | 
|  |  | 
|  | END { | 
|  | if (!failed && saw_listing) { | 
|  | print "filesize='$(printFileSize "$file")'", | 
|  | "all=" total_compressed "/" total_uncompressed, | 
|  | "dex=" dex_compressed "/" dex_uncompressed, | 
|  | "name=\"'"$file"'\""; | 
|  | } else { | 
|  | exit 1; | 
|  | } | 
|  | } | 
|  | ' | 
|  | if [ $? -ne 0 ] | 
|  | then | 
|  | fail "Could not get stats for $file" | 
|  | fi | 
|  | done |