blob: c07baffe0b54fc2d41a091966221d5b95be52845 [file] [log] [blame]
/*
* 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.tools.layoutlib.create;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Log log = new Log();
ArrayList<String> osJarPath = new ArrayList<String>();
String[] osDestJar = { null };
if (!processArgs(log, args, osJarPath, osDestJar)) {
log.error("Usage: layoutlib_create [-v] output.jar input.jar ...");
System.exit(1);
}
log.info("Output: %1$s", osDestJar[0]);
for (String path : osJarPath) {
log.info("Input : %1$s", path);
}
try {
AsmGenerator agen = new AsmGenerator(log, osDestJar[0],
new Class<?>[] { // classes to inject in the final JAR
OverrideMethod.class,
MethodListener.class,
MethodAdapter.class
},
new String[] { // methods to force override
"android.view.View#isInEditMode",
"android.content.res.Resources$Theme#obtainStyledAttributes",
},
new String[] { // classes to rename (so that we can replace them in layoutlib)
// original-platform-class-name ======> renamed-class-name
"android.graphics.Matrix", "android.graphics._Original_Matrix",
"android.graphics.Paint", "android.graphics._Original_Paint",
"android.graphics.Typeface", "android.graphics._Original_Typeface",
"android.graphics.Bitmap", "android.graphics._Original_Bitmap",
"android.graphics.Path", "android.graphics._Original_Path",
"android.graphics.PorterDuffXfermode", "android.graphics._Original_PorterDuffXfermode",
"android.graphics.Shader", "android.graphics._Original_Shader",
"android.graphics.LinearGradient", "android.graphics._Original_LinearGradient",
"android.graphics.BitmapShader", "android.graphics._Original_BitmapShader",
"android.graphics.ComposeShader", "android.graphics._Original_ComposeShader",
"android.graphics.RadialGradient", "android.graphics._Original_RadialGradient",
"android.graphics.SweepGradient", "android.graphics._Original_SweepGradient",
"android.os.ServiceManager", "android.os._Original_ServiceManager",
"android.util.FloatMath", "android.util._Original_FloatMath",
"android.view.SurfaceView", "android.view._Original_SurfaceView",
"android.view.accessibility.AccessibilityManager", "android.view.accessibility._Original_AccessibilityManager",
},
new String[] { // methods deleted from their return type.
"android.graphics.Paint", // class to delete method from
"android.graphics.Paint$Align", // list of type identifying methods to delete
"android.graphics.Paint$Style",
"android.graphics.Paint$Join",
"android.graphics.Paint$Cap",
"android.graphics.Paint$FontMetrics",
"android.graphics.Paint$FontMetricsInt",
null }
);
AsmAnalyzer aa = new AsmAnalyzer(log, osJarPath, agen,
new String[] { "android.view.View" }, // derived from
new String[] { // include classes
"android.*", // for android.R
"android.util.*",
"com.android.internal.util.*",
"android.view.*",
"android.widget.*",
"com.android.internal.widget.*",
"android.text.**",
"android.graphics.*",
"android.graphics.drawable.*",
"android.content.*",
"android.content.res.*",
"org.apache.harmony.xml.*",
"com.android.internal.R**",
"android.pim.*", // for datepicker
"android.os.*", // for android.os.Handler
});
aa.analyze();
agen.generate();
// Throw an error if any class failed to get renamed by the generator
//
// IMPORTANT: if you're building the platform and you get this error message,
// it means the renameClasses[] array in AsmGenerator needs to be updated: some
// class should have been renamed but it was not found in the input JAR files.
Set<String> notRenamed = agen.getClassesNotRenamed();
if (notRenamed.size() > 0) {
// (80-column guide below for error formatting)
// 01234567890123456789012345678901234567890123456789012345678901234567890123456789
log.error(
"ERROR when running layoutlib_create: the following classes are referenced\n" +
"by tools/layoutlib/create but were not actually found in the input JAR files.\n" +
"This may be due to some platform classes having been renamed.");
for (String fqcn : notRenamed) {
log.error("- Class not found: %s", fqcn.replace('/', '.'));
}
for (String path : osJarPath) {
log.info("- Input JAR : %1$s", path);
}
System.exit(1);
}
System.exit(0);
} catch (IOException e) {
log.exception(e, "Failed to load jar");
} catch (LogAbortException e) {
e.error(log);
}
System.exit(1);
}
/**
* Returns true if args where properly parsed.
* Returns false if program should exit with command-line usage.
* <p/>
* Note: the String[0] is an output parameter wrapped in an array, since there is no
* "out" parameter support.
*/
private static boolean processArgs(Log log, String[] args,
ArrayList<String> osJarPath, String[] osDestJar) {
for (int i = 0; i < args.length; i++) {
String s = args[i];
if (s.equals("-v")) {
log.setVerbose(true);
} else if (!s.startsWith("-")) {
if (osDestJar[0] == null) {
osDestJar[0] = s;
} else {
osJarPath.add(s);
}
} else {
log.error("Unknow argument: %s", s);
return false;
}
}
if (osJarPath.isEmpty()) {
log.error("Missing parameter: path to input jar");
return false;
}
if (osDestJar[0] == null) {
log.error("Missing parameter: path to output jar");
return false;
}
return true;
}
}