summaryrefslogtreecommitdiffstats
path: root/tools/dump-package-stats
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
commitb6c1cf6de79035f58b512f4400db458c8401379a (patch)
tree68979db37c85b499bc384e4ac337ed1424baab51 /tools/dump-package-stats
downloadbuild-b6c1cf6de79035f58b512f4400db458c8401379a.zip
build-b6c1cf6de79035f58b512f4400db458c8401379a.tar.gz
build-b6c1cf6de79035f58b512f4400db458c8401379a.tar.bz2
Initial Contribution
Diffstat (limited to 'tools/dump-package-stats')
-rwxr-xr-xtools/dump-package-stats152
1 files changed, 152 insertions, 0 deletions
diff --git a/tools/dump-package-stats b/tools/dump-package-stats
new file mode 100755
index 0000000..589bab5
--- /dev/null
+++ b/tools/dump-package-stats
@@ -0,0 +1,152 @@
+#!/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" ||
+ $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