diff options
2 files changed, 36 insertions, 12 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ApkBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ApkBuilder.java index 979f6b1..ad20e5b 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ApkBuilder.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ApkBuilder.java @@ -343,17 +343,18 @@ public class ApkBuilder extends BaseBuilder { // if the main resources didn't change, then we check for the library // ones (will trigger resource repackaging too) - if (mPackageResources == false && libProjects != null && - libProjects.length > 0) { + if ((mPackageResources == false || mBuildFinalPackage == false) && + libProjects != null && libProjects.length > 0) { for (IProject libProject : libProjects) { delta = getDelta(libProject); if (delta != null) { LibraryDeltaVisitor visitor = new LibraryDeltaVisitor(); delta.accept(visitor); - mPackageResources = visitor.getResChange(); + mPackageResources |= visitor.getResChange(); + mBuildFinalPackage |= visitor.getLibChange(); - if (mPackageResources) { + if (mPackageResources && mBuildFinalPackage) { break; } } @@ -660,7 +661,7 @@ public class ApkBuilder extends BaseBuilder { String classesDexPath = osBinPath + File.separator + AndroidConstants.FN_CLASSES_DEX; if (finalPackage(osBinPath + File.separator + AndroidConstants.FN_RESOURCES_AP_, - classesDexPath,osFinalPackagePath, javaProject, + classesDexPath, osFinalPackagePath, javaProject, libProjects, referencedJavaProjects, debuggable) == false) { return allRefProjects; } @@ -678,7 +679,7 @@ public class ApkBuilder extends BaseBuilder { String apkOsFilePath = osBinPath + File.separator + ProjectHelper.getApkFilename(project, entry.getKey()); if (finalPackage(resPath, classesDexPath, apkOsFilePath, javaProject, - referencedJavaProjects, debuggable) == false) { + libProjects, referencedJavaProjects, debuggable) == false) { return allRefProjects; } } @@ -946,14 +947,16 @@ public class ApkBuilder extends BaseBuilder { * @param intermediateApk The path to the temporary resource file. * @param dex The path to the dex file. * @param output The path to the final package file to create. - * @param javaProject - * @param referencedJavaProjects - * @param debuggable + * @param javaProject the java project being compiled + * @param libProjects an optional list of library projects (can be null) + * @param referencedJavaProjects referenced projects. + * @param debuggable whether the project manifest has debuggable==true. If true, any gdbserver + * executables will be packaged with the native libraries. * @return true if success, false otherwise. */ private boolean finalPackage(String intermediateApk, String dex, String output, - final IJavaProject javaProject, IJavaProject[] referencedJavaProjects, - boolean debuggable) { + final IJavaProject javaProject, IProject[] libProjects, + IJavaProject[] referencedJavaProjects, boolean debuggable) { FileOutputStream fos = null; try { @@ -1083,6 +1086,18 @@ public class ApkBuilder extends BaseBuilder { writeNativeLibraries((IFolder) libFolder, builder, debuggable); } + // write the native libraries for the library projects. + if (libProjects != null) { + for (IProject lib : libProjects) { + libFolder = lib.findMember(SdkConstants.FD_NATIVE_LIBS); + if (libFolder != null && libFolder.exists() && + libFolder.getType() == IResource.FOLDER) { + // look inside and put .so in lib/* by keeping the relative folder path. + writeNativeLibraries((IFolder) libFolder, builder, debuggable); + } + } + } + // close the jar file and write the manifest and sign it. builder.close(); } catch (GeneralSecurityException e1) { diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/LibraryDeltaVisitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/LibraryDeltaVisitor.java index a24eff0..77d7422 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/LibraryDeltaVisitor.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/LibraryDeltaVisitor.java @@ -26,18 +26,23 @@ import org.eclipse.core.runtime.IPath; /** * Delta visitor specifically for Library resources. - * The goal is to detect library resource change when compiling the main project + * The goal is to detect library resource/library changes when compiling the main project * and trigger a resource recompilation/repackaging. * */ public class LibraryDeltaVisitor implements IResourceDeltaVisitor { private boolean mResChange = false; + private boolean mLibChange = false; public boolean getResChange() { return mResChange; } + public boolean getLibChange() { + return mLibChange; + } + public boolean visit(IResourceDelta delta) throws CoreException { // we are only going to look for changes in res/ // Since the delta visitor goes through the main @@ -60,6 +65,10 @@ public class LibraryDeltaVisitor implements IResourceDeltaVisitor { // res folder was changed! // This is all that matters, we can stop (return false below) mResChange = true; + } else if (SdkConstants.FD_NATIVE_LIBS.equalsIgnoreCase(segments[1])) { + // libs folder was changed. + // This is all that matters, we can stop (return false below) + mLibChange = true; } } |