From df1fe0d73746562347f898fe393873b952c9c175 Mon Sep 17 00:00:00 2001 From: Benoit Billington Date: Wed, 10 Dec 2014 10:44:28 +0100 Subject: [PATCH 1/6] Manifest merger v2 - Basic implementation: It can process all the special tags in the manifest --- .../android/configuration/ManifestMerger.java | 42 ++++ .../standalonemojos/ManifestMergerMojo.java | 210 ++++++++++++++++++ 2 files changed, 252 insertions(+) create mode 100644 src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java create mode 100644 src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java diff --git a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java new file mode 100644 index 000000000..d213001a5 --- /dev/null +++ b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java @@ -0,0 +1,42 @@ +package com.jayway.maven.plugins.android.configuration; + +/** + * Configuration for the manifest update. This class is only the definition of the parameters that are shadowed in + * {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo} and used there. + * + * @author Benoit Billington + */ +public class ManifestMerger +{ + + /** + * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo#manifestVersionName}. + */ + protected String versionName; + + /** + * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo#manifestVersionCode}. + */ + protected Integer versionCode; + + /** + * Mirror of + * {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo#manifestUsesSdk} + */ + protected UsesSdk usesSdk; + + public String getVersionName() + { + return versionName; + } + + public Integer getVersionCode() + { + return versionCode; + } + + public UsesSdk getUsesSdk() + { + return usesSdk; + } +} diff --git a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java new file mode 100644 index 000000000..017149a52 --- /dev/null +++ b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java @@ -0,0 +1,210 @@ +package com.jayway.maven.plugins.android.standalonemojos; + +import com.android.builder.core.AndroidBuilder; +import com.android.builder.dependency.ManifestDependency; +import com.android.manifmerger.ManifestMerger2; +import com.jayway.maven.plugins.android.AbstractAndroidMojo; +import com.jayway.maven.plugins.android.common.AndroidExtension; +import com.jayway.maven.plugins.android.configuration.ManifestMerger; +import com.jayway.maven.plugins.android.configuration.UsesSdk; +import com.jayway.maven.plugins.android.phase01generatesources.MavenILogger; +import org.apache.commons.lang.StringUtils; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Manifest Merger V2 AndroidManifest.xml file. + * http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger + * + * @author Benoit Billington + */ +@Mojo( name = "manifest-merger", defaultPhase = LifecyclePhase.PROCESS_RESOURCES ) +public class ManifestMergerMojo extends AbstractAndroidMojo +{ + + // version encoding + private static final int NUMBER_OF_DIGITS_FOR_VERSION_POSITION = 3; + + /** + * Configuration for the manifest-update goal. + *

+ * You can configure this mojo to update the following basic manifestMerger attributes: + *

+ *

+ * android:versionName on the manifestMerger element. + * android:versionCode on the manifestMerger element. + *

+ *

+ * You can configure attributes in the plugin configuration like so + *

+ *

+     *   <plugin>
+     *     <groupId>com.jayway.maven.plugins.android.generation2</groupId>
+     *     <artifactId>android-maven-plugin</artifactId>
+     *     <executions>
+     *       <execution>
+     *         <id>merge-manifest</id>
+     *         <goals>
+     *           <goal>manifest-merger</goal>
+     *         </goals>
+     *         <configuration>
+     *           <manifestMerger>
+     *             <versionName></versionName>
+     *             <versionCode>123</versionCode>
+     *             <usesSdk>
+     *               <minSdkVersion>14</minSdkVersion>
+     *               <targetSdkVersion>21</targetSdkVersion>
+     *             </versionCode>
+     *           </manifestMerger>
+     *         </configuration>
+     *       </execution>
+     *     </executions>
+     *   </plugin>
+     * 
+ *

+ * or use properties set in the pom or settings file or supplied as command line parameter. Add + * "android." in front of the property name for command line usage. All parameters follow a + * manifestMerger.* naming convention. + *

+ */ + @Parameter + private ManifestMerger manifestMerger; + + /** + * Update the android:versionName with the specified parameter. If left empty it + * will use the version number of the project. Exposed via the project property + * android.manifestMerger.versionName. + */ + @Parameter( property = "android.manifestMerger.versionName", defaultValue = "${project.version}" ) + protected String manifestVersionName; + + /** + * Update the android:versionCode attribute with the specified parameter. Exposed via + * the project property android.manifestMerger.versionCode. + */ + @Parameter( property = "android.manifestMerger.versionCode" ) + protected Integer manifestVersionCode; + + /** + * Update the uses-sdk tag. It can be configured to change: android:minSdkVersion, + * android:maxSdkVersion and android:targetSdkVersion + */ + protected UsesSdk manifestUsesSdk; + + private String parsedVersionName; + private Integer parsedVersionCode; + private UsesSdk parsedUsesSdk; + + /** + * The modified AndroidManifest.xml file. + */ + @Parameter( property = "android.manifestFile", defaultValue = "${project.build.directory}/AndroidManifest.xml" ) + protected File updatedManifestFile; + + /** + * @throws org.apache.maven.plugin.MojoExecutionException + * @throws org.apache.maven.plugin.MojoFailureException + */ + public void execute() throws MojoExecutionException, MojoFailureException + { + if ( ! AndroidExtension.isAndroidPackaging( project.getPackaging() ) ) + { + return; // skip, not an android project. + } + + if ( sourceManifestFile == null ) + { + return; // skip, no androidmanifest.xml defined (rare case) + } + + parseConfiguration(); + + getLog().info( "Attempting to update manifest " + sourceManifestFile ); + getLog().debug( " usesSdk=" + parsedUsesSdk ); + getLog().debug( " versionName=" + parsedVersionName ); + getLog().debug( " versionCode=" + parsedVersionCode ); + getLog().debug( " parsedUsesSdk=" + parsedUsesSdk ); + + if ( ! sourceManifestFile.exists() ) + { + return; // skip, no AndroidManifest.xml file found. + } + + getLog().debug( "Using manifest merger V2" ); + manifestMergerV2(); + } + + private void parseConfiguration() + { + // manifestMerger element found in plugin config in pom + if ( manifestMerger != null ) + { + if ( StringUtils.isNotEmpty( manifestMerger.getVersionName() ) ) + { + parsedVersionName = manifestMerger.getVersionName(); + } + else + { + parsedVersionName = manifestVersionName; + } + if ( manifestMerger.getVersionCode() != null ) + { + parsedVersionCode = manifestMerger.getVersionCode(); + } + else + { + parsedVersionCode = manifestVersionCode; + } + + if ( manifestMerger.getUsesSdk() != null ) + { + parsedUsesSdk = manifestMerger.getUsesSdk(); + } + else + { + parsedUsesSdk = manifestUsesSdk; + } + } + else + { + parsedVersionName = manifestVersionName; + parsedVersionCode = manifestVersionCode; + parsedUsesSdk = manifestUsesSdk; + } + } + + + public void manifestMergerV2() throws MojoExecutionException, MojoFailureException + { + AndroidBuilder builder = new AndroidBuilder( project.toString(), "created by Android Maven Plugin", + new MavenILogger( getLog() ), false ); + + getLog().debug( "sourceManifestFile " + sourceManifestFile ); + getLog().debug( "updatedManifestFile " + updatedManifestFile ); + + builder.mergeManifests( + sourceManifestFile, new ArrayList(), new ArrayList(), "", + parsedVersionCode, parsedVersionName, + parsedUsesSdk.getMinSdkVersion(), parsedUsesSdk.getTargetSdkVersion(), null, + updatedManifestFile.getPath(), ManifestMerger2.MergeType.APPLICATION, + new HashMap(), null ); + /* @NonNull List manifestOverlays, + @NonNull List libraries, + String packageOverride, int versionCode, + String versionName, @Nullable + String minSdkVersion, + @Nullable String targetSdkVersion, + @Nullable Integer maxSdkVersion, + @NonNull String outManifestLocation, + MergeType mergeType, + Map placeHolders) {);*/ + } + +} From ffb7db85134a573921d2f5b77b67f22fef13fe54 Mon Sep 17 00:00:00 2001 From: Benoit Billington Date: Tue, 16 Dec 2014 10:55:54 +0100 Subject: [PATCH 2/6] Use sourceManifestFile as input & androidManifestFile as output --- .../android/standalonemojos/ManifestMergerMojo.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java index 017149a52..553e099a8 100644 --- a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java +++ b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java @@ -29,9 +29,6 @@ public class ManifestMergerMojo extends AbstractAndroidMojo { - // version encoding - private static final int NUMBER_OF_DIGITS_FOR_VERSION_POSITION = 3; - /** * Configuration for the manifest-update goal. *

@@ -102,12 +99,6 @@ public class ManifestMergerMojo extends AbstractAndroidMojo private Integer parsedVersionCode; private UsesSdk parsedUsesSdk; - /** - * The modified AndroidManifest.xml file. - */ - @Parameter( property = "android.manifestFile", defaultValue = "${project.build.directory}/AndroidManifest.xml" ) - protected File updatedManifestFile; - /** * @throws org.apache.maven.plugin.MojoExecutionException * @throws org.apache.maven.plugin.MojoFailureException @@ -187,13 +178,13 @@ public void manifestMergerV2() throws MojoExecutionException, MojoFailureExcepti new MavenILogger( getLog() ), false ); getLog().debug( "sourceManifestFile " + sourceManifestFile ); - getLog().debug( "updatedManifestFile " + updatedManifestFile ); + getLog().debug( "androidManifestFile " + androidManifestFile ); builder.mergeManifests( sourceManifestFile, new ArrayList(), new ArrayList(), "", parsedVersionCode, parsedVersionName, parsedUsesSdk.getMinSdkVersion(), parsedUsesSdk.getTargetSdkVersion(), null, - updatedManifestFile.getPath(), ManifestMerger2.MergeType.APPLICATION, + androidManifestFile.getPath(), ManifestMerger2.MergeType.APPLICATION, new HashMap(), null ); /* @NonNull List manifestOverlays, @NonNull List libraries, From c3c91597771173422d847219aca2c8a51f67d88b Mon Sep 17 00:00:00 2001 From: Benoit Billington Date: Wed, 17 Dec 2014 10:58:35 +0100 Subject: [PATCH 3/6] Added the versionCodeUpdateFromVersion feature and put more checks to avoid failures --- .../android/configuration/ManifestMerger.java | 11 +++ .../standalonemojos/ManifestMergerMojo.java | 81 +++++++++++++++---- 2 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java index d213001a5..104351d45 100644 --- a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java +++ b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java @@ -25,6 +25,12 @@ public class ManifestMerger */ protected UsesSdk usesSdk; + /** + * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestUpdateMojo + * #manifestVersionCodeUpdateFromVersion}. + */ + protected Boolean versionCodeUpdateFromVersion; + public String getVersionName() { return versionName; @@ -39,4 +45,9 @@ public UsesSdk getUsesSdk() { return usesSdk; } + + public Boolean getVersionCodeUpdateFromVersion() + { + return versionCodeUpdateFromVersion; + } } diff --git a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java index 553e099a8..a6dfce93c 100644 --- a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java +++ b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java @@ -29,6 +29,9 @@ public class ManifestMergerMojo extends AbstractAndroidMojo { + // version encoding + private static final int NUMBER_OF_DIGITS_FOR_VERSION_POSITION = 3; + /** * Configuration for the manifest-update goal. *

@@ -55,6 +58,7 @@ public class ManifestMergerMojo extends AbstractAndroidMojo * <manifestMerger> * <versionName></versionName> * <versionCode>123</versionCode> + * <versionCodeUpdateFromVersion>true|false</versionCodeUpdateFromVersion> * <usesSdk> * <minSdkVersion>14</minSdkVersion> * <targetSdkVersion>21</targetSdkVersion> @@ -86,15 +90,30 @@ public class ManifestMergerMojo extends AbstractAndroidMojo * Update the android:versionCode attribute with the specified parameter. Exposed via * the project property android.manifestMerger.versionCode. */ - @Parameter( property = "android.manifestMerger.versionCode" ) + @Parameter( property = "android.manifestMerger.versionCode", defaultValue = "1" ) protected Integer manifestVersionCode; + /** + * Update the android:versionCode attribute automatically from the project version + * e.g 3.2.1 will become version code 3002001. As described in this blog post + * http://www.simpligility.com/2010/11/release-version-management-for-your-android-application/ + * but done without using resource filtering. The value is exposed via the project property + * property android.manifest.versionCodeUpdateFromVersion and the resulting value + * as android.manifest.versionCode. + * For the purpose of generating the versionCode, if a version element is missing it is presumed to be 0. + * The maximum values for the version increment and version minor values are 999, + * the version major should be no larger than 2000. Any other suffixes do not + * participate in the version code generation. + */ + @Parameter( property = "android.manifest.versionCodeUpdateFromVersion", defaultValue = "false" ) + protected Boolean manifestVersionCodeUpdateFromVersion = false; + /** * Update the uses-sdk tag. It can be configured to change: android:minSdkVersion, * android:maxSdkVersion and android:targetSdkVersion */ protected UsesSdk manifestUsesSdk; - + private Boolean parsedVersionCodeUpdateFromVersion; private String parsedVersionName; private Integer parsedVersionCode; private UsesSdk parsedUsesSdk; @@ -112,6 +131,7 @@ public void execute() throws MojoExecutionException, MojoFailureException if ( sourceManifestFile == null ) { + getLog().debug( "skip, no androidmanifest.xml defined (sourceManifestFile rare case)" ); return; // skip, no androidmanifest.xml defined (rare case) } @@ -153,7 +173,14 @@ private void parseConfiguration() { parsedVersionCode = manifestVersionCode; } - + if ( manifestMerger.getVersionCodeUpdateFromVersion() != null ) + { + parsedVersionCodeUpdateFromVersion = manifestMerger.getVersionCodeUpdateFromVersion(); + } + else + { + parsedVersionCodeUpdateFromVersion = manifestVersionCodeUpdateFromVersion; + } if ( manifestMerger.getUsesSdk() != null ) { parsedUsesSdk = manifestMerger.getUsesSdk(); @@ -168,6 +195,7 @@ private void parseConfiguration() parsedVersionName = manifestVersionName; parsedVersionCode = manifestVersionCode; parsedUsesSdk = manifestUsesSdk; + parsedVersionCodeUpdateFromVersion = manifestVersionCodeUpdateFromVersion; } } @@ -177,25 +205,44 @@ public void manifestMergerV2() throws MojoExecutionException, MojoFailureExcepti AndroidBuilder builder = new AndroidBuilder( project.toString(), "created by Android Maven Plugin", new MavenILogger( getLog() ), false ); - getLog().debug( "sourceManifestFile " + sourceManifestFile ); - getLog().debug( "androidManifestFile " + androidManifestFile ); + String minSdkVersion = null; + String targetSdkVersion = null; + int versionCode; + if ( parsedUsesSdk != null ) + { + minSdkVersion = parsedUsesSdk.getMinSdkVersion(); + targetSdkVersion = parsedUsesSdk.getTargetSdkVersion(); + } + if ( parsedVersionCodeUpdateFromVersion ) + { + versionCode = generateVersionCodeFromVersionName( parsedVersionName ); + } + else + { + versionCode = parsedVersionCode; + } builder.mergeManifests( sourceManifestFile, new ArrayList(), new ArrayList(), "", - parsedVersionCode, parsedVersionName, - parsedUsesSdk.getMinSdkVersion(), parsedUsesSdk.getTargetSdkVersion(), null, + versionCode, parsedVersionName, + minSdkVersion, targetSdkVersion, null, androidManifestFile.getPath(), ManifestMerger2.MergeType.APPLICATION, new HashMap(), null ); - /* @NonNull List manifestOverlays, - @NonNull List libraries, - String packageOverride, int versionCode, - String versionName, @Nullable - String minSdkVersion, - @Nullable String targetSdkVersion, - @Nullable Integer maxSdkVersion, - @NonNull String outManifestLocation, - MergeType mergeType, - Map placeHolders) {);*/ + + } + + private int generateVersionCodeFromVersionName( String versionName ) + { + String[] versionNameDigits = versionName.replaceAll( "[^0-9.]", "" ).split( "\\." ); + + int versionCode = 0; + for ( int i = 0; i < versionNameDigits.length; i++ ) + { + double digitMultiplayer = Math.pow( 10, i * NUMBER_OF_DIGITS_FOR_VERSION_POSITION ); + String versionDigit = versionNameDigits[versionNameDigits.length - i - 1 ]; + versionCode += Integer.valueOf( versionDigit ) * digitMultiplayer; + } + return versionCode; } } From 6d529d3eb995a390c2e52f1f15e6834a21966a50 Mon Sep 17 00:00:00 2001 From: Benoit Billington Date: Wed, 17 Dec 2014 11:35:09 +0100 Subject: [PATCH 4/6] Deprecate ManifestUpdateMojo --- .../jayway/maven/plugins/android/configuration/Manifest.java | 3 +++ .../plugins/android/standalonemojos/ManifestUpdateMojo.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/com/jayway/maven/plugins/android/configuration/Manifest.java b/src/main/java/com/jayway/maven/plugins/android/configuration/Manifest.java index 1af5daee4..52f43c6fd 100644 --- a/src/main/java/com/jayway/maven/plugins/android/configuration/Manifest.java +++ b/src/main/java/com/jayway/maven/plugins/android/configuration/Manifest.java @@ -11,7 +11,10 @@ * {@link com.jayway.maven.plugins.android.standalonemojos.ManifestUpdateMojo} and used there. * * @author Manfred Moser + * @deprecated Use ManifestMerger {@link com.jayway.maven.plugins.android.configuration.ManifestMerger} in combination + * with {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo} */ +@Deprecated public class Manifest { /** diff --git a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestUpdateMojo.java b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestUpdateMojo.java index cc6f2e57b..f5853613e 100644 --- a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestUpdateMojo.java +++ b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestUpdateMojo.java @@ -47,7 +47,10 @@ * @author joakim@erdfelt.com * @author nic.strong@gmail.com * @author Manfred Moser + * @deprecated Use manifest-merger v2 mojo instead + * {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo} */ +@Deprecated @Mojo( name = "manifest-update", defaultPhase = LifecyclePhase.PROCESS_RESOURCES ) public class ManifestUpdateMojo extends AbstractAndroidMojo { From ac159958235f2f0fa9398cb579d101127217b6ce Mon Sep 17 00:00:00 2001 From: Benoit Billington Date: Fri, 19 Dec 2014 12:39:55 +0100 Subject: [PATCH 5/6] Add the ability to merge libraries manifest into the apk manifest --- .../common/MavenManifestDependency.java | 39 +++++++++++++++ .../android/configuration/ManifestMerger.java | 13 ++++- .../standalonemojos/ManifestMergerMojo.java | 48 +++++++++++++++++-- 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/jayway/maven/plugins/android/common/MavenManifestDependency.java diff --git a/src/main/java/com/jayway/maven/plugins/android/common/MavenManifestDependency.java b/src/main/java/com/jayway/maven/plugins/android/common/MavenManifestDependency.java new file mode 100644 index 000000000..cf2382e54 --- /dev/null +++ b/src/main/java/com/jayway/maven/plugins/android/common/MavenManifestDependency.java @@ -0,0 +1,39 @@ +package com.jayway.maven.plugins.android.common; + +import com.android.builder.dependency.ManifestDependency; + +import java.io.File; +import java.util.List; + +public class MavenManifestDependency implements ManifestDependency +{ + private File manifestFile; + private String name; + private List manifestDependencies; + + public MavenManifestDependency( + File manifestFile, String name, List manifestDependencies ) + { + this.manifestFile = manifestFile; + this.name = name; + this.manifestDependencies = manifestDependencies; + } + + @Override + public String getName() + { + return name; + } + + @Override + public List getManifestDependencies() + { + return manifestDependencies; + } + + @Override + public File getManifest() + { + return manifestFile; + } +} diff --git a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java index 104351d45..2ad9877e1 100644 --- a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java +++ b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java @@ -26,11 +26,17 @@ public class ManifestMerger protected UsesSdk usesSdk; /** - * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestUpdateMojo + * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo * #manifestVersionCodeUpdateFromVersion}. */ protected Boolean versionCodeUpdateFromVersion; + /** + * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo + * #manifestMergeLibraries}. + */ + protected Boolean mergeLibraries; + public String getVersionName() { return versionName; @@ -50,4 +56,9 @@ public Boolean getVersionCodeUpdateFromVersion() { return versionCodeUpdateFromVersion; } + + public Boolean getMergeLibraries() + { + return mergeLibraries; + } } diff --git a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java index a6dfce93c..5d079a54b 100644 --- a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java +++ b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java @@ -1,14 +1,16 @@ package com.jayway.maven.plugins.android.standalonemojos; +import com.android.SdkConstants; import com.android.builder.core.AndroidBuilder; -import com.android.builder.dependency.ManifestDependency; import com.android.manifmerger.ManifestMerger2; import com.jayway.maven.plugins.android.AbstractAndroidMojo; import com.jayway.maven.plugins.android.common.AndroidExtension; +import com.jayway.maven.plugins.android.common.MavenManifestDependency; import com.jayway.maven.plugins.android.configuration.ManifestMerger; import com.jayway.maven.plugins.android.configuration.UsesSdk; import com.jayway.maven.plugins.android.phase01generatesources.MavenILogger; import org.apache.commons.lang.StringUtils; +import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -18,6 +20,8 @@ import java.io.File; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Set; /** * Manifest Merger V2 AndroidManifest.xml file. @@ -59,6 +63,7 @@ public class ManifestMergerMojo extends AbstractAndroidMojo * <versionName></versionName> * <versionCode>123</versionCode> * <versionCodeUpdateFromVersion>true|false</versionCodeUpdateFromVersion> + * <mergeLibraries>true|false</mergeLibraries> * <usesSdk> * <minSdkVersion>14</minSdkVersion> * <targetSdkVersion>21</targetSdkVersion> @@ -108,12 +113,20 @@ public class ManifestMergerMojo extends AbstractAndroidMojo @Parameter( property = "android.manifest.versionCodeUpdateFromVersion", defaultValue = "false" ) protected Boolean manifestVersionCodeUpdateFromVersion = false; + /** + * Merge Manifest with library projects. Exposed via the project property + * android.manifestMerger.mergeLibraries. + */ + @Parameter( property = "android.manifestMerger.mergeLibraries", defaultValue = "false" ) + protected Boolean manifestMergeLibraries; + /** * Update the uses-sdk tag. It can be configured to change: android:minSdkVersion, * android:maxSdkVersion and android:targetSdkVersion */ protected UsesSdk manifestUsesSdk; private Boolean parsedVersionCodeUpdateFromVersion; + private Boolean parsedMergeLibraries; private String parsedVersionName; private Integer parsedVersionCode; private UsesSdk parsedUsesSdk; @@ -141,7 +154,9 @@ public void execute() throws MojoExecutionException, MojoFailureException getLog().debug( " usesSdk=" + parsedUsesSdk ); getLog().debug( " versionName=" + parsedVersionName ); getLog().debug( " versionCode=" + parsedVersionCode ); - getLog().debug( " parsedUsesSdk=" + parsedUsesSdk ); + getLog().debug( " usesSdk=" + parsedUsesSdk ); + getLog().debug( " versionCodeUpdateFromVersion=" + parsedVersionCodeUpdateFromVersion ); + getLog().debug( " mergeLibraries=" + parsedMergeLibraries ); if ( ! sourceManifestFile.exists() ) { @@ -189,6 +204,14 @@ private void parseConfiguration() { parsedUsesSdk = manifestUsesSdk; } + if ( manifestMerger.getMergeLibraries() != null ) + { + parsedMergeLibraries = manifestMerger.getMergeLibraries(); + } + else + { + parsedMergeLibraries = manifestMergeLibraries; + } } else { @@ -196,6 +219,7 @@ private void parseConfiguration() parsedVersionCode = manifestVersionCode; parsedUsesSdk = manifestUsesSdk; parsedVersionCodeUpdateFromVersion = manifestVersionCodeUpdateFromVersion; + parsedMergeLibraries = manifestMergeLibraries; } } @@ -221,9 +245,27 @@ public void manifestMergerV2() throws MojoExecutionException, MojoFailureExcepti { versionCode = parsedVersionCode; } + List manifestDependencies = new ArrayList(); + + if ( parsedMergeLibraries ) + { + final Set allArtifacts = project.getDependencyArtifacts(); + Set dependencyArtifacts = getArtifactResolverHelper().getFilteredArtifacts( allArtifacts ); + + for ( Artifact dependency : dependencyArtifacts ) + { + final File unpackedLibFolder = getUnpackedLibFolder( dependency ); + final File manifestFile = new File( unpackedLibFolder, SdkConstants.FN_ANDROID_MANIFEST_XML ); + if ( manifestFile.exists() ) + { + manifestDependencies.add( new MavenManifestDependency( manifestFile, + manifestFile.getAbsolutePath(), new ArrayList() ) ); + } + } + } builder.mergeManifests( - sourceManifestFile, new ArrayList(), new ArrayList(), "", + sourceManifestFile, new ArrayList(), manifestDependencies, "", versionCode, parsedVersionName, minSdkVersion, targetSdkVersion, null, androidManifestFile.getPath(), ManifestMerger2.MergeType.APPLICATION, From 6be4e85769731622aad4887bc7822f837040833f Mon Sep 17 00:00:00 2001 From: Benoit Billington Date: Fri, 19 Dec 2014 13:49:38 +0100 Subject: [PATCH 6/6] Add report file parameter --- .../android/configuration/ManifestMerger.java | 13 ++++++++++++ .../standalonemojos/ManifestMergerMojo.java | 21 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java index 2ad9877e1..cce48b5cd 100644 --- a/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java +++ b/src/main/java/com/jayway/maven/plugins/android/configuration/ManifestMerger.java @@ -1,5 +1,7 @@ package com.jayway.maven.plugins.android.configuration; +import java.io.File; + /** * Configuration for the manifest update. This class is only the definition of the parameters that are shadowed in * {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo} and used there. @@ -37,6 +39,12 @@ public class ManifestMerger */ protected Boolean mergeLibraries; + /** + * Mirror of {@link com.jayway.maven.plugins.android.standalonemojos.ManifestMergerMojo + * #manifestMergeReportFile}. + */ + protected File mergeReportFile; + public String getVersionName() { return versionName; @@ -61,4 +69,9 @@ public Boolean getMergeLibraries() { return mergeLibraries; } + + public File getMergeReportFile() + { + return mergeReportFile; + } } diff --git a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java index 5d079a54b..c8b976870 100644 --- a/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java +++ b/src/main/java/com/jayway/maven/plugins/android/standalonemojos/ManifestMergerMojo.java @@ -64,6 +64,7 @@ public class ManifestMergerMojo extends AbstractAndroidMojo * <versionCode>123</versionCode> * <versionCodeUpdateFromVersion>true|false</versionCodeUpdateFromVersion> * <mergeLibraries>true|false</mergeLibraries> + * <mergeReportFile>${project.build.directory}/ManifestMergeReport.txt</mergeReportFile> * <usesSdk> * <minSdkVersion>14</minSdkVersion> * <targetSdkVersion>21</targetSdkVersion> @@ -120,6 +121,13 @@ public class ManifestMergerMojo extends AbstractAndroidMojo @Parameter( property = "android.manifestMerger.mergeLibraries", defaultValue = "false" ) protected Boolean manifestMergeLibraries; + /** + * Merge Manifest with library projects. Exposed via the project property + * android.manifestMerger.mergeLibraries. + */ + @Parameter( property = "android.manifestMerger.mergeReportFile" ) + protected File manifestMergeReportFile; + /** * Update the uses-sdk tag. It can be configured to change: android:minSdkVersion, * android:maxSdkVersion and android:targetSdkVersion @@ -130,6 +138,7 @@ public class ManifestMergerMojo extends AbstractAndroidMojo private String parsedVersionName; private Integer parsedVersionCode; private UsesSdk parsedUsesSdk; + private File parsedMergeReportFile; /** * @throws org.apache.maven.plugin.MojoExecutionException @@ -157,6 +166,7 @@ public void execute() throws MojoExecutionException, MojoFailureException getLog().debug( " usesSdk=" + parsedUsesSdk ); getLog().debug( " versionCodeUpdateFromVersion=" + parsedVersionCodeUpdateFromVersion ); getLog().debug( " mergeLibraries=" + parsedMergeLibraries ); + getLog().debug( " mergeReportFile=" + parsedMergeReportFile ); if ( ! sourceManifestFile.exists() ) { @@ -212,6 +222,14 @@ private void parseConfiguration() { parsedMergeLibraries = manifestMergeLibraries; } + if ( manifestMerger.getMergeReportFile() != null ) + { + parsedMergeReportFile = manifestMerger.getMergeReportFile(); + } + else + { + parsedMergeReportFile = manifestMergeReportFile; + } } else { @@ -220,6 +238,7 @@ private void parseConfiguration() parsedUsesSdk = manifestUsesSdk; parsedVersionCodeUpdateFromVersion = manifestVersionCodeUpdateFromVersion; parsedMergeLibraries = manifestMergeLibraries; + parsedMergeReportFile = manifestMergeReportFile; } } @@ -269,7 +288,7 @@ public void manifestMergerV2() throws MojoExecutionException, MojoFailureExcepti versionCode, parsedVersionName, minSdkVersion, targetSdkVersion, null, androidManifestFile.getPath(), ManifestMerger2.MergeType.APPLICATION, - new HashMap(), null ); + new HashMap(), parsedMergeReportFile ); }