OSDN Git Service

eclair snapshot
[android-x86/build.git] / tools / dump-package-stats
1 #!/bin/bash
2 #
3 # Copyright (C) 2007 The Android Open Source Project
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #      http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #
17
18 PROGNAME=`basename $0`
19
20 function fail ()
21 {
22     if [ ! -z "$@" ]
23     then
24         echo "$PROGNAME: ERROR: $@" >&2
25     fi
26     echo "$PROGNAME: ERROR: failed." >&2
27     exit 1
28 }
29
30 function usage ()
31 {
32     cat << HERE
33 usage: $PROGNAME <.jar/.apk-file-list>
34     Dumps a summary of the compressed and uncompressed sizes of various
35     types of files in each package.  Emits one line per package.
36     Packages must be zipfiles, readable using "unzip".
37
38     Example output line:
39
40         filesize=642684 all=603288/919304 dex=119529/353815 name="out/App.apk"
41
42     filesize: the size of the package on disk
43     name: the name of the package as passed to $PROGNAME
44
45     These fields are presented as <uncompressed bytes>/<compressed bytes>:
46
47         all: the sum of all entries in the package
48         dex: the sum of all "*.dex" entries in the package
49 HERE
50     exit 1
51 }
52
53 if [ $# -lt 1 ]
54 then
55     usage
56 fi
57
58 UNAME=`uname`
59 if [ "x$UNAME" = "xDarwin" ]
60 then
61     statArgs="-f %z"
62 elif [ "x$UNAME" = "xLinux" ]
63 then
64     statArgs="-c %s"
65 else
66     fail "Unknown uname $UNAME"
67 fi
68
69 function printFileSize ()
70 {
71     stat $statArgs $1
72 }
73
74 for file
75 do
76     if [ ! -f "$file" ]
77     then
78         fail "$file doesn't exist or isn't a file"
79     fi
80     unzip -lv "$file" | awk '
81         BEGIN {
82           total_compressed = 0;
83           total_uncompressed = 0;
84           dex_compressed = 0;
85           dex_uncompressed = 0;
86         }
87
88         # Make sure the output of unzip -lv looks like something we expect.
89         #
90         NR == "1" {
91             if ($1 != "Archive:") {
92                 print "'$PROGNAME': ERROR: Unexpected zip listing format" > \
93                         "/dev/stderr";
94                 print "'$PROGNAME': ERROR: Line 1 is \"" $0 "\"" > \
95                         "/dev/stderr";
96                 failed = 1;
97                 exit 1;
98             }
99         }
100         NR == "2" {
101             if (NF != "8" ||
102                 $1 != "Length" ||
103                 $2 != "Method" ||
104                 $3 != "Size" ||
105                 ($4 != "Ratio" && $4 != "Cmpr") ||
106                 $5 != "Date" ||
107                 $6 != "Time" ||
108                 $7 != "CRC-32" ||
109                 $8 != "Name")
110             {
111                 print "'$PROGNAME': ERROR: Unexpected zip listing format" > \
112                         "/dev/stderr";
113                 print "'$PROGNAME': ERROR: Line 2 is \"" $0 "\"" > \
114                         "/dev/stderr";
115                 failed = 1;
116                 exit 1;
117             } else {
118                 saw_listing = 1;
119             }
120         }
121
122         # Only look for lines where the ratio is the fourth column;
123         # this filters out the header and footer.
124         #
125         $4 ~ /%$/ {
126             uncompressed = $1;
127             compressed = $3;
128             if ($0 ~ /.dex$/) {
129                 dex_compressed += compressed;
130                 dex_uncompressed += uncompressed;
131             }
132             total_compressed += compressed;
133             total_uncompressed += uncompressed;
134         }
135         { next }
136
137         END {
138             if (!failed && saw_listing) {
139                 print "filesize='$(printFileSize "$file")'",
140                       "all=" total_compressed "/" total_uncompressed,
141                       "dex=" dex_compressed "/" dex_uncompressed,
142                       "name=\"'"$file"'\"";
143             } else {
144                 exit 1;
145             }
146         }
147     '
148     if [ $? -ne 0 ]
149     then
150         fail "Could not get stats for $file"
151     fi
152 done