diff options
5 files changed, 67 insertions, 26 deletions
diff --git a/common/src/com/android/SdkConstants.java b/common/src/com/android/SdkConstants.java index 833acdc..7cbbf68 100644 --- a/common/src/com/android/SdkConstants.java +++ b/common/src/com/android/SdkConstants.java @@ -897,6 +897,8 @@ public final class SdkConstants { public static final String FN_RESOURCE_CLASS = FN_RESOURCE_BASE + DOT_JAVA; /** Resource class file filename, i.e. "R.class" */ public static final String FN_COMPILED_RESOURCE_CLASS = FN_RESOURCE_BASE + DOT_CLASS; + /** Resource text filename, i.e. "R.txt" */ + public static final String FN_RESOURCE_TEXT = FN_RESOURCE_BASE + DOT_TXT; /** Manifest java class filename, i.e. "Manifest.java" */ public static final String FN_MANIFEST_CLASS = "Manifest.java"; //$NON-NLS-1$ diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java index 5fb6660..2ad8a09 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java @@ -17,6 +17,7 @@ package com.android.ide.eclipse.adt.internal.build; import com.android.SdkConstants; +import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.ide.eclipse.adt.AdtConstants; import com.android.ide.eclipse.adt.AdtPlugin; @@ -132,9 +133,10 @@ public class BuildHelper { * @param verbose * @throws CoreException */ - public BuildHelper(IProject project, AndroidPrintStream outStream, - AndroidPrintStream errStream, boolean debugMode, boolean verbose, - ResourceMarker resMarker) throws CoreException { + public BuildHelper(@NonNull IProject project, + @NonNull AndroidPrintStream outStream, + @NonNull AndroidPrintStream errStream, + boolean debugMode, boolean verbose, ResourceMarker resMarker) throws CoreException { mProject = project; mOutStream = outStream; mErrStream = errStream; diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java index 67c7e8a..529dad2 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java @@ -111,6 +111,22 @@ class ChangedFileSetHelper { } /** + * Returns a {@link ChangedFileSet} for the generated R.txt file + * @param project the project + * @return a ChangeFileSet + */ + static ChangedFileSet getTextSymbols(@NonNull IProject project) { + // input path is inside the project's android output folder + String path = getRelativeAndroidOut(project); + + ChangedFileSet set = new ChangedFileSet( + "textSymbols", //$NON-NLS-1$ + path + '/' + SdkConstants.FN_RESOURCE_TEXT); + + return set; + } + + /** * Returns a {@link ChangedFileSet} for a project's javac output. * @param project the project * @return a ChangedFileSet diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java index e5b5a43..c91b629 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java @@ -342,6 +342,15 @@ public class PostCompilerBuilder extends BaseBuilder { // delta changes. abortOnBadSetup(javaProject); + // Get the output stream. Since the builder is created for the life of the + // project, they can be kept around. + if (mOutStream == null) { + mOutStream = new AndroidPrintStream(project, null /*prefix*/, + AdtPlugin.getOutStream()); + mErrStream = new AndroidPrintStream(project, null /*prefix*/, + AdtPlugin.getOutStream()); + } + // remove older packaging markers. removeMarkersFromContainer(javaProject.getProject(), AdtConstants.MARKER_PACKAGING); @@ -468,15 +477,6 @@ public class PostCompilerBuilder extends BaseBuilder { ic.refreshLocal(IResource.DEPTH_ONE, monitor); } - // Get the DX output stream. Since the builder is created for the life of the - // project, they can be kept around. - if (mOutStream == null) { - mOutStream = new AndroidPrintStream(project, null /*prefix*/, - AdtPlugin.getOutStream()); - mErrStream = new AndroidPrintStream(project, null /*prefix*/, - AdtPlugin.getOutStream()); - } - // we need to test all three, as we may need to make the final package // but not the intermediary ones. if (mPackageResources || mConvertToDex || mBuildFinalPackage) { diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java index 2e66295..bd4dd4a 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java @@ -258,6 +258,8 @@ public class PreCompilerBuilder extends BaseBuilder { return null; } + boolean isLibrary = projectState.isLibrary(); + IAndroidTarget projectTarget = projectState.getTarget(); // get the libraries @@ -362,7 +364,7 @@ public class PreCompilerBuilder extends BaseBuilder { // if the main manifest didn't change, then we check for the library // ones (will trigger manifest merging too) - if (mMustMergeManifest == false && libProjects.size() > 0) { + if (libProjects.size() > 0) { for (IProject libProject : libProjects) { IResourceDelta delta = getDelta(libProject); if (delta != null) { @@ -371,12 +373,24 @@ public class PreCompilerBuilder extends BaseBuilder { "PRE:LibManifest"); //$NON-NLS-1$ visitor.addSet(ChangedFileSetHelper.MANIFEST); + ChangedFileSet textSymbolCFS = null; + if (isLibrary == false) { + textSymbolCFS = ChangedFileSetHelper.getTextSymbols( + libProject); + visitor.addSet(textSymbolCFS); + } + delta.accept(visitor); mMustMergeManifest |= visitor.checkSet(ChangedFileSetHelper.MANIFEST); - // no need to test others. - if (mMustMergeManifest) { + if (textSymbolCFS != null) { + mMustCompileResources |= visitor.checkSet(textSymbolCFS); + } + + // no need to test others if we have all flags at true. + if (mMustMergeManifest && + (mMustCompileResources || textSymbolCFS == null)) { break; } } @@ -665,7 +679,7 @@ public class PreCompilerBuilder extends BaseBuilder { } handleResources(project, javaPackage, projectTarget, manifestFile, libProjects, - projectState.isLibrary(), proguardFile); + isLibrary, proguardFile); } if (processorStatus == SourceProcessor.COMPILE_STATUS_NONE && @@ -1111,16 +1125,23 @@ public class PreCompilerBuilder extends BaseBuilder { // now if the project has libraries, R needs to be created for each libraries // unless this is a library. if (isLibrary == false && !libRFiles.isEmpty()) { - SymbolLoader symbolValues = new SymbolLoader(new File(outputFolder, "R.txt")); - symbolValues.load(); - - for (Pair<File, String> libData : libRFiles) { - SymbolLoader symbols = new SymbolLoader(libData.getFirst()); - symbols.load(); - - SymbolWriter writer = new SymbolWriter(osOutputPath, libData.getSecond(), - symbols, symbolValues); - writer.write(); + File rFile = new File(outputFolder, SdkConstants.FN_RESOURCE_TEXT); + // if the project has no resources, the file could not exist. + if (rFile.isFile()) { + SymbolLoader symbolValues = new SymbolLoader(rFile); + symbolValues.load(); + + for (Pair<File, String> libData : libRFiles) { + File libRFile = libData.getFirst(); + if (libRFile.isFile()) { + SymbolLoader symbols = new SymbolLoader(libRFile); + symbols.load(); + + SymbolWriter writer = new SymbolWriter(osOutputPath, + libData.getSecond(), symbols, symbolValues); + writer.write(); + } + } } } |