diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2014-11-14 09:38:56 +0100 |
---|---|---|
committer | mikaelpeltier <mikaelpeltier@google.com> | 2014-11-17 17:27:54 +0100 |
commit | 2f5cdf7f3f2fcf407c6c46c2d55498728da0453b (patch) | |
tree | b1af6d4cfc2d37b3e073abcce0af44dfc26e12c8 | |
parent | 1cf6a3899617f508ed1b476d2eeb8464fa86e158 (diff) | |
download | toolchain_jack-2f5cdf7f3f2fcf407c6c46c2d55498728da0453b.zip toolchain_jack-2f5cdf7f3f2fcf407c6c46c2d55498728da0453b.tar.gz toolchain_jack-2f5cdf7f3f2fcf407c6c46c2d55498728da0453b.tar.bz2 |
Jack generates lib version 1.1
- All jayce files are into a folder jayce
- All intermediates dex files are into a folder dex
- All .jpp files are into a folder jpp
- All resource files are into a folder rsc
- Disable usage of dex from library when jarjar and obfuscation is enabled
Change-Id: Id0f92b4519953a0bc41c76a55700a2c6f6ce5ec3
47 files changed, 798 insertions, 436 deletions
diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest.java b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/IrrelevantForTest.java index 509cb43..a25e9e8 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest.java +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/IrrelevantForTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.jack.fileconflict.test002.jack; +package com.android.jack.fileconflict.test002.jack.lib1; /** * This class is irrelevant for the test, since what we test here is the handling of resources. diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource1 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1 index b98ccd9..b98ccd9 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource1 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource2 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2 index 1bcdbc0..1bcdbc0 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource2 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest2.java b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/IrrelevantForTest2.java index abfbf29..b44d31a 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest2.java +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/IrrelevantForTest2.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.jack.fileconflict.test002.jack; +package com.android.jack.fileconflict.test002.jack.lib2; /** * This class is irrelevant for the test, since what we test here is the handling of resources. diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource1 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1 index b98ccd9..b98ccd9 100644 --- a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource1 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1 diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource3 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3 index d0da24e..d0da24e 100644 --- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource3 +++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3 diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource1 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource1 new file mode 100644 index 0000000..b98ccd9 --- /dev/null +++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource1 @@ -0,0 +1 @@ +Res1 diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource2 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource2 index 1bcdbc0..1bcdbc0 100644 --- a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource2 +++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource2 diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource3 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource3 index d0da24e..d0da24e 100644 --- a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource3 +++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource3 diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource4 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource4 index cf38257..cf38257 100644 --- a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource4 +++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource4 diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java index 5fcd0fd..50419a4 100644 --- a/jack/src/com/android/jack/Jack.java +++ b/jack/src/com/android/jack/Jack.java @@ -85,6 +85,7 @@ import com.android.jack.ir.sourceinfo.SourceInfoCreation; import com.android.jack.jayce.JaycePackageLoader; import com.android.jack.library.FileType; import com.android.jack.library.InputJackLibrary; +import com.android.jack.library.InputLibrary; import com.android.jack.library.JackLibraryFactory; import com.android.jack.library.LibraryReadingException; import com.android.jack.library.LibraryWritingException; @@ -103,6 +104,7 @@ import com.android.jack.optimizations.UseDefsChainsSimplifier; import com.android.jack.preprocessor.PreProcessor; import com.android.jack.preprocessor.PreProcessorApplier; import com.android.jack.reporting.Reporter.Severity; +import com.android.jack.resource.LibraryResourceWriter; import com.android.jack.resource.ResourceImporter; import com.android.jack.resource.ResourceReadingException; import com.android.jack.scheduling.adapter.ExcludeTypeFromLibAdapter; @@ -530,6 +532,9 @@ public abstract class Jack { if (options.ecjArguments == null) { request.addInitialTagsOrMarkers(getJackFormatInitialTagSet()); + if (config.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) { + request.addInitialTagsOrMarkers(getJavaSourceInitialTagSet()); + } } else { request.addInitialTagsOrMarkers(getJavaSourceInitialTagSet()); if (config.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) { @@ -577,7 +582,8 @@ public abstract class Jack { planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); typePlan.append(JayceSingleTypeWriter.class); } - } else if (options.ecjArguments == null) { + } else if (options.ecjArguments == null + && !targetProduction.contains(JayceFormatProduct.class)) { assert targetProduction.contains(DexFileProduct.class); fillJayceToDexPlan(options, planBuilder); planBuilder.append(DexFileWriter.class); @@ -591,7 +597,12 @@ public abstract class Jack { } if (features.contains(Resources.class)) { - planBuilder.append(ResourceWriter.class); + if (targetProduction.contains(DexFileProduct.class)) { + planBuilder.append(ResourceWriter.class); + } + if (targetProduction.contains(JayceFormatProduct.class)) { + planBuilder.append(LibraryResourceWriter.class); + } } Plan<JSession> plan; @@ -796,7 +807,7 @@ public abstract class Jack { JaycePackageLoader rootPLoader = factory.create(inputJackLibrary, session.getPhantomLookup()); session.getTopLevelPackage().addLoader(rootPLoader); - session.addImportSource(vDir); + session.addImportedLibrary(inputJackLibrary); } catch (IOException ioException) { throw new LibraryReadingException(ioException); } catch (LibraryException libException) { @@ -814,10 +825,11 @@ public abstract class Jack { for (final File jackFile : jackFiles) { try { InputRootVDir vDir = wrapAsVDir(jackFile, hooks); + InputJackLibrary inputJackLibrary = JackLibraryFactory.getInputLibrary(vDir); JaycePackageLoader rootPLoader = - factory.create(JackLibraryFactory.getInputLibrary(vDir), session.getPhantomLookup()); + factory.create(inputJackLibrary, session.getPhantomLookup()); session.getTopLevelPackage().addLoader(rootPLoader); - session.addClasspathSource(vDir); + session.addLibraryOnClasspath(inputJackLibrary); } catch (IOException ioException) { // Ignore bad entry logger.log(Level.WARNING, "Bad classpath entry ignored: {0}", ioException.getMessage()); @@ -990,6 +1002,20 @@ public abstract class Jack { ProductionSet productions = planBuilder.getRequest().getTargetProductions(); boolean hasSanityChecks = features.contains(SanityChecks.class); + // TODO(jack-team): Remove this hack + boolean preDexing = !getSession().getImportedLibraries().isEmpty(); + for (InputLibrary il : getSession().getImportedLibraries()) { + if (!il.containsFileType(FileType.DEX)) { + preDexing = false; + } + } + if (features.contains(Jarjar.class) || features.contains(Obfuscation.class)) { + for (InputLibrary il : getSession().getImportedLibraries()) { + ((InputJackLibrary) il).fileTypes.remove(FileType.DEX); + } + } + logger.log(Level.INFO, "Jack pre-dexing is " + (preDexing ? "enabled" : "disabled")); + // Build the plan if (hasSanityChecks) { planBuilder.append(TypeDuplicateRemoverChecker.class); @@ -1114,10 +1140,16 @@ public abstract class Jack { methodPlan3.append(FieldInitMethodCallRemover.class); } typePlan4.append(FieldInitMethodRemover.class); + } + + { + SubPlanBuilder<JDefinedClassOrInterface> typePlan = + planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); if (features.contains(JayceFileOutput.class)) { - typePlan4.append(JayceSingleTypeWriter.class); + typePlan.append(JayceSingleTypeWriter.class); } } + if (features.contains(SourceFileRenaming.class)) { planBuilder.append(SourceFileRenamer.class); } @@ -1250,8 +1282,13 @@ public abstract class Jack { if (hasSanityChecks) { typePlan5.append(TypeAstChecker.class); } + } + + { + SubPlanBuilder<JDefinedClassOrInterface> typePlan = + planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); if (productions.contains(IntermediateDexProduct.class)) { - typePlan5.append(IntermediateDexPerTypeWriter.class); + typePlan.append(IntermediateDexPerTypeWriter.class); } } @@ -1644,7 +1681,14 @@ public abstract class Jack { if (hasSanityChecks) { typePlan5.append(TypeAstChecker.class); } - typePlan5.append(IntermediateDexPerTypeWriter.class); + } + + { + SubPlanBuilder<JDefinedClassOrInterface> typePlan = + planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); + if (productions.contains(IntermediateDexProduct.class)) { + typePlan.append(IntermediateDexPerTypeWriter.class); + } } if (hasSanityChecks) { diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java index d225e1e..4c9f571 100644 --- a/jack/src/com/android/jack/Options.java +++ b/jack/src/com/android/jack/Options.java @@ -217,10 +217,6 @@ public class Options { @Option(name = "--output-jack", usage = "output jack library file", metaVar = "FILE") protected File libraryOutZip = null; - @Option(name = "--generate-intermediate-dexes", - usage = "generate intermediate dex files per types along with jayce files") - protected boolean generateIntermediateDex = false; - @Option(name = "--config-jarjar", usage = "use this jarjar rules file (default: none)", metaVar = "FILE") protected File jarjarRulesFile = null; @@ -602,18 +598,14 @@ public class Options { configBuilder.setString(LIBRARY_OUTPUT_ZIP, libraryOutZip.getAbsolutePath()); configBuilder.set(LIBRARY_OUTPUT_CONTAINER_TYPE, Container.ZIP); configBuilder.set(GENERATE_JACK_LIBRARY, true); - if (generateIntermediateDex) { - configBuilder.set(GENERATE_INTERMEDIATE_DEX, true); - configBuilder.set(INTERMEDIATE_DEX_DIR, null); - } + configBuilder.set(GENERATE_INTERMEDIATE_DEX, true); + configBuilder.set(INTERMEDIATE_DEX_DIR, null); } else if (libraryOutDir != null) { configBuilder.setString(LIBRARY_OUTPUT_DIR, libraryOutDir.getAbsolutePath()); configBuilder.set(LIBRARY_OUTPUT_CONTAINER_TYPE, Container.DIR); configBuilder.set(GENERATE_JACK_LIBRARY, true); - if (generateIntermediateDex) { - configBuilder.set(GENERATE_INTERMEDIATE_DEX, true); - configBuilder.set(INTERMEDIATE_DEX_DIR, null); - } + configBuilder.set(GENERATE_INTERMEDIATE_DEX, true); + configBuilder.set(INTERMEDIATE_DEX_DIR, null); } switch (multiDexKind) { @@ -635,13 +627,17 @@ public class Options { configBuilder.set(DEX_OUTPUT_CONTAINER_TYPE, Container.ZIP); configBuilder.set(GENERATE_DEX_FILE, true); configBuilder.set(GENERATE_INTERMEDIATE_DEX, true); - configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks))); + if (libraryOutZip == null && libraryOutDir == null) { + configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks))); + } } else if (out != null) { configBuilder.setString(DEX_OUTPUT_DIR, out.getAbsolutePath()); configBuilder.set(DEX_OUTPUT_CONTAINER_TYPE, Container.DIR); configBuilder.set(GENERATE_DEX_FILE, true); configBuilder.set(GENERATE_INTERMEDIATE_DEX, true); - configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks))); + if (libraryOutZip == null && libraryOutDir == null) { + configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks))); + } } configBuilder.set(FieldInitializerRemover.CLASS_AS_INITIALVALUE, !dxLegacy); configBuilder.set( @@ -868,6 +864,10 @@ public class Options { return !disableAutomaticFullRebuild; } + public void addResource(@Nonnull File resource) { + resImport.add(resource); + } + @Nonnull private static Directory createTempDirForTypeDexFiles( @Nonnull RunnableHooks hooks) { diff --git a/jack/src/com/android/jack/backend/ResourceWriter.java b/jack/src/com/android/jack/backend/ResourceWriter.java index 921e704..73205b1 100644 --- a/jack/src/com/android/jack/backend/ResourceWriter.java +++ b/jack/src/com/android/jack/backend/ResourceWriter.java @@ -50,21 +50,12 @@ public class ResourceWriter implements RunnableSchedulable<JSession> { private final OutputVDir outputVDir; { - if (ThreadConfig.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) { - Container containerType = ThreadConfig.get(Options.LIBRARY_OUTPUT_CONTAINER_TYPE); - if (containerType == Container.DIR) { - outputVDir = ThreadConfig.get(Options.LIBRARY_OUTPUT_DIR); - } else { - outputVDir = ThreadConfig.get(Options.LIBRARY_OUTPUT_ZIP); - } + assert ThreadConfig.get(Options.GENERATE_DEX_FILE).booleanValue(); + Container containerType = ThreadConfig.get(Options.DEX_OUTPUT_CONTAINER_TYPE); + if (containerType == Container.DIR) { + outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_DIR); } else { - assert ThreadConfig.get(Options.GENERATE_DEX_FILE).booleanValue(); - Container containerType = ThreadConfig.get(Options.DEX_OUTPUT_CONTAINER_TYPE); - if (containerType == Container.DIR) { - outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_DIR); - } else { - outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_ZIP); - } + outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_ZIP); } } diff --git a/jack/src/com/android/jack/backend/dex/DexWritingTool.java b/jack/src/com/android/jack/backend/dex/DexWritingTool.java index a6a0fb1..96379c5 100644 --- a/jack/src/com/android/jack/backend/dex/DexWritingTool.java +++ b/jack/src/com/android/jack/backend/dex/DexWritingTool.java @@ -26,9 +26,8 @@ import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; import com.android.jack.library.FileType; import com.android.jack.library.FileTypeDoesNotExistException; -import com.android.jack.library.InputLibrary; import com.android.jack.library.LibraryFormatException; -import com.android.jack.library.TypeInInputLibraryLocation; +import com.android.jack.library.OutputJackLibrary; import com.android.jack.tools.merger.JackMerger; import com.android.jack.tools.merger.MergingOverflowException; import com.android.sched.util.config.ThreadConfig; @@ -36,7 +35,6 @@ import com.android.sched.util.file.CannotCreateFileException; import com.android.sched.util.file.CannotReadException; import com.android.sched.util.file.NoSuchFileException; import com.android.sched.util.file.NotFileOrDirectoryException; -import com.android.sched.util.location.Location; import com.android.sched.util.log.LoggerFactory; import com.android.sched.vfs.InputRootVDir; import com.android.sched.vfs.InputVFile; @@ -48,7 +46,6 @@ import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nonnull; @@ -124,28 +121,19 @@ public abstract class DexWritingTool { protected void fillDexLists(@Nonnull List<InputVFile> mainDexList, @Nonnull List<InputVFile> anyDexList) throws LibraryFormatException { + OutputJackLibrary jackOutputLibrary = Jack.getSession().getJackOutputLibrary(); + boolean generateLibWithDex = + jackOutputLibrary != null && jackOutputLibrary.containsFileType(FileType.DEX); + for (JDefinedClassOrInterface type : Jack.getSession().getTypesToEmit()) { try { InputVFile inputVFile; - Location loc = type.getLocation(); - if (loc instanceof TypeInInputLibraryLocation) { - InputLibrary inputLibrary = - ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary(); - if (inputLibrary.containsFileType(FileType.DEX)) { - try { - inputVFile = inputLibrary.getFile(FileType.DEX, - new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); - } catch (FileTypeDoesNotExistException e) { - logger.log(Level.SEVERE, - "Library " + inputLibrary.getLocation().getDescription() + " is invalid", - e); - throw new LibraryFormatException(inputLibrary.getLocation()); - } - } else { - inputVFile = getIntermediateDexDir().getInputVFile(DexWriter.getFilePath(type)); - } + if (generateLibWithDex) { + assert jackOutputLibrary != null; + inputVFile = jackOutputLibrary.getFile(FileType.DEX, + new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); } else { - inputVFile = getIntermediateDexDir().getInputVFile(DexWriter.getFilePath(type)); + inputVFile = getIntermediateDexFile(type); } if (type.containsMarker(MainDexMarker.class)) { @@ -153,6 +141,9 @@ public abstract class DexWritingTool { } else { anyDexList.add(inputVFile); } + } catch (FileTypeDoesNotExistException e) { + // this was created by Jack, so this should not happen + throw new AssertionError(e); } catch (NotFileOrDirectoryException e) { // this was created by Jack, so this should not happen throw new AssertionError(e); @@ -162,4 +153,21 @@ public abstract class DexWritingTool { } } } + + @Nonnull + private InputVFile getIntermediateDexFile(@Nonnull JDefinedClassOrInterface type) + throws NotFileOrDirectoryException, NoSuchFileException, FileTypeDoesNotExistException { + InputVFile inputVFile = null; + + // Intermediate dex files can be located into the intermediate dex dir or into a library + OutputJackLibrary jackOutputLibrary = Jack.getSession().getJackOutputLibrary(); + if (jackOutputLibrary != null && jackOutputLibrary.containsFileType(FileType.DEX)) { + inputVFile = jackOutputLibrary.getFile(FileType.DEX, + new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); + } else { + inputVFile = getIntermediateDexDir().getInputVFile(DexWriter.getFilePath(type)); + } + + return inputVFile; + } } diff --git a/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java b/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java index 1a9690e..b53effb 100644 --- a/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java +++ b/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java @@ -26,6 +26,8 @@ import com.android.jack.experimental.incremental.JackIncremental; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; +import com.android.jack.library.InputLibrary; import com.android.jack.library.OutputLibrary; import com.android.jack.library.TypeInInputLibraryLocation; import com.android.jack.scheduling.marker.ClassDefItemMarker; @@ -35,11 +37,15 @@ import com.android.sched.schedulable.Constraint; import com.android.sched.schedulable.Produce; import com.android.sched.schedulable.RunnableSchedulable; import com.android.sched.util.config.ThreadConfig; +import com.android.sched.util.location.Location; +import com.android.sched.util.stream.ByteStreamSucker; import com.android.sched.vfs.InputOutputVDir; +import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.OutputVFile; import com.android.sched.vfs.VPath; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import javax.annotation.CheckForNull; @@ -70,9 +76,43 @@ public class IntermediateDexPerTypeWriter extends DexWriter implements @Override public void run(@Nonnull JDefinedClassOrInterface type) throws Exception { - assert !(type.getLocation() instanceof TypeInInputLibraryLocation - && ((TypeInInputLibraryLocation) type.getLocation()).getInputLibraryLocation() - .getInputLibrary().containsFileType(FileType.DEX)); + OutputVFile vFile; + + Location loc = type.getLocation(); + if (loc instanceof TypeInInputLibraryLocation) { + InputVFile in; + InputLibrary inputLibrary = + ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary(); + if (inputLibrary.containsFileType(FileType.DEX)) { + try { + in = inputLibrary.getFile(FileType.DEX, + new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); + } catch (FileTypeDoesNotExistException e) { + // this was created by Jack, so this should not happen + throw new AssertionError(e); + } + + // incremental support will be updated and Intermediate_dex_dir usage was cleaned. + if (outputLibrary != null && !isIncrementalMode && intermediateDexDir == null) { + assert generateDexFile || intermediateDexDir == null; + vFile = outputLibrary.createFile(FileType.DEX, + new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/')); + } else { + assert intermediateDexDir != null; + vFile = intermediateDexDir.createOutputVFile(getFilePath(type)); + } + + InputStream is = in.openRead(); + OutputStream os = vFile.openWrite(); + try { + new ByteStreamSucker(is, os, true).suck(); + } finally { + is.close(); // is != null or check before + } + + return; + } + } ClassDefItemMarker cdiMarker = type.getMarker(ClassDefItemMarker.class); assert cdiMarker != null; @@ -81,7 +121,6 @@ public class IntermediateDexPerTypeWriter extends DexWriter implements options.forceJumbo = forceJumbo; DexFile typeDex = new DexFile(options); typeDex.add(cdiMarker.getClassDefItem()); - OutputVFile vFile; OutputStream outStream = null; try { // In incremental mode, intermediate dex output is managed by incremental wrapper that used diff --git a/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java b/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java index da31d4f..e2eb115 100644 --- a/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java +++ b/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java @@ -16,18 +16,12 @@ package com.android.jack.backend.dex; -import com.google.common.collect.Iterators; - import com.android.jack.Jack; -import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.library.FileType; -import com.android.jack.library.InputLibrary; import com.android.jack.library.OutputJackLibrary; -import com.android.jack.library.TypeInInputLibraryLocation; import com.android.jack.tools.merger.JackMerger; import com.android.jack.tools.merger.MergingOverflowException; import com.android.sched.util.codec.ImplementationName; -import com.android.sched.util.location.Location; import com.android.sched.vfs.InputOutputVFile; import com.android.sched.vfs.InputVDir; import com.android.sched.vfs.InputVElement; @@ -65,7 +59,6 @@ public class SingleDexWritingTool extends DexWritingTool { inputVFileIt = dexList.iterator(); } - inputVFileIt = getAllDexFilesFromLib(inputVFileIt); while (inputVFileIt.hasNext()) { try { mergeDex(merger, inputVFileIt.next()); @@ -76,26 +69,6 @@ public class SingleDexWritingTool extends DexWritingTool { finishMerge(merger, outputDex); } - private Iterator<InputVFile> getAllDexFilesFromLib(@Nonnull Iterator<InputVFile> inputVFileIt) { - Iterator<InputVFile> newInputVFileIt = inputVFileIt; - List<InputLibrary> librariesDone = new ArrayList<InputLibrary>(); - for (JDefinedClassOrInterface jdcoi : Jack.getSession().getTypesToEmit()) { - Location loc = jdcoi.getLocation(); - if (loc instanceof TypeInInputLibraryLocation) { - InputLibrary inputLibrary = - ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary(); - if (!librariesDone.contains(inputLibrary)) { - if (inputLibrary.containsFileType(FileType.DEX)) { - newInputVFileIt = - Iterators.concat(newInputVFileIt, inputLibrary.iterator(FileType.DEX)); - } - librariesDone.add(inputLibrary); - } - } - } - return (newInputVFileIt); - } - private void getAllDexFilesFromDir(@Nonnull InputVDir dexFileVDir, @Nonnull List<InputVFile> dexFiles) { for (InputVElement subFile : dexFileVDir.list()) { diff --git a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java index 698bdd4..d83c786 100644 --- a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java +++ b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java @@ -27,7 +27,6 @@ import com.android.jack.ir.ast.Resource; import com.android.jack.library.FileType; import com.android.jack.library.InputJackLibrary; import com.android.jack.library.InputLibrary; -import com.android.jack.library.JackLibrary; import com.android.jack.library.TypeInInputLibraryLocation; import com.android.jack.lookup.JLookup; import com.android.sched.util.HasDescription; @@ -35,17 +34,18 @@ import com.android.sched.util.codec.EnumCodec; import com.android.sched.util.config.HasKeyId; import com.android.sched.util.config.ThreadConfig; import com.android.sched.util.config.id.PropertyId; +import com.android.sched.util.location.FileLocation; import com.android.sched.util.location.Location; +import com.android.sched.util.location.ZipLocation; import com.android.sched.util.log.Event; import com.android.sched.util.log.LoggerFactory; import com.android.sched.util.log.Tracer; import com.android.sched.util.log.TracerFactory; import com.android.sched.vfs.InputRootVDir; -import com.android.sched.vfs.InputVDir; -import com.android.sched.vfs.InputVElement; import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; +import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -123,29 +123,42 @@ public class JayceFileImporter { for (InputJackLibrary jackLibrary : jackLibraries) { InputRootVDir libraryVDir = jackLibrary.getInputVDir(); logger.log(Level.FINE, "Importing {0}", libraryVDir.getLocation().getDescription()); - for (InputVElement subFile : libraryVDir.list()) { - importJayceFile(jackLibrary, subFile, session, ""); + Iterator<InputVFile> jayceFileIt = jackLibrary.iterator(FileType.JAYCE); + while (jayceFileIt.hasNext()) { + InputVFile jayceFile = jayceFileIt.next(); + String name = getNameFromInputVFile(jackLibrary, jayceFile, FileType.JAYCE); + addImportedTypes(session, name, jackLibrary); + } + + Iterator<InputVFile> rscFileIt = jackLibrary.iterator(FileType.RSC); + while (rscFileIt.hasNext()) { + InputVFile rscFile = rscFileIt.next(); + String name = getNameFromInputVFile(jackLibrary, rscFile, FileType.RSC); + addImportedResource(rscFile, session, name); } } } - private void importJayceFile(@Nonnull InputLibrary inputLibrary, - @Nonnull InputVElement element, @Nonnull JSession session, @Nonnull String currentPath) - throws JPackageLookupException, TypeImportConflictException, ResourceImportConflictException, - JTypeLookupException { - String path = currentPath + element.getName(); - if (element.isVDir()) { - for (InputVElement subFile : ((InputVDir) element).list()) { - importJayceFile(inputLibrary, subFile, session, path + VPATH_SEPARATOR); + // TODO(jack-team): remove this hack + @Nonnull + private String getNameFromInputVFile(@Nonnull InputJackLibrary jackLibrary, + @Nonnull InputVFile jayceFile, @Nonnull FileType fileType) { + Location loc = jayceFile.getLocation(); + String name; + if (loc instanceof ZipLocation) { + name = ((ZipLocation) jayceFile.getLocation()).getEntryName(); + if (jackLibrary.getMajorVersion() != 0) { + name = name.substring( + fileType.getVPathPrefix().split().iterator().next().length() + 1); } } else { - InputVFile file = (InputVFile) element; - if (isJackFileName(file.getName())) { - addImportedTypes(session, path, inputLibrary); - } else { - addImportedResource(file, session, path); + name = ((FileLocation) jayceFile.getLocation()).getPath(); + if (jackLibrary.getMajorVersion() != 0) { + String prefix = fileType.getVPathPrefix().split().iterator().next() + '/'; + name = name.substring(name.lastIndexOf(prefix) + prefix.length()); } } + return name; } private void addImportedTypes(@Nonnull JSession session, @Nonnull String path, @@ -189,11 +202,6 @@ public class JayceFileImporter { private void addImportedResource(@Nonnull InputVFile file, @Nonnull JSession session, @Nonnull String currentPath) throws ResourceImportConflictException { VPath path = new VPath(currentPath, VPATH_SEPARATOR); - // library.properties and dex files are not resources - if (path.equals(JackLibrary.LIBRARY_PROPERTIES_VPATH) || - currentPath.endsWith(FileType.DEX.getFileExtension())) { - return; - } Resource newResource = new Resource(path, file); for (Resource existingResource : session.getResources()) { if (existingResource.getPath().equals(path)) { diff --git a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java index ff3f82c..91c51d1 100644 --- a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java +++ b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java @@ -563,8 +563,11 @@ public class JackIncremental extends CommandLine { @Nonnull protected static File getJackFile(@Nonnull String typeName) { - return new File(jackFilesFolder, new VPath(typeName + JayceFileImporter.JAYCE_FILE_EXTENSION, - fileSeparator).getPathAsString(File.separatorChar)); + return new File(jackFilesFolder, + FileType.JAYCE.getPrefix() + + File.separatorChar + + new VPath(typeName + JayceFileImporter.JAYCE_FILE_EXTENSION, fileSeparator) + .getPathAsString(File.separatorChar)); } @Nonnull diff --git a/jack/src/com/android/jack/ir/ast/JSession.java b/jack/src/com/android/jack/ir/ast/JSession.java index e6a4575..e2d1429 100644 --- a/jack/src/com/android/jack/ir/ast/JSession.java +++ b/jack/src/com/android/jack/ir/ast/JSession.java @@ -24,6 +24,7 @@ import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.ir.sourceinfo.SourceInfoFactory; import com.android.jack.library.FileType; +import com.android.jack.library.InputLibrary; import com.android.jack.library.OutputJackLibrary; import com.android.jack.lookup.JNodeLookup; import com.android.jack.lookup.JPhantomLookup; @@ -36,7 +37,6 @@ import com.android.sched.transform.TransformRequest; import com.android.sched.util.config.ThreadConfig; import com.android.sched.util.log.Tracer; import com.android.sched.util.log.TracerFactory; -import com.android.sched.vfs.InputRootVDir; import java.util.ArrayList; import java.util.Collection; @@ -96,10 +96,10 @@ public class JSession extends JNode { private OutputJackLibrary jackOutputLibrary; @Nonnull - private final List<InputRootVDir> importSources = new ArrayList<InputRootVDir>(0); + private final List<InputLibrary> importedLibraries = new ArrayList<InputLibrary>(0); @Nonnull - private final List<InputRootVDir> classpathSources = new ArrayList<InputRootVDir>(0); + private final List<InputLibrary> librariesOnClasspath = new ArrayList<InputLibrary>(0); public JSession() { super(SourceInfo.UNKNOWN); @@ -231,28 +231,28 @@ public class JSession extends JNode { generatedBinaryKinds.add(fileType); } - public void addImportSource(@Nonnull InputRootVDir source) { - importSources.add(source); + public void addImportedLibrary(@Nonnull InputLibrary source) { + importedLibraries.add(source); } @Nonnull - public List<InputRootVDir> getImportSources() { - return Jack.getUnmodifiableCollections().getUnmodifiableList(importSources); + public List<InputLibrary> getImportedLibraries() { + return Jack.getUnmodifiableCollections().getUnmodifiableList(importedLibraries); } - public void addClasspathSource(@Nonnull InputRootVDir source) { - classpathSources.add(source); + public void addLibraryOnClasspath(@Nonnull InputLibrary source) { + librariesOnClasspath.add(source); } @Nonnull - public List<InputRootVDir> getClasspathSources() { - return Jack.getUnmodifiableCollections().getUnmodifiableList(classpathSources); + public List<InputLibrary> getLibraryOnClasspath() { + return Jack.getUnmodifiableCollections().getUnmodifiableList(librariesOnClasspath); } @Nonnull - public Iterator<InputRootVDir> getPathSources() { + public Iterator<InputLibrary> getPathSources() { return Iterators.concat( - importSources.iterator(), - classpathSources.iterator()); + importedLibraries.iterator(), + librariesOnClasspath.iterator()); } } diff --git a/jack/src/com/android/jack/jayce/FullPackageLoader.java b/jack/src/com/android/jack/jayce/FullPackageLoader.java index 5535427..cf3775e 100644 --- a/jack/src/com/android/jack/jayce/FullPackageLoader.java +++ b/jack/src/com/android/jack/jayce/FullPackageLoader.java @@ -27,6 +27,6 @@ class FullPackageLoader extends JaycePackageLoader { public FullPackageLoader(@Nonnull InputJackLibrary inputJackLibrary, @Nonnull JPhantomLookup lookup) { - super(inputJackLibrary, inputJackLibrary.getInputVDir(), lookup, NodeLevel.FULL); + super(inputJackLibrary, null, lookup, NodeLevel.FULL); } } diff --git a/jack/src/com/android/jack/jayce/JaycePackageLoader.java b/jack/src/com/android/jack/jayce/JaycePackageLoader.java index 4505002..3c22e82 100644 --- a/jack/src/com/android/jack/jayce/JaycePackageLoader.java +++ b/jack/src/com/android/jack/jayce/JaycePackageLoader.java @@ -24,6 +24,8 @@ import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.ast.JPackage; import com.android.jack.ir.ast.JPackageLookupException; import com.android.jack.ir.ast.MissingJTypeLookupException; +import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.HasInputLibrary; import com.android.jack.library.InputJackLibrary; import com.android.jack.library.InputLibrary; @@ -33,15 +35,15 @@ import com.android.jack.lookup.JPhantomLookup; import com.android.jack.reporting.Reporter.Severity; import com.android.sched.util.location.Location; import com.android.sched.util.log.LoggerFactory; -import com.android.sched.vfs.InputVDir; import com.android.sched.vfs.InputVElement; -import com.android.sched.vfs.InputVFile; +import com.android.sched.vfs.VPath; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Logger; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; /** @@ -52,8 +54,8 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary { @Nonnull private static Logger logger = LoggerFactory.getLogger(); - @Nonnull - private final InputVDir dir; + @CheckForNull + private final VPath packagePath; @Nonnull private final JPhantomLookup lookup; @@ -64,47 +66,49 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary { @Nonnull private final InputJackLibrary inputJackLibrary; - JaycePackageLoader(@Nonnull InputJackLibrary inputJackLibrary, @Nonnull InputVDir dir, + JaycePackageLoader(@Nonnull InputJackLibrary inputJackLibrary, @CheckForNull VPath packagePath, @Nonnull JPhantomLookup lookup, @Nonnull NodeLevel defaultLoadLevel) { + assert inputJackLibrary.containsFileType(FileType.JAYCE); this.inputJackLibrary = inputJackLibrary; - this.dir = dir; + this.packagePath = packagePath; this.lookup = lookup; this.defaultLoadLevel = defaultLoadLevel; } @Override @Nonnull - public JDefinedClassOrInterface loadClassOrInterface( - @Nonnull JPackage loading, @Nonnull String simpleName) { - for (InputVElement sub : dir.list()) { - if (!sub.isVDir() && isJackFileNameOf(sub.getName(), simpleName)) { - try { - return new JayceClassOrInterfaceLoader(inputJackLibrary, - loading, - simpleName, - (InputVFile) sub, - lookup, - defaultLoadLevel).load(); - } catch (LibraryException e) { - LibraryReadingException reportable = new LibraryReadingException(e); - Jack.getSession().getReporter().report(Severity.FATAL, reportable); - throw new JackAbortException(reportable); - } - } + public JDefinedClassOrInterface loadClassOrInterface(@Nonnull JPackage loading, + @Nonnull String simpleName) { + VPath typePath = getPathFromPackage(simpleName); + try { + return new JayceClassOrInterfaceLoader(inputJackLibrary, loading, simpleName, + inputJackLibrary.getFile(FileType.JAYCE, typePath), lookup, defaultLoadLevel).load(); + } catch (LibraryException e) { + LibraryReadingException reportable = new LibraryReadingException(e); + Jack.getSession().getReporter().report(Severity.FATAL, reportable); + throw new JackAbortException(reportable); + } catch (FileTypeDoesNotExistException e) { + throw new MissingJTypeLookupException(loading, simpleName); } - throw new MissingJTypeLookupException(loading, simpleName); } @Override @Nonnull public Collection<String> getSubClassNames(@Nonnull JPackage loading) { List<String> subs = new ArrayList<String>(); - for (InputVElement sub : dir.list()) { - String fileName = sub.getName(); - if (!sub.isVDir() && JayceFileImporter.isJackFileName(fileName)) { - subs.add( - fileName.substring(0, fileName.length() - JayceFileImporter.JACK_EXTENSION_LENGTH)); + try { + for (InputVElement sub : inputJackLibrary.getDir(FileType.JAYCE, + packagePath == null ? VPath.ROOT : packagePath).list()) { + String fileName = sub.getName(); + if (!sub.isVDir() && JayceFileImporter.isJackFileName(fileName)) { + subs.add(fileName.substring(0, fileName.length() + - JayceFileImporter.JACK_EXTENSION_LENGTH)); + } } + } catch (FileTypeDoesNotExistException e) { + // It could not append if the library contain jayce files, and because package existence is + // checked at construction + throw new AssertionError(); } return subs; } @@ -113,22 +117,32 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary { @Override public PackageLoader getLoaderForSubPackage(@Nonnull JPackage loading, @Nonnull String simpleName) throws JPackageLookupException { - for (InputVElement sub : dir.list()) { - if (sub.isVDir() && sub.getName().equals(simpleName)) { - return new JaycePackageLoader(inputJackLibrary, (InputVDir) sub, lookup, defaultLoadLevel); - } + VPath subPackagePath = getPathFromPackage(simpleName); + + try { + inputJackLibrary.getDir(FileType.JAYCE, subPackagePath); + } catch (FileTypeDoesNotExistException e) { + throw new JPackageLookupException(simpleName, loading); } - throw new JPackageLookupException(simpleName, loading); + + return new JaycePackageLoader(inputJackLibrary, subPackagePath, lookup, defaultLoadLevel); } @Nonnull @Override public Collection<String> getSubPackageNames(@Nonnull JPackage loading) { List<String> subs = new ArrayList<String>(); - for (InputVElement sub : dir.list()) { - if (sub.isVDir()) { - subs.add(sub.getName()); + try { + for (InputVElement sub : inputJackLibrary.getDir(FileType.JAYCE, + packagePath == null ? VPath.ROOT : packagePath).list()) { + if (sub.isVDir()) { + subs.add(sub.getName()); + } } + } catch (FileTypeDoesNotExistException e) { + // It could not append if the library contain jayce files, and because package existence is + // checked at construction + throw new AssertionError(); } return subs; } @@ -136,14 +150,12 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary { @Override @Nonnull public Location getLocation(@Nonnull JPackage loaded) { - return dir.getLocation(); - } - - private boolean isJackFileNameOf(@Nonnull String fileName, @Nonnull String typeName) { - return (fileName.length() > JayceFileImporter.JACK_EXTENSION_LENGTH) && (fileName.substring(0, - fileName.length() - JayceFileImporter.JACK_EXTENSION_LENGTH).equals(typeName)) && (fileName - .substring(fileName.length() - JayceFileImporter.JACK_EXTENSION_LENGTH).equalsIgnoreCase( - JayceFileImporter.JAYCE_FILE_EXTENSION)); + try { + return inputJackLibrary.getDir(FileType.JAYCE, packagePath == null ? VPath.ROOT : packagePath) + .getLocation(); + } catch (FileTypeDoesNotExistException e) { + throw new AssertionError(); + } } @Override @@ -156,4 +168,16 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary { public InputLibrary getInputLibrary() { return inputJackLibrary; } + + @Nonnull + private VPath getPathFromPackage(@Nonnull String simpleName) { + VPath typePath; + if (packagePath != null) { + typePath = packagePath.clone(); + typePath.appendPath(new VPath(simpleName, '/')); + } else { + typePath = new VPath(simpleName, '/'); + } + return typePath; + } } diff --git a/jack/src/com/android/jack/jayce/StructurePackageLoader.java b/jack/src/com/android/jack/jayce/StructurePackageLoader.java index 76995ff..d3337ac 100644 --- a/jack/src/com/android/jack/jayce/StructurePackageLoader.java +++ b/jack/src/com/android/jack/jayce/StructurePackageLoader.java @@ -27,6 +27,6 @@ class StructurePackageLoader extends JaycePackageLoader { public StructurePackageLoader(@Nonnull InputJackLibrary inputJackLibrary, @Nonnull JPhantomLookup lookup) { - super(inputJackLibrary, inputJackLibrary.getInputVDir(), lookup, NodeLevel.STRUCTURE); + super(inputJackLibrary, null, lookup, NodeLevel.STRUCTURE); } } diff --git a/jack/src/com/android/jack/library/CommonJackLibrary.java b/jack/src/com/android/jack/library/CommonJackLibrary.java index 1c48508..8010285 100644 --- a/jack/src/com/android/jack/library/CommonJackLibrary.java +++ b/jack/src/com/android/jack/library/CommonJackLibrary.java @@ -43,8 +43,9 @@ public abstract class CommonJackLibrary implements JackLibrary { @Nonnull protected final Properties libraryProperties; + // TODO(jack-team): Change it to private @Nonnull - private final Set<FileType> fileTypes = new HashSet<FileType>(2); + public final Set<FileType> fileTypes = new HashSet<FileType>(FileType.values().length); public CommonJackLibrary(@Nonnull Properties libraryProperties) { this.libraryProperties = libraryProperties; @@ -87,7 +88,7 @@ public abstract class CommonJackLibrary implements JackLibrary { protected void fillFileTypes() { for (FileType ft : FileType.values()) { try { - String propertyName = ft.getPropertyName(); + String propertyName = ft.getPropertyPrefix(); if (containsProperty(propertyName) && Boolean.parseBoolean(getProperty(propertyName))) { fileTypes.add(ft); } diff --git a/jack/src/com/android/jack/library/FileType.java b/jack/src/com/android/jack/library/FileType.java index 748cc15..041e851 100644 --- a/jack/src/com/android/jack/library/FileType.java +++ b/jack/src/com/android/jack/library/FileType.java @@ -18,7 +18,10 @@ package com.android.jack.library; import com.android.jack.backend.dex.DexProperties; import com.android.jack.jayce.JayceProperties; +import com.android.jack.preprocessor.PreprocessorProperties; +import com.android.jack.resource.ResourceProperties; import com.android.sched.vfs.InputVFile; +import com.android.sched.vfs.VPath; import javax.annotation.Nonnull; @@ -27,7 +30,7 @@ import javax.annotation.Nonnull; * File types supported by jack library. */ public enum FileType { - DEX("dex", ".dex") { + DEX("dex", DexProperties.KEY_DEX, ".dex") { @Override public String toString() { return "dex"; @@ -35,22 +38,32 @@ public enum FileType { @Override public void check() throws LibraryFormatException { } + }, + JAYCE("jayce", JayceProperties.KEY_JAYCE, ".jayce") { @Override - public String getPropertyName() { - return DexProperties.KEY_DEX; + public String toString() { + return "jayce"; + } + @Override + public void check() throws LibraryFormatException { } }, - JAYCE("jayce", ".jayce") { + JPP("jpp", PreprocessorProperties.KEY_JPP, ".jpp") { @Override public String toString() { - return "jayce"; + return "java pre-processor"; } @Override public void check() throws LibraryFormatException { } + }, + RSC("rsc", ResourceProperties.KEY_RESOURCE, "") { + @Override + public String toString() { + return "resource"; + } @Override - public String getPropertyName() { - return JayceProperties.KEY_JAYCE; + public void check() throws LibraryFormatException { } }; @@ -60,19 +73,22 @@ public enum FileType { @Nonnull private final String prefix; - private FileType(@Nonnull String prefix, @Nonnull String extension) { - this.prefix = prefix; + @Nonnull + private final VPath vpathPrefix; + + @Nonnull + private final String propertyPrefix; + + private FileType(@Nonnull String vpathPrefix, @Nonnull String propertyPrefix, + @Nonnull String extension) { + this.prefix = vpathPrefix; + this.vpathPrefix = new VPath(vpathPrefix, '/'); + this.propertyPrefix = propertyPrefix; this.extension = extension; } public abstract void check() throws LibraryFormatException; - /** - * Get the name of a boolean property that specify if a library contains this file type. - * @return The property name. - */ - public abstract String getPropertyName(); - public boolean isOfType(@Nonnull InputVFile v){ return (v.getName().endsWith(getFileExtension())); } @@ -83,6 +99,21 @@ public enum FileType { } @Nonnull + public String getPrefix() { + return prefix; + } + + @Nonnull + public String getPropertyPrefix() { + return propertyPrefix; + } + + @Nonnull + public VPath getVPathPrefix() { + return vpathPrefix; + } + + @Nonnull public static FileType getFileType(@Nonnull InputVFile v) throws UnsupportedFileTypeException { for (FileType fileType : FileType.values()) { if (fileType.isOfType(v)) { diff --git a/jack/src/com/android/jack/library/InputLibrary.java b/jack/src/com/android/jack/library/InputLibrary.java index a21f5dc..248647f 100644 --- a/jack/src/com/android/jack/library/InputLibrary.java +++ b/jack/src/com/android/jack/library/InputLibrary.java @@ -17,6 +17,7 @@ package com.android.jack.library; import com.android.sched.vfs.InputRootVDir; +import com.android.sched.vfs.InputVDir; import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; @@ -43,6 +44,10 @@ public interface InputLibrary extends Library { throws FileTypeDoesNotExistException; @Nonnull + public InputVDir getDir(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException; + + @Nonnull public Iterator<InputVFile> iterator(@Nonnull FileType fileType); @Override diff --git a/jack/src/com/android/jack/library/JackLibraryFactory.java b/jack/src/com/android/jack/library/JackLibraryFactory.java index 962c0e4..9a7c694 100644 --- a/jack/src/com/android/jack/library/JackLibraryFactory.java +++ b/jack/src/com/android/jack/library/JackLibraryFactory.java @@ -58,8 +58,8 @@ public abstract class JackLibraryFactory { InputJackLibrary inputJackLibrary = (InputJackLibrary) instantiateConstructorWithParameters( vdir, "com.android.jack.library.v" + majorVersion + ".InputJackLibraryImpl", - new Class[] {InputRootVDir.class, Properties.class}, new Object[] {vdir, libraryProperties}, - String.valueOf(majorVersion)); + new Class[] {InputRootVDir.class, Properties.class}, + new Object[] {vdir, libraryProperties}, String.valueOf(majorVersion)); return inputJackLibrary; } diff --git a/jack/src/com/android/jack/library/OutputLibrary.java b/jack/src/com/android/jack/library/OutputLibrary.java index 9741b4d..22a9af2 100644 --- a/jack/src/com/android/jack/library/OutputLibrary.java +++ b/jack/src/com/android/jack/library/OutputLibrary.java @@ -45,4 +45,8 @@ public interface OutputLibrary extends Library { @Nonnull public Iterator<InputVFile> iterator(@Nonnull FileType fileType); + + @Nonnull + public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException; } diff --git a/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java index f584b6a..9d57fec 100644 --- a/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java @@ -16,6 +16,8 @@ package com.android.jack.library.v0000; +import com.google.common.collect.Iterators; + import com.android.jack.library.FileType; import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.InputJackLibrary; @@ -27,6 +29,7 @@ import com.android.sched.util.file.NoSuchFileException; import com.android.sched.util.file.NotFileOrDirectoryException; import com.android.sched.util.log.LoggerFactory; import com.android.sched.vfs.InputRootVDir; +import com.android.sched.vfs.InputVDir; import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; @@ -97,8 +100,22 @@ public class InputJackLibraryImpl extends InputJackLibrary { public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) throws FileTypeDoesNotExistException { try { - typePath.addSuffix(fileType.getFileExtension()); - return libraryVDir.getInputVFile(typePath); + VPath clonedPath = typePath.clone(); + clonedPath.addSuffix(fileType.getFileExtension()); + return libraryVDir.getInputVFile(clonedPath); + } catch (NotFileOrDirectoryException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } catch (NoSuchFileException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } + } + + @Override + @Nonnull + public InputVDir getDir(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException { + try { + return libraryVDir.getInputVDir(typePath); } catch (NotFileOrDirectoryException e) { throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); } catch (NoSuchFileException e) { @@ -109,6 +126,10 @@ public class InputJackLibraryImpl extends InputJackLibrary { @Override @Nonnull public Iterator<InputVFile> iterator(@Nonnull FileType fileType) { + if (!containsFileType(fileType)) { + return Iterators.emptyIterator(); + } + List<InputVFile> inputVFiles = new ArrayList<InputVFile>(); fillFiles(libraryVDir, fileType, inputVFiles); return inputVFiles.iterator(); diff --git a/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java index 2e8cc4f..7799a72 100644 --- a/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java @@ -17,11 +17,14 @@ package com.android.jack.library.v0000; import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.LibraryIOException; import com.android.jack.library.OutputJackLibrary; import com.android.jack.library.OutputLibrary; import com.android.jack.library.OutputLibraryLocation; import com.android.sched.util.file.CannotCreateFileException; +import com.android.sched.util.file.NoSuchFileException; +import com.android.sched.util.file.NotFileOrDirectoryException; import com.android.sched.vfs.InputOutputVDir; import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.OutputVFile; @@ -84,7 +87,7 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { @Nonnull public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath) throws CannotCreateFileException { - putProperty(fileType.getPropertyName(), String.valueOf(true)); + putProperty(fileType.getPropertyPrefix(), String.valueOf(true)); addFileType(fileType); typePath.addSuffix(fileType.getFileExtension()); return outputVDir.createOutputVFile(typePath); @@ -130,4 +133,20 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { fillFiles(outputVDir, fileType, inputVFiles); return inputVFiles.listIterator(); } + + @Override + @Nonnull + public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException { + try { + VPath clonedPath = typePath.clone(); + clonedPath.addSuffix(fileType.getFileExtension()); + clonedPath.prependPath(fileType.getVPathPrefix()); + return outputVDir.getInputVFile(clonedPath); + } catch (NotFileOrDirectoryException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } catch (NoSuchFileException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } + } } diff --git a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java index 9625ef9..129a494 100644 --- a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java @@ -16,6 +16,8 @@ package com.android.jack.library.v0001; +import com.google.common.collect.Iterators; + import com.android.jack.library.FileType; import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.InputJackLibrary; @@ -27,6 +29,7 @@ import com.android.sched.util.file.NoSuchFileException; import com.android.sched.util.file.NotFileOrDirectoryException; import com.android.sched.util.log.LoggerFactory; import com.android.sched.vfs.InputRootVDir; +import com.android.sched.vfs.InputVDir; import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.VPath; @@ -97,8 +100,26 @@ public class InputJackLibraryImpl extends InputJackLibrary { public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) throws FileTypeDoesNotExistException { try { - typePath.addSuffix(fileType.getFileExtension()); - return libraryVDir.getInputVFile(typePath); + VPath clonedPath = typePath.clone(); + clonedPath.addSuffix(fileType.getFileExtension()); + clonedPath.prependPath(fileType.getVPathPrefix()); + return libraryVDir.getInputVFile(clonedPath); + } catch (NotFileOrDirectoryException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } catch (NoSuchFileException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } + } + + + @Override + @Nonnull + public InputVDir getDir(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException { + try { + VPath clonedPath = typePath.clone(); + clonedPath.prependPath(fileType.getVPathPrefix()); + return libraryVDir.getInputVDir(clonedPath); } catch (NotFileOrDirectoryException e) { throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); } catch (NoSuchFileException e) { @@ -109,8 +130,21 @@ public class InputJackLibraryImpl extends InputJackLibrary { @Override @Nonnull public Iterator<InputVFile> iterator(@Nonnull FileType fileType) { + if (!containsFileType(fileType)) { + return Iterators.emptyIterator(); + } + List<InputVFile> inputVFiles = new ArrayList<InputVFile>(); - fillFiles(libraryVDir, fileType, inputVFiles); + try { + fillFiles(libraryVDir.getInputVDir(fileType.getVPathPrefix()), fileType, inputVFiles); + } catch (NotFileOrDirectoryException e) { + throw new AssertionError( + getLocation().getDescription() + " is an invalid library: " + e.getMessage(), e); + } catch (NoSuchFileException e) { + throw new AssertionError( + getLocation().getDescription() + " is an invalid library: " + e.getMessage(), e); + } + return inputVFiles.listIterator(); } diff --git a/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java index a16f76a..e5beea8 100644 --- a/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java +++ b/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java @@ -17,11 +17,14 @@ package com.android.jack.library.v0001; import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; import com.android.jack.library.LibraryIOException; import com.android.jack.library.OutputJackLibrary; import com.android.jack.library.OutputLibrary; import com.android.jack.library.OutputLibraryLocation; import com.android.sched.util.file.CannotCreateFileException; +import com.android.sched.util.file.NoSuchFileException; +import com.android.sched.util.file.NotFileOrDirectoryException; import com.android.sched.vfs.InputOutputVDir; import com.android.sched.vfs.InputVFile; import com.android.sched.vfs.OutputVFile; @@ -85,9 +88,10 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { @Nonnull public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath) throws CannotCreateFileException { - putProperty(fileType.getPropertyName(), String.valueOf(true)); + putProperty(fileType.getPropertyPrefix(), String.valueOf(true)); addFileType(fileType); typePath.addSuffix(fileType.getFileExtension()); + typePath.prependPath(fileType.getVPathPrefix()); return outputVDir.createOutputVFile(typePath); } @@ -141,4 +145,20 @@ public class OutputJackLibraryImpl extends OutputJackLibrary { fillFiles(outputVDir, fileType, inputVFiles); return inputVFiles.listIterator(); } + + @Override + @Nonnull + public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath) + throws FileTypeDoesNotExistException { + try { + VPath clonedPath = typePath.clone(); + clonedPath.addSuffix(fileType.getFileExtension()); + clonedPath.prependPath(fileType.getVPathPrefix()); + return outputVDir.getInputVFile(clonedPath); + } catch (NotFileOrDirectoryException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } catch (NoSuchFileException e) { + throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType); + } + } } diff --git a/jack/src/com/android/jack/library/v0001/Version.java b/jack/src/com/android/jack/library/v0001/Version.java index 9a57ef7..c193348 100644 --- a/jack/src/com/android/jack/library/v0001/Version.java +++ b/jack/src/com/android/jack/library/v0001/Version.java @@ -21,9 +21,9 @@ package com.android.jack.library.v0001; */ public class Version { - public static final int MINOR_MIN = 0; + public static final int MINOR_MIN = 1; - public static final int MINOR = 0; + public static final int MINOR = 1; public static final int MAJOR = 1; } diff --git a/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java b/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java index c1726dc..5b15ce1 100644 --- a/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java +++ b/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java @@ -17,6 +17,8 @@ package com.android.jack.preprocessor; import com.android.jack.ir.ast.JSession; +import com.android.jack.library.FileType; +import com.android.jack.library.InputLibrary; import com.android.jack.transformations.request.TransformationRequest; import com.android.sched.item.Description; import com.android.sched.schedulable.RunnableSchedulable; @@ -24,9 +26,6 @@ import com.android.sched.schedulable.Support; import com.android.sched.util.config.ThreadConfig; import com.android.sched.util.file.InputStreamFile; import com.android.sched.util.log.LoggerFactory; -import com.android.sched.vfs.InputRootVDir; -import com.android.sched.vfs.InputVDir; -import com.android.sched.vfs.InputVElement; import com.android.sched.vfs.InputVFile; import org.antlr.runtime.ANTLRInputStream; @@ -72,25 +71,19 @@ public class PreProcessorApplier implements RunnableSchedulable<JSession> { } } - for (Iterator<InputRootVDir> iter = session.getPathSources(); iter.hasNext();) { - InputRootVDir dir = iter.next(); - for (InputVElement sub : dir.list()) { - if (sub.getName().equals("JACK-INF") && sub.isVDir()) { - for (InputVElement inf : ((InputVDir) sub).list()) { - if (inf.getName().endsWith(".jpp") && !inf.isVDir()) { - InputStream inputStream = ((InputVFile) inf).openRead(); - try { - rules.addAll(parseRules(session, inputStream)); - } finally { - try { - inputStream.close(); - } catch (IOException e) { - // nothing to handle for inputs - } - } - } + for (Iterator<InputLibrary> iter = session.getPathSources(); iter.hasNext();) { + InputLibrary inputLibrary = iter.next(); + Iterator<InputVFile> metaFileIt = inputLibrary.iterator(FileType.JPP); + while (metaFileIt.hasNext()) { + InputStream inputStream = metaFileIt.next().openRead(); + try { + rules.addAll(parseRules(session, inputStream)); + } finally { + try { + inputStream.close(); + } catch (IOException e) { + // nothing to handle for inputs } - break; } } } diff --git a/jack/src/com/android/jack/preprocessor/PreprocessorProperties.java b/jack/src/com/android/jack/preprocessor/PreprocessorProperties.java new file mode 100644 index 0000000..cef9b51 --- /dev/null +++ b/jack/src/com/android/jack/preprocessor/PreprocessorProperties.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2014 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.jack.preprocessor; + +import javax.annotation.Nonnull; + +/** + * Properties related to preprocessor. + */ +public interface PreprocessorProperties { + + @Nonnull + public static final String KEY_JPP = "jpp"; +} diff --git a/jack/src/com/android/jack/resource/LibraryResourceWriter.java b/jack/src/com/android/jack/resource/LibraryResourceWriter.java new file mode 100644 index 0000000..8930c09 --- /dev/null +++ b/jack/src/com/android/jack/resource/LibraryResourceWriter.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014 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.jack.resource; + +import com.android.jack.ir.ast.JSession; +import com.android.jack.ir.ast.Resource; +import com.android.jack.library.FileType; +import com.android.jack.library.OutputJackLibrary; +import com.android.jack.scheduling.feature.Resources; +import com.android.sched.item.Description; +import com.android.sched.item.Name; +import com.android.sched.schedulable.RunnableSchedulable; +import com.android.sched.schedulable.Support; +import com.android.sched.util.stream.ByteStreamSucker; +import com.android.sched.vfs.InputVFile; +import com.android.sched.vfs.OutputVFile; +import com.android.sched.vfs.VPath; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; + +import javax.annotation.Nonnull; + +/** + * Writer of resources. + */ +@Description("Writer of resources") +@Name("LibraryResourceWriter") +@Support(Resources.class) +public class LibraryResourceWriter implements RunnableSchedulable<JSession> { + + @Override + public void run(@Nonnull JSession session) throws Exception { + OutputJackLibrary ojl = session.getJackOutputLibrary(); + List<Resource> resources = session.getResources(); + for (Resource resource : resources) { + InputVFile inputFile = resource.getVFile(); + VPath path = resource.getPath(); + OutputVFile outputFile = ojl.createFile(FileType.RSC, path); + InputStream is = inputFile.openRead(); + OutputStream os = outputFile.openWrite(); + try { + ByteStreamSucker sucker = new ByteStreamSucker(is, os); + sucker.suck(); + } finally { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } + } + } +} diff --git a/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java b/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java index d85527e..1d64327 100644 --- a/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java +++ b/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2014 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. @@ -22,6 +22,7 @@ import com.android.sched.vfs.InputVDir; import com.android.sched.vfs.InputVElement; import com.android.sched.vfs.InputVFile; +import java.util.Collection; import java.util.List; import javax.annotation.Nonnull; @@ -42,20 +43,20 @@ public abstract class ResourceOrMetaImporter { public void doImport(@Nonnull JSession session) { for (InputVDir resourceDir : resourceDirs) { - importResourceDirElement(resourceDir, session, ""); + importResourceDirElement(resourceDir.list(), session, ""); } } - private void importResourceDirElement( - @Nonnull InputVElement element, @Nonnull JSession session, @Nonnull String currentPath) { - String path = currentPath + element.getName(); - if (element.isVDir()) { - for (InputVElement subFile : ((InputVDir) element).list()) { - importResourceDirElement(subFile, session, path + VPATH_SEPARATOR); + private void importResourceDirElement(@Nonnull Collection<? extends InputVElement> elements, + @Nonnull JSession session, @Nonnull String currentPath) { + for (InputVElement element : elements) { + String path = currentPath + element.getName(); + if (element.isVDir()) { + importResourceDirElement(((InputVDir) element).list(), session, path + VPATH_SEPARATOR); + } else { + InputVFile file = (InputVFile) element; + addImportedResource(file, session, path); } - } else { - InputVFile file = (InputVFile) element; - addImportedResource(file, session, path); } } diff --git a/jack/src/com/android/jack/resource/ResourceProperties.java b/jack/src/com/android/jack/resource/ResourceProperties.java new file mode 100644 index 0000000..4b1761d --- /dev/null +++ b/jack/src/com/android/jack/resource/ResourceProperties.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2014 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.jack.resource; + +import javax.annotation.Nonnull; + +/** + * Properties related to resources. + */ +public interface ResourceProperties { + @Nonnull + public static final String KEY_RESOURCE = "rsc"; +} diff --git a/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java b/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java index 51f004c..a1e05cf 100644 --- a/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java +++ b/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java @@ -21,6 +21,7 @@ import com.google.common.collect.Iterators; import com.android.jack.ir.ast.JDefinedClassOrInterface; import com.android.jack.ir.ast.JSession; +import com.android.jack.library.FileType; import com.android.jack.library.InputLibrary; import com.android.jack.library.TypeInInputLibraryLocation; import com.android.sched.item.Description; @@ -60,7 +61,7 @@ public class ExcludeTypeFromLibWithBinaryAdapter if (location instanceof TypeInInputLibraryLocation) { InputLibrary inputLibrary = ((TypeInInputLibraryLocation) location) .getInputLibraryLocation().getInputLibrary(); - if (inputLibrary.getFileTypes().containsAll(session.getGeneratedFileTypes())) { + if (inputLibrary.containsFileType(FileType.DEX)) { return false; } } diff --git a/jack/tests/com/android/jack/ClasspathTest.java b/jack/tests/com/android/jack/ClasspathTest.java index 324bff7..3870062 100644 --- a/jack/tests/com/android/jack/ClasspathTest.java +++ b/jack/tests/com/android/jack/ClasspathTest.java @@ -16,6 +16,8 @@ package com.android.jack; +import com.android.jack.library.FileType; + import junit.framework.Assert; import org.junit.BeforeClass; @@ -112,10 +114,10 @@ public class ClasspathTest { } { - // delete unused inner in classpath and check we can still compile with it - boolean deleted = - new File(libOut, - "com/android/jack/classpath/test003/lib/HasInnersClasses$InnerToDelete.jayce") + // delete unused inner in classpath and check we can still compile with it + boolean deleted = + new File(libOut, FileType.JAYCE.getPrefix() + + "/com/android/jack/classpath/test003/lib/HasInnersClasses$InnerToDelete.jayce") .delete(); Assert.assertTrue(deleted); File testOut = TestTools.createTempDir("ClasspathTest", "test"); diff --git a/jack/tests/com/android/jack/FileConflictTest.java b/jack/tests/com/android/jack/FileConflictTest.java index 1eb8d40..91f99fa 100644 --- a/jack/tests/com/android/jack/FileConflictTest.java +++ b/jack/tests/com/android/jack/FileConflictTest.java @@ -20,12 +20,14 @@ import com.android.jack.backend.jayce.ImportConflictException; import com.android.jack.backend.jayce.JayceFileImporter; import com.android.jack.backend.jayce.ResourceImportConflictException; import com.android.jack.category.KnownBugs; +import com.android.jack.library.FileType; import com.android.jack.library.JackLibrary; import com.android.sched.util.stream.ByteStreamSucker; import junit.framework.Assert; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -55,15 +57,29 @@ public class FileConflictTest { @Nonnull private static final String COMMON_PATH_002 = "com/android/jack/fileconflict/test002/jack/"; @Nonnull - private static final String JACK_FILE_PATH_1 = COMMON_PATH_001 + "MyClass.jayce"; + private static final String JACK_FILE_PATH_1 = + FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass.jayce"; @Nonnull - private static final String JACK_FILE_PATH_2 = COMMON_PATH_001 + "MyClass2.jayce"; + private static final String JACK_FILE_PATH_2 = + FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass2.jayce"; @Nonnull - private static final String JACK_FILE_PATH_3 = COMMON_PATH_001 + "MyClass3.jayce"; + private static final String JACK_FILE_PATH_3 = + FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass3.jayce"; @Nonnull - private static final String JACK_FILE_PATH_002_1 = COMMON_PATH_002 + "IrrelevantForTest.jayce"; + private static final String DEX_FILE_PATH_1 = + FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass.dex"; @Nonnull - private static final String JACK_FILE_PATH_002_2 = COMMON_PATH_002 + "IrrelevantForTest2.jayce"; + private static final String DEX_FILE_PATH_2 = + FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass2.dex"; + @Nonnull + private static final String DEX_FILE_PATH_3 = + FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass3.dex"; + @Nonnull + private static final String JACK_FILE_PATH_002_1 = + FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_002 + "IrrelevantForTest.jayce"; + @Nonnull + private static final String JACK_FILE_PATH_002_2 = + FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_002 + "IrrelevantForTest2.jayce"; @Nonnull private static final String RESOURCE1_SHORTPATH = "Resource1"; @Nonnull @@ -71,11 +87,14 @@ public class FileConflictTest { @Nonnull private static final String RESOURCE3_SHORTPATH = "Resource3"; @Nonnull - private static final String RESOURCE1_LONGPATH = COMMON_PATH_002 + RESOURCE1_SHORTPATH; + private static final String RESOURCE1_LONGPATH = FileType.RSC.getPrefix() + "/" + + RESOURCE1_SHORTPATH; @Nonnull - private static final String RESOURCE2_LONGPATH = COMMON_PATH_002 + RESOURCE2_SHORTPATH; + private static final String RESOURCE2_LONGPATH = FileType.RSC.getPrefix() + "/" + + RESOURCE2_SHORTPATH; @Nonnull - private static final String RESOURCE3_LONGPATH = COMMON_PATH_002 + RESOURCE3_SHORTPATH; + private static final String RESOURCE3_LONGPATH = FileType.RSC.getPrefix() + "/" + + RESOURCE3_SHORTPATH; @Nonnull private static final File TEST001_DIR = @@ -242,9 +261,15 @@ public class FileConflictTest { TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */); // get paths for Jack files - String jackFilePath = "com/android/jack/fileconflict/test003/jack/MyClass.jayce"; + String jackFilePath = + FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.jayce"; File myClass1 = new File(tempJackFolder, jackFilePath); + // get paths for Dex files + String dexFilePath = + FileType.DEX.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.dex"; + File myClass1Dex = new File(tempJackFolder, dexFilePath); + String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); File libProperties = new File(tempJackFolder, libPropName); @@ -252,9 +277,11 @@ public class FileConflictTest { File jackImport1 = TestTools.createTempDir("jackimport1", "dir"); copyFileToDir(libProperties, libPropName, jackImport1); copyFileToDir(myClass1, jackFilePath, jackImport1); + copyFileToDir(myClass1Dex, dexFilePath, jackImport1); // copy Jack file to output dir copyFileToDir(myClass1, jackFilePath, jackOutput); + copyFileToDir(myClass1Dex, dexFilePath, jackOutput); // run Jack on Jack dir ProguardFlags flags = new ProguardFlags(new File(testSrcDir, "proguard.flags")); @@ -272,6 +299,7 @@ public class FileConflictTest { * @throws Exception */ @Test + @Ignore("Now jack generate library, a previous file can not exists") public void test003b() throws Exception { File jackOutput = TestTools.createTempDir("jackoutput", "dir"); @@ -282,7 +310,8 @@ public class FileConflictTest { TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */); // get paths for Jack files - String jackFilePath = "com/android/jack/fileconflict/test003/jack/MyClass.jayce"; + String jackFilePath = + FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.jayce"; File myClass1 = new File(tempJackFolder, jackFilePath); String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); @@ -329,7 +358,8 @@ public class FileConflictTest { TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */); // get paths for Jack files - String jackFilePath = "com/android/jack/fileconflict/test004/jack/MyClass.jayce"; + String jackFilePath = + FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test004/jack/MyClass.jayce"; File myClass1 = new File(tempJackFolder, jackFilePath); String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); @@ -374,6 +404,10 @@ public class FileConflictTest { File myClass2 = new File(tempJackFolder, JACK_FILE_PATH_2); File myClass3 = new File(tempJackFolder, JACK_FILE_PATH_3); + // get paths for dex files + File myClass1Dex = new File(tempJackFolder, DEX_FILE_PATH_1); + File myClass2Dex = new File(tempJackFolder, DEX_FILE_PATH_2); + File myClass3Dex = new File(tempJackFolder, DEX_FILE_PATH_3); String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); File libProperties = new File(tempJackFolder, libPropName); @@ -383,10 +417,14 @@ public class FileConflictTest { File jackImport2 = TestTools.createTempDir("jackimport2", "dir"); copyFileToDir(libProperties, libPropName, jackImport1); copyFileToDir(myClass1, JACK_FILE_PATH_1, jackImport1); + copyFileToDir(myClass1Dex, DEX_FILE_PATH_1, jackImport1); copyFileToDir(myClass2, JACK_FILE_PATH_2, jackImport1); + copyFileToDir(myClass2Dex, DEX_FILE_PATH_2, jackImport1); copyFileToDir(libProperties, libPropName, jackImport2); copyFileToDir(myClass1, JACK_FILE_PATH_1, jackImport2); + copyFileToDir(myClass1Dex, DEX_FILE_PATH_1, jackImport2); copyFileToDir(myClass3, JACK_FILE_PATH_3, jackImport2); + copyFileToDir(myClass3Dex, DEX_FILE_PATH_3, jackImport2); // run Jack on Jack dirs ProguardFlags flags = new ProguardFlags(new File(TEST001_DIR, "proguard.flags")); @@ -406,37 +444,23 @@ public class FileConflictTest { private void runTest002(@Nonnull File jackOutput, boolean zip, @CheckForNull String collisionPolicy) throws Exception { // compile source files to a Jack dir - File tempJackFolder = TestTools.createTempDir("jack", "dir"); - TestTools.compileSourceToJack(new Options(), TEST002_DIR, - TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */); - - // get paths for Jack files - File myClass1 = new File(tempJackFolder, JACK_FILE_PATH_002_1); - File myClass2 = new File(tempJackFolder, JACK_FILE_PATH_002_2); - - // get paths for resources - File resource1 = new File(TEST002_DIR, RESOURCE1_SHORTPATH); - File resource2 = new File(TEST002_DIR, RESOURCE2_SHORTPATH); - File resource3 = new File(TEST002_DIR, RESOURCE3_SHORTPATH); - - String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); - File libProperties = new File(tempJackFolder, libPropName); - - // create Jack dirs to import - File jackImport1 = TestTools.createTempDir("jackimport1", "dir"); - File jackImport2 = TestTools.createTempDir("jackimport2", "dir"); - copyFileToDir(libProperties, libPropName, jackImport1); - copyFileToDir(myClass1, JACK_FILE_PATH_002_1, jackImport1); - copyFileToDir(resource1, RESOURCE1_LONGPATH, jackImport1); - copyFileToDir(resource2, RESOURCE2_LONGPATH, jackImport1); - copyFileToDir(libProperties, libPropName, jackImport2); - copyFileToDir(myClass2, JACK_FILE_PATH_002_2, jackImport2); - copyFileToDir(resource2, RESOURCE1_LONGPATH, jackImport2); - copyFileToDir(resource3, RESOURCE3_LONGPATH, jackImport2); + File jackImport1 = TestTools.createTempDir("jack", "dir"); + Options options = new Options(); + File lib1 = new File(TEST002_DIR, "lib1"); + options.addResource(new File(lib1, "rsc")); + TestTools.compileSourceToJack(options, lib1, TestTools.getDefaultBootclasspathString(), + jackImport1, false /* non-zipped */); + + File jackImport2 = TestTools.createTempDir("jack", "dir"); + options = new Options(); + File lib2 = new File(TEST002_DIR, "lib2"); + options.addResource(new File(lib2, "rsc")); + TestTools.compileSourceToJack(options, lib2, TestTools.getDefaultBootclasspathString(), + jackImport2, false /* non-zipped */); // run Jack on Jack dirs ProguardFlags flags = new ProguardFlags(new File(TEST002_DIR, "proguard.flags")); - Options options = new Options(); + options = new Options(); List<File> jayceImports = new ArrayList<File>(2); jayceImports.add(jackImport1); jayceImports.add(jackImport2); diff --git a/jack/tests/com/android/jack/ResourceTest.java b/jack/tests/com/android/jack/ResourceTest.java index 1543542..b42ae80 100644 --- a/jack/tests/com/android/jack/ResourceTest.java +++ b/jack/tests/com/android/jack/ResourceTest.java @@ -17,7 +17,7 @@ package com.android.jack; import com.android.jack.category.KnownBugs; -import com.android.jack.library.JackLibrary; +import com.android.jack.library.FileType; import com.android.sched.util.stream.ByteStreamSucker; import junit.framework.Assert; @@ -37,7 +37,6 @@ import java.io.StringReader; import java.util.Collections; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import java.util.zip.ZipOutputStream; import javax.annotation.Nonnull; @@ -49,7 +48,11 @@ public class ResourceTest { @Nonnull private static final String COMMON_PATH = "com/android/jack/resource/test001/jack/"; @Nonnull - private static final String JACK_FILE_PATH = COMMON_PATH + "IrrelevantForTest.jayce"; + private static final String JACK_FILE_PATH = FileType.JAYCE.getPrefix() + "/" + COMMON_PATH + + "IrrelevantForTest.jayce"; + @Nonnull + private static final String DEX_FILE_PATH = FileType.DEX.getPrefix() + "/" + COMMON_PATH + + "IrrelevantForTest.dex"; @Nonnull private static final String RESOURCE1_SHORTPATH = "Resource1"; @Nonnull @@ -59,15 +62,6 @@ public class ResourceTest { @Nonnull private static final String RESOURCE4_SHORTPATH = "pack/Resource4"; @Nonnull - private static final String RESOURCE1_LONGPATH = COMMON_PATH + RESOURCE1_SHORTPATH; - @Nonnull - private static final String RESOURCE2_LONGPATH = COMMON_PATH + RESOURCE2_SHORTPATH; - @Nonnull - private static final String RESOURCE3_LONGPATH = COMMON_PATH + RESOURCE3_SHORTPATH; - @Nonnull - private static final String RESOURCE4_LONGPATH = COMMON_PATH + RESOURCE4_SHORTPATH; - - @Nonnull private static final File FILE = TestTools.getJackTestsWithJackFolder("resource/test001"); @@ -86,10 +80,10 @@ public class ResourceTest { TestTools.compileJackToDex(new Options(), jackAr, dexDir, false /* zipped */); // check that resources are contained in dex dir - checkResourceContent(dexDir, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(dexDir, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(dexDir, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(dexDir, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromDir(dexDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false); } @Test @@ -103,35 +97,31 @@ public class ResourceTest { // check that resources are contained in dex archive ZipFile zipFile = new ZipFile(dexAr); - checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false); + checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false); + checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false); + checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false); } @Test public void testJackDirToDexArchive() throws Exception { // compile source file to a Jack dir File jackFolder = TestTools.createTempDir("tempjack", "dir"); - TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(), + Options options = new Options(); + options.addResource(new File(FILE, "rsc")); + TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(), jackFolder, false /* non-zipped */); - // add resources to Jack dir - copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder); - // compile Jack dir to dex archive File dexAr = TestTools.createTempFile("resourcetestdex", ".zip"); TestTools.compileJackToDex(new Options(), jackFolder, dexAr, true /* zipped */); // check that resources are contained in dex archive ZipFile zipFile = new ZipFile(dexAr); - checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false); + checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false); + checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false); + checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false); } @Test @@ -151,25 +141,21 @@ public class ResourceTest { // check that resources are contained in dex archive ZipFile zipFile = new ZipFile(shrobbedJackAr); - checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true); + checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true); + checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true); + checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true); } @Test public void testJackDirToJackArchive() throws Exception { // compile source file to a Jack dir File jackFolder = TestTools.createTempDir("tempjack", "dir"); - TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(), + Options options = new Options(); + options.addResource(new File(FILE, "rsc")); + TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(), jackFolder, false /* non-zipped */); - // add resources to Jack dir - copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder); - // run shrobbing from Jack dir to Jack archive File shrobbedJackAr = TestTools.createTempFile("shrobbedJackAr", ".zip"); ProguardFlags flags = new ProguardFlags(new File(FILE, "proguard.flags")); @@ -182,10 +168,10 @@ public class ResourceTest { // check that resources are contained in Jack archive ZipFile zipFile = new ZipFile(shrobbedJackAr); - checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true); + checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true); + checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true); + checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true); } @Test @@ -204,25 +190,21 @@ public class ResourceTest { false /* non-zipped */); // check that resources are contained in Jack dir - checkResourceContent(shrobbedJackDir, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(shrobbedJackDir, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(shrobbedJackDir, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(shrobbedJackDir, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true); } @Test public void testJackDirToJackDir() throws Exception { /// compile source file to a Jack dir File jackFolder = TestTools.createTempDir("tempjack", "dir"); - TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(), + Options options = new Options(); + options.addResource(new File(FILE, "rsc")); + TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(), jackFolder, false /* non-zipped */); - // add resources to Jack dir - copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder); - // run shrobbing from Jack dir to Jack dir File shrobbedJackDir = TestTools.createTempDir("shrobbedJack", "dir"); ProguardFlags flags = new ProguardFlags(new File(FILE, "proguard.flags")); @@ -234,34 +216,30 @@ public class ResourceTest { false /* non-zipped */); // check that resources are contained in Jack dir - checkResourceContent(shrobbedJackDir, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(shrobbedJackDir, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(shrobbedJackDir, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(shrobbedJackDir, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true); + checkResourceContentFromDir(shrobbedJackDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true); } @Test public void testJackDirToDexDir() throws Exception { // compile source file to a Jack dir File jackFolder = TestTools.createTempDir("tempjack", "dir"); - TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(), + Options options = new Options(); + options.addResource(new File(FILE, "rsc")); + TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(), jackFolder, false /* non-zipped */); - // add resources to Jack dir - copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder); - // compile Jack dir to a dex dir File dexDir = TestTools.createTempDir("resourcetestdex", "dir"); TestTools.compileJackToDex(new Options(), jackFolder, dexDir, false /* zipped */); // check that resources are contained in dex dir - checkResourceContent(dexDir, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(dexDir, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(dexDir, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(dexDir, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromDir(dexDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false); } @Test @@ -269,24 +247,20 @@ public class ResourceTest { public void testJackToDexInSameDir() throws Exception { // compile source file to a Jack dir File jackFolder = TestTools.createTempDir("tempjack", "dir"); - TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(), + Options options = new Options(); + options.addResource(new File(FILE, "rsc")); + TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(), jackFolder, false /* non-zipped */); - // add resources to Jack dir - copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder); - copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder); - // compile Jack dir to same dir File dexDir = jackFolder; TestTools.compileJackToDex(new Options(), jackFolder, dexDir, false /* zipped */); // check that resources are contained in dex dir - checkResourceContent(dexDir, RESOURCE1_LONGPATH, "Res1"); - checkResourceContent(dexDir, RESOURCE2_LONGPATH, "Res2"); - checkResourceContent(dexDir, RESOURCE3_LONGPATH, "Res3"); - checkResourceContent(dexDir, RESOURCE4_LONGPATH, "Res4"); + checkResourceContentFromDir(dexDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false); + checkResourceContentFromDir(dexDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false); } @Test @@ -330,37 +304,19 @@ public class ResourceTest { @Nonnull private File createJackArchiveWithResources() throws Exception { // compile source file to a Jack file - File tempJackFolder = TestTools.createTempDir("jack", "dir"); - TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(), - tempJackFolder, false /* non-zipped */); - - // create Jack archive with resources - File singleJackFile = new File(tempJackFolder, JACK_FILE_PATH); + //File tempJackFolder = TestTools.createTempDir("jack", "dir"); File jackAr = TestTools.createTempFile("resourcetestjack", ".zip"); - ZipOutputStream zos = null; - try { - zos = new ZipOutputStream(new FileOutputStream(jackAr)); - - String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/'); - File libProperties = new File(tempJackFolder, libPropName); + Options options = new Options(); + options.addResource(new File(FILE, "rsc")); + TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(), + jackAr, true /* non-zipped */); - copyFileToZip(libProperties, libPropName, zos); - copyFileToZip(singleJackFile, JACK_FILE_PATH, zos); - copyFileToZip(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, zos); - copyFileToZip(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, zos); - copyFileToZip(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, zos); - copyFileToZip(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, zos); - } finally { - if (zos != null) { - zos.close(); - } - } return jackAr; } - private void checkResourceContent(@Nonnull ZipFile zipFile, @Nonnull String entryName, - @Nonnull String expectedContent) throws IOException { - ZipEntry entry = zipFile.getEntry(entryName); + private void checkResourceContentFromZip(@Nonnull ZipFile zipFile, @Nonnull String entryName, + @Nonnull String expectedContent, boolean isLib) throws IOException { + ZipEntry entry = zipFile.getEntry((isLib ? FileType.RSC.getPrefix() + '/' : "") + entryName); Assert.assertNotNull(entry); BufferedReader candidateReader = null; BufferedReader referenceReader = null; @@ -379,10 +335,10 @@ public class ResourceTest { } } - private void checkResourceContent(@Nonnull File dir, @Nonnull String path, - @Nonnull String expectedContent) throws IOException { + private void checkResourceContentFromDir(@Nonnull File dir, @Nonnull String path, + @Nonnull String expectedContent, boolean isLib) throws IOException { assert dir.isDirectory(); - File file = new File(dir, path); + File file = new File(isLib ? new File(dir, FileType.RSC.getPrefix()) : dir, path); Assert.assertTrue(file.exists()); BufferedReader candidateReader = null; BufferedReader referenceReader = null; @@ -460,21 +416,4 @@ public class ResourceTest { } } } - - private void copyFileToZip(@Nonnull File fileToCopy, @Nonnull String entryName, - @Nonnull ZipOutputStream zos) - throws IOException { - FileInputStream fis = null; - try { - fis = new FileInputStream(fileToCopy); - ZipEntry sourceEntry = new ZipEntry(entryName); - zos.putNextEntry(sourceEntry); - ByteStreamSucker sucker = new ByteStreamSucker(fis, zos); - sucker.suck(); - } finally { - if (fis != null) { - fis.close(); - } - } - } } diff --git a/jack/tests/com/android/jack/WithPhantomTest.java b/jack/tests/com/android/jack/WithPhantomTest.java index 3affdad..1c19656 100644 --- a/jack/tests/com/android/jack/WithPhantomTest.java +++ b/jack/tests/com/android/jack/WithPhantomTest.java @@ -17,6 +17,7 @@ package com.android.jack; import com.android.jack.category.KnownBugs; +import com.android.jack.library.FileType; import com.android.sched.util.collect.Lists; import junit.framework.Assert; @@ -52,8 +53,9 @@ public class WithPhantomTest { TestTools.compileSourceToJack(new Options(), TestTools.getJackTestsWithJackFolder(TEST001), BOOTCLASSPATH, tempJackFolder, false /* non-zipped */); - boolean deleted = new File(tempJackFolder, - fixPath("com/android/jack/withphantom/test001/jack/A.jayce")).delete(); + boolean deleted = + new File(tempJackFolder, FileType.JAYCE.getPrefix() + File.separatorChar + + fixPath("com/android/jack/withphantom/test001/jack/A.jayce")).delete(); Assert.assertTrue(deleted); File testFolder = TestTools.getJackTestFolder(TEST001); @@ -105,8 +107,13 @@ public class WithPhantomTest { TestTools.compileSourceToJack(new Options(), TestTools.getJackTestsWithJackFolder(TEST001), BOOTCLASSPATH, tempJackFolder, false /* non-zipped */); - boolean deleted = new File(tempJackFolder, - fixPath("com/android/jack/withphantom/test001/jack/A$Inner1.jayce")).delete(); + boolean deleted = + new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar + + "com/android/jack/withphantom/test001/jack/A$Inner1.jayce")).delete(); + Assert.assertTrue(deleted); + deleted = + new File(tempJackFolder, fixPath(FileType.DEX.getPrefix() + File.separatorChar + + "com/android/jack/withphantom/test001/jack/A$Inner1.dex")).delete(); Assert.assertTrue(deleted); File testFolder = TestTools.getJackTestFolder(TEST001); @@ -159,8 +166,9 @@ public class WithPhantomTest { TestTools.compileSourceToJack(new Options(), TestTools.getJackTestsWithJackFolder(TEST002), BOOTCLASSPATH, tempJackFolder, false /* non-zipped */); - File[] inners = new File(tempJackFolder, - fixPath("com/android/jack/withphantom/test002/jack/")).listFiles(new FilenameFilter() { + File[] inners = + new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar + + "com/android/jack/withphantom/test002/jack/")).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.startsWith("A$"); @@ -192,8 +200,9 @@ public class WithPhantomTest { TestTools.compileSourceToJack(new Options(), TestTools.getJackTestsWithJackFolder(TEST002), BOOTCLASSPATH, tempJackFolder, false /* non-zipped */); - boolean deleted = new File(tempJackFolder, - fixPath("com/android/jack/withphantom/test002/jack/A.jayce")).delete(); + boolean deleted = + new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar + + "com/android/jack/withphantom/test002/jack/A.jayce")).delete(); Assert.assertTrue(deleted); File testFolder = TestTools.getJackTestFolder(TEST002); diff --git a/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java b/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java index 6db2b08..ff39378 100644 --- a/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java +++ b/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java @@ -21,6 +21,7 @@ import com.android.jack.Main; import com.android.jack.Options; import com.android.jack.TestTools; import com.android.jack.jayce.JayceProperties; +import com.android.jack.library.FileType; import com.android.jack.library.JackLibrary; import com.android.jack.library.JackLibraryFactory; import com.android.jack.library.LibraryFormatException; @@ -53,13 +54,14 @@ public class JackFormatErrorTest { public void testJackFormatError001() throws Exception { TestingEnvironment ite = new TestingEnvironment(); - ite.addFile(ite.getJackFolder(), "jack.incremental", "A.jayce", "jayce(" - + JackLibraryFactory.DEFAULT_MAJOR_VERSION + "." + Version.MINOR + ")Corrupted"); + ite.addFile(new File(ite.getJackFolder(), FileType.JAYCE.getPrefix()), "jack.incremental", + "A.jayce", "jayce(" + JackLibraryFactory.DEFAULT_MAJOR_VERSION + "." + Version.MINOR + + ")Corrupted"); ite.addFile(ite.getJackFolder(), "", "jack.properties", JackLibrary.KEY_LIB_EMITTER + "=unknown\n" + JackLibrary.KEY_LIB_EMITTER_VERSION + "=0\n" - + JackLibrary.KEY_LIB_MAJOR_VERSION + "=1\n" - + JackLibrary.KEY_LIB_MINOR_VERSION + "=0\n" + + JackLibrary.KEY_LIB_MAJOR_VERSION + "=" + Version.MAJOR + "\n" + + JackLibrary.KEY_LIB_MINOR_VERSION + "=" + Version.MINOR + "\n" + JayceProperties.KEY_JAYCE + "=true\n" + JayceProperties.KEY_JAYCE_MAJOR_VERSION + "=2\n" + JayceProperties.KEY_JAYCE_MINOR_VERSION + "=14\n"); @@ -97,13 +99,13 @@ public class JackFormatErrorTest { public void testJackFormatError002() throws Exception { TestingEnvironment ite = new TestingEnvironment(); - ite.addFile(ite.getJackFolder(), "jack.incremental", "A.jayce", - "jayce()"); + ite.addFile(new File(ite.getJackFolder(), FileType.JAYCE.getPrefix()), "jack.incremental", + "A.jayce", "jayce()"); ite.addFile(ite.getJackFolder(), "", "jack.properties", JackLibrary.KEY_LIB_EMITTER + "=unknown\n" + JackLibrary.KEY_LIB_EMITTER_VERSION + "=0\n" - + JackLibrary.KEY_LIB_MAJOR_VERSION + "=1\n" - + JackLibrary.KEY_LIB_MINOR_VERSION + "=0\n" + + JackLibrary.KEY_LIB_MAJOR_VERSION + "=" + Version.MAJOR + "\n" + + JackLibrary.KEY_LIB_MINOR_VERSION + "=" + Version.MINOR + "\n" + JayceProperties.KEY_JAYCE + "=true\n" + JayceProperties.KEY_JAYCE_MAJOR_VERSION + "=2\n" + JayceProperties.KEY_JAYCE_MINOR_VERSION + "=14\n"); @@ -140,13 +142,13 @@ public class JackFormatErrorTest { public void testJackFormatError003() throws Exception { TestingEnvironment ite = new TestingEnvironment(); - ite.addFile(ite.getJackFolder(), "jack.incremental", "A.jayce", - "jayce()"); + ite.addFile(new File(ite.getJackFolder(), FileType.JAYCE.getPrefix()), "jack.incremental", + "A.jayce", "jayce()"); ite.addFile(ite.getJackFolder(), "", "jack.properties", JackLibrary.KEY_LIB_EMITTER + "=unknown\n" + JackLibrary.KEY_LIB_EMITTER_VERSION + "=0\n" - + JackLibrary.KEY_LIB_MAJOR_VERSION + "=1\n" - + JackLibrary.KEY_LIB_MINOR_VERSION + "=0\n" + + JackLibrary.KEY_LIB_MAJOR_VERSION + "=" + Version.MAJOR + "\n" + + JackLibrary.KEY_LIB_MINOR_VERSION + "=" + Version.MINOR + "\n" + JayceProperties.KEY_JAYCE + "=true\n" + JayceProperties.KEY_JAYCE_MAJOR_VERSION + "=0\n" + JayceProperties.KEY_JAYCE_MINOR_VERSION + "=0\n"); diff --git a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java index b697d1e..acd3cb3 100644 --- a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java +++ b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java @@ -110,7 +110,7 @@ public class DependenciesTest015 { iteProg.incrementalBuildFromFolder(null /*classpath*/, Arrays.asList(iteLib.getJackFolder())); iteProg.snapshotJackFilesModificationDate(); - Assert.assertEquals(1, iteProg.getJackFiles().size()); + Assert.assertEquals(2, iteProg.getJackFiles().size()); DexBuffer db = new DexBuffer(new FileInputStream(iteProg.getDexFile())); Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;")); @@ -126,7 +126,7 @@ public class DependenciesTest015 { iteProg.incrementalBuildFromFolder(null, Arrays.asList(iteLib.getJackFolder())); iteProg.snapshotJackFilesModificationDate(); - Assert.assertEquals(1, iteProg.getJackFiles().size()); + Assert.assertEquals(3, iteProg.getJackFiles().size()); db = new DexBuffer(new FileInputStream(iteProg.getDexFile())); Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;")); diff --git a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java index 608dde2..90c16b9 100644 --- a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java +++ b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java @@ -20,6 +20,7 @@ import com.android.jack.Options; import com.android.jack.TestTools; import com.android.jack.backend.dex.DexFileWriter; import com.android.jack.backend.jayce.JayceFileImporter; +import com.android.jack.library.FileType; import com.android.jack.util.ExecuteFile; import com.android.jack.util.NamingTools; @@ -189,7 +190,8 @@ public class IncrementalTestingEnvironment extends TestTools { if (previousDate == null || jackFile.lastModified() > previousDate.longValue()) { String jackFileName = jackFile.getAbsolutePath(); String binaryTypeName = jackFileName.substring(0, jackFileName.indexOf(".jayce")); - binaryTypeName = binaryTypeName.substring(jackFolder.getAbsolutePath().length() + 1); + binaryTypeName = binaryTypeName.substring((jackFolder.getAbsolutePath() + File.separatorChar + + FileType.JAYCE.getPrefix()).length() + 1); fqnOfRebuiltTypes.add(binaryTypeName.replace(File.separatorChar,'.')); } } diff --git a/jack/tests/com/android/jack/multidex/MultiDexTests.java b/jack/tests/com/android/jack/multidex/MultiDexTests.java index bf53e86..2edbb0b 100644 --- a/jack/tests/com/android/jack/multidex/MultiDexTests.java +++ b/jack/tests/com/android/jack/multidex/MultiDexTests.java @@ -22,7 +22,9 @@ import com.android.jack.Options; import com.android.jack.TestTools; import com.android.jack.backend.dex.DexFileWriter; import com.android.jack.backend.dex.MultiDexLegacy; +import com.android.jack.library.FileType; import com.android.jack.preprocessor.PreProcessor; +import com.android.jack.preprocessor.PreprocessorProperties; import com.android.jack.shrob.ListingComparator; import com.android.jack.util.ExecuteFile; @@ -35,8 +37,10 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.util.Properties; import javax.annotation.Nonnull; @@ -248,9 +252,38 @@ public class MultiDexTests { TestTools.getJackTestFolder("multidex/fakelibrary"), TestTools.getDefaultBootclasspathString() + File.pathSeparator + frameworks.getPath(), library, false); + return library; } + private static void setMetaIntoJackProperties(@Nonnull File library) throws IOException { + File jackProperties = new File(library, "jack.properties"); + Properties libraryProperties = new Properties(); + FileInputStream fis = null; + FileOutputStream fos = null; + try { + fis = new FileInputStream(jackProperties); + libraryProperties.load(fis); + } catch (IOException e) { + Assert.fail(); + } finally { + if (fis != null) { + fis.close(); + } + } + try { + fos = new FileOutputStream(jackProperties); + libraryProperties.put(PreprocessorProperties.KEY_JPP, "true"); + libraryProperties.store(fos, "Library properties"); + } catch (IOException e) { + Assert.fail(); + } finally { + if (fos != null) { + fos.close(); + } + } + } + @Test public void legacyAppTest002a() throws Exception { @@ -306,7 +339,8 @@ public class MultiDexTests { File testFolder = TestTools.getJackTestsWithJackFolder("multidex/test002"); File autoLibrary = prepareLibrary(frameworks); - File jackInf = new File(autoLibrary, "JACK-INF"); + setMetaIntoJackProperties(autoLibrary); + File jackInf = new File(autoLibrary, FileType.JPP.getPrefix()); Assert.assertTrue(jackInf.mkdir()); Files.copy(new File(testFolder,"config-001.jpp"), new File(jackInf, "config-001.jpp")); @@ -387,7 +421,8 @@ public class MultiDexTests { File testFolder = TestTools.getJackTestsWithJackFolder("multidex/test002"); File autoLibrary = prepareLibrary(frameworks); - File jackInf = new File(autoLibrary, "JACK-INF"); + setMetaIntoJackProperties(autoLibrary); + File jackInf = new File(autoLibrary, FileType.JPP.getPrefix()); Assert.assertTrue(jackInf.mkdir()); Files.copy(new File(testFolder,"config-001.jpp"), new File(jackInf, "config-001.jpp")); diff --git a/sched/src/com/android/sched/vfs/VPath.java b/sched/src/com/android/sched/vfs/VPath.java index 1988a91..e1ab723 100644 --- a/sched/src/com/android/sched/vfs/VPath.java +++ b/sched/src/com/android/sched/vfs/VPath.java @@ -29,6 +29,9 @@ import javax.annotation.Nonnull; */ public final class VPath implements Cloneable { + @Nonnull + public static final VPath ROOT = new VPath("", '/'); + private static final char INTERNAL_SEPARATOR = '/'; @Nonnull @@ -85,7 +88,7 @@ public final class VPath implements Cloneable { } @Override - protected VPath clone() { + public VPath clone() { // no need to clone path fragments, they should be immutable @SuppressWarnings("unchecked") ArrayList<VPathFragment> clonedList = (ArrayList<VPathFragment>) pathFragments.clone(); |