OSDN Git Service

CherryPick 15fa2c from master. do not merge.
authorXavier Ducrohet <xav@android.com>
Fri, 23 Sep 2011 02:14:22 +0000 (19:14 -0700)
committerXavier Ducrohet <xav@android.com>
Fri, 23 Sep 2011 18:37:24 +0000 (11:37 -0700)
Make the zip align ant step check timestamp on intput/output.

If the output is more recent than the input, zipalign does nothing.

Change-Id: I51146f0da9697e8f8bfc19e4d6bea80006f101b5

anttasks/src/com/android/ant/ZipAlignTask.java [new file with mode: 0644]
files/ant/build.xml

diff --git a/anttasks/src/com/android/ant/ZipAlignTask.java b/anttasks/src/com/android/ant/ZipAlignTask.java
new file mode 100644 (file)
index 0000000..37bdc18
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+package com.android.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.ExecTask;
+import org.apache.tools.ant.types.Path;
+
+import java.io.File;
+
+public class ZipAlignTask extends Task {
+
+    private String mExecutable;
+    private String mInput;
+    private String mOutput;
+    private int mAlign = 4;
+    private boolean mVerbose = false;
+
+    /**
+     * Sets the value of the "executable" attribute.
+     * @param executable the value.
+     */
+    public void setExecutable(Path executable) {
+        mExecutable = TaskHelper.checkSinglePath("executable", executable);
+    }
+
+    public void setInput(Path inputPath) {
+        mInput = TaskHelper.checkSinglePath("input", inputPath);
+    }
+
+    public void setOutput(Path outputPath) {
+        mOutput = TaskHelper.checkSinglePath("output", outputPath);
+    }
+
+    public void setAlign(int align) {
+        mAlign = align;
+    }
+
+    public void setVerbose(boolean verbose) {
+        mVerbose = verbose;
+    }
+
+    @Override
+    public void execute() throws BuildException {
+        if (mExecutable == null) {
+            throw new BuildException("Missing attribute executable");
+        }
+        if (mInput == null) {
+            throw new BuildException("Missing attribute input");
+        }
+        if (mOutput == null) {
+            throw new BuildException("Missing attribute output");
+        }
+
+        // check if there's a need for the task to run.
+        File outputFile = new File(mOutput);
+        if (outputFile.isFile()) {
+            File inputFile = new File(mInput);
+            if (outputFile.lastModified() >= inputFile.lastModified()) {
+                System.out.println("No changes. No need to run zip-align on the apk.");
+                return;
+            }
+        }
+
+        System.out.println("Running zip align on final apk...");
+        doZipAlign();
+    }
+
+    private void doZipAlign() {
+        ExecTask task = new ExecTask();
+        task.setExecutable(mExecutable);
+        task.setFailonerror(true);
+        task.setProject(getProject());
+        task.setOwningTarget(getOwningTarget());
+
+        task.setTaskName("zip-align");
+
+        // force overwrite of existing output file
+        task.createArg().setValue("-f");
+
+        // verbose flag
+        if (mVerbose) {
+            task.createArg().setValue("-v");
+        }
+
+        // align value
+        task.createArg().setValue(Integer.toString(mAlign));
+
+        // input
+        task.createArg().setValue(mInput);
+
+        // output
+        task.createArg().setValue(mOutput);
+
+        // execute
+        task.execute();
+    }
+}
index 42e7420..9387ff2 100644 (file)
             classname="com.android.ant.ApkBuilderTask"
             classpathref="android.antlibs" />
 
+    <taskdef name="zipalign"
+            classname="com.android.ant.ZipAlignTask"
+            classpathref="android.antlibs" />
+
     <taskdef name="xpath"
             classname="com.android.ant.XPathTask"
             classpathref="android.antlibs" />
     <condition property="verbosity" value="verbose" else="quiet">
         <istrue value="${verbose}" />
     </condition>
-    <!-- This is needed to switch verbosity of zipalign. Depends exclusively on 'verbose'
-         -->
-    <condition property="v.option" value="-v" else="">
-        <istrue value="${verbose}" />
-    </condition>
 
     <!-- properties for signing in release mode -->
     <condition property="has.keystore">
         <attribute name="in.package" />
         <attribute name="out.package" />
         <sequential>
-            <echo>Running zip align on final apk...</echo>
-            <exec executable="${zipalign}" failonerror="true">
-                <arg line="${v.option}" />
-                <arg value="-f" />
-                <arg value="4" />
-                <arg path="@{in.package}" />
-                <arg path="@{out.package}" />
-            </exec>
+            <zipalign
+                    executable="${zipalign}"
+                    input="@{in.package}"
+                    output="@{out.package}"
+                    verbose="${verbose}" />
         </sequential>
     </macrodef>