Hint:
I played a little bit with *flavorlib *sample from gradle-samples-0.10
which uses new merging utility. Seems like everything works pretty fine
when I use *${packageName}* in *main/AndroidManifest.xml *files. It puts
final packageName wherever ${packageName} was.
Things go wrong when I create *flavor1/AndroidManifest.xml*, then it
crashes with above NPE.
*main/AndroidManifest.xml*
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.tests.flavorlib.app"
android:versionCode="1"
android:versionName="1.0"
xmlns:tools="http://schemas.android.com/tools">
<uses-sdk android:minSdkVersion="15" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
tools:replace="icon, label">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="*${packageName}*.foo">
</action>
</intent-filter>
</activity>
<receiver
android:name=".gcm.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action
android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="*${packageName}*"/>
</intent-filter>
</receiver>
</application>
</manifest>
*flavor1/AndroidManifest.xml*
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.tests.flavorlib.app"
xmlns:tools="http://schemas.android.com/tools">
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="18"
tools:replace="minSdkVersion"/>
<application android:icon="@drawable/ic_launcher"
android:label="@string/lib_name"
tools:replace="icon, label">
<activity android:name=".devopts.DevOptionsActivity"
android:screenOrientation="portrait"/>
</application>
</manifest>
W dniu czwartek, 1 maja 2014 16:04:49 UTC+2 użytkownik Mateusz
Grzechociński napisał:
>
> Hi,
>
> With v0.10 of Gradle Android plugin you guys introduced new manifest
> merger. One to it's killer feature is placeholder support. As documentation
> says, there is already one placeholder which can be used: ${packageName}.
>
> My project has a productFlavor which changes package name (from my.packageto
> my.package2):
>
> productFlavors {
> mo {
> packageName "my.package2"
> }
> }
>
> Since I use GCM, so far I had to have separated AndroidManifest.xml files
> which provided copy&pasted xml with only package name changed:
>
> */mo/AndroidManifest.xml*
>
> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
> package="my.package"> <!-- Changed by Gradle during build -->
>
> <permission android:name="my.package.permission.C2D_MESSAGE"
> android:protectionLevel="signature" />
> <uses-permission android:name="my.package2.permission.C2D_MESSAGE" />
>
> <application>
>
> <receiver
> android:name=".gcm.GcmBroadcastReceiver"
> android:permission="com.google.android.c2dm.permission.SEND" >
> <intent-filter>
> <action
> android:name="com.google.android.c2dm.intent.RECEIVE" />
> <category android:name="my.package2" />
> </intent-filter>
> </receiver>
>
> </application>
>
> </manifest>
>
> After upgrading to 0.10 and enabling new manifest merger, I thought I can
> remove all flavor-related AndroidManifest.xml files and put in my
> */main/AndroidManifest.xml:*
>
> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
> package="my.package">
>
> <permission android:name="*${packageName}*.permission.C2D_MESSAGE"
> android:protectionLevel="signature" />
> <uses-permission android:name="*${packageName}*.permission.C2D_MESSAGE"
> />
>
> [...]
>
> <application>
>
> [...]
>
> <receiver
> android:name=".gcm.GcmBroadcastReceiver"
> android:permission="com.google.android.c2dm.permission.SEND" >
> <intent-filter>
> <action
> android:name="com.google.android.c2dm.intent.RECEIVE" />
> <category android:name="*${packageName}*" />
> </intent-filter>
> </receiver>
>
> </application>
>
> </manifest>
>
> When done, i get:
> :app:processMoDebugManifest FAILED
>
> FAILURE: Build failed with an exception.
>
> * What went wrong:
> Execution failed for task ':app:processMoDebugManifest'.
> > java.lang.NullPointerException (no error message)
>
> * Try:
> Run with --info or --debug option to get more log output.
>
> * Exception is:
> org.gradle.api.tasks.TaskExecutionException: Execution failed for task
> ':app:processMoDebugManifest'.
> at
> org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
> at
> org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
> at
> org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
> at
> org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
> [...]
> Caused by: java.lang.NullPointerException
> at
> com.google.common.base.Preconditions.checkNotNull(Preconditions.java:192)
> at com.android.manifmerger.Actions$ActionLocation.<init>(Actions.java:341)
> at
> com.android.manifmerger.ActionRecorder.recordAttributeAction(ActionRecorder.java:203)
> at
> com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:85)
> at
> com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:96)
> at
> com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:96)
> at
> com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:96)
> at
> com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:96)
> at
> com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:62)
>
> Any ideas? Can't I use ${packageName} in main/AndroidManifest.xml file?
>
--
You received this message because you are subscribed to the Google Groups
"adt-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.