/*
* Copyright (C) 2008 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.apkbuilder;
import com.android.apkbuilder.internal.ApkBuilderImpl;
import java.io.FileNotFoundException;
/**
* Command line APK builder with signing support.
*/
public final class ApkBuilder {
public final static class WrongOptionException extends Exception {
private static final long serialVersionUID = 1L;
public WrongOptionException(String message) {
super(message);
}
}
public final static class ApkCreationException extends Exception {
private static final long serialVersionUID = 1L;
public ApkCreationException(String message) {
super(message);
}
public ApkCreationException(Throwable throwable) {
super(throwable);
}
}
/**
* Main method. This is meant to be called from the command line through an exec.
* <p/>WARNING: this will call {@link System#exit(int)} if anything goes wrong.
* @param args command line arguments.
*/
public static void main(String[] args) {
try {
new ApkBuilderImpl().run(args);
} catch (WrongOptionException e) {
printUsageAndQuit();
} catch (FileNotFoundException e) {
printAndExit(e.getMessage());
} catch (ApkCreationException e) {
printAndExit(e.getMessage());
}
}
/**
* API entry point similar to the {@link #main(String[])} method.
* <p/>Unlike {@link #main(String[])}, this will not call {@link System#exit(int)} and instead
* will throw exceptions.
* @param args command line arguments.
* @throws WrongOptionException if the command line arguments are incorrect.
* @throws FileNotFoundException if a required file was not found.
* @throws ApkCreationException if an error happened during the creation of the APK.
*/
public static void createApk(String[] args) throws FileNotFoundException, WrongOptionException,
ApkCreationException {
new ApkBuilderImpl().run(args);
}
private static void printUsageAndQuit() {
// 80 cols marker: 01234567890123456789012345678901234567890123456789012345678901234567890123456789
System.err.println("A command line tool to package an Android application from various sources.");
System.err.println("Usage: apkbuilder <out archive> [-v][-u][-storetype STORE_TYPE] [-z inputzip]");
System.err.println(" [-f inputfile] [-rf input-folder] [-rj -input-path]");
System.err.println("");
System.err.println(" -v Verbose.");
System.err.println(" -d Debug Mode: Includes debug files in the APK file.");
System.err.println(" -u Creates an unsigned package.");
System.err.println(" -storetype Forces the KeyStore type. If ommited the default is used.");
System.err.println("");
System.err.println(" -z Followed by the path to a zip archive.");
System.err.println(" Adds the content of the application package.");
System.err.println("");
System.err.println(" -f Followed by the path to a file.");
System.err.println(" Adds the file to the application package.");
System.err.println("");
System.err.println(" -rf Followed by the path to a source folder.");
System.err.println(" Adds the java resources found in that folder to the application");
System.err.println(" package, while keeping their path relative to the source folder.");
System.err.println("");
System.err.println(" -rj Followed by the path to a jar file or a folder containing");
System.err.println(" jar files.");
System.err.println(" Adds the java resources found in the jar file(s) to the application");
System.err.println(" package.");
System.err.println("");
System.err.println(" -nf Followed by the root folder containing native libraries to");
System.err.println(" include in the application package.");
System.exit(1);
}
private static void printAndExit(String... messages) {
for (String message : messages) {
System.err.println(message);
}
System.exit(1);
}
}