12

我更新了我的项目以使用新的基于 Gradle 的构建系统,主要是因为我有点恼火,因为我使用该设备进行开发,所以我无法将我的应用程序安装在我的设备上以使用它。packageNameSuffix我在提供新的构建系统时看到了很多希望。

我遇到的问题涉及清单中的包名称以外的其他内容。还有其他部分必须是唯一的,包括权限(特别是 GCM)和 ContentProvider Authorities。尝试使用.debug后缀安装时,我收到错误,表明该包的 GCM 权限尚未定义,并且我正在尝试安装重复的提供程序。

是否可以在清单中放入一个变量而不是这些字符串,以便构建系统也可以适当地替换它们?

4

4 回答 4

7

这是我针对 packageNameSuffix 的 GCM 问题的解决方案。

主要问题是权限名称应具有“.debug”后缀。我将该权限用于调试和发布合并到最终清单的清单。

AndroidManfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.experiment.myapplication"
          android:versionCode="1"
          android:versionName="1.0" >

    <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <uses-permission android:name="android.permission.VIBRATE" />
    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
        <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


    </application>

</manifest>

调试 AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.experiment.myapplication">


    <permission android:name="com.experiment.myapplication.debug.permission.C2D_MESSAGE"
                android:protectionLevel="signature" />
    <uses-permission android:name="com.experiment.myapplication.debug.permission.C2D_MESSAGE" />

    <application>
        <receiver
                android:name=".GcmBroadcastReceiver"
                android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.experiment.myapplication.debug" />
            </intent-filter>
        </receiver>
    </application>

</manifest

>

发布 Android 清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.experiment.myapplication" >

    <permission android:name="com.experiment.myapplication.permission.C2D_MESSAGE"
                android:protectionLevel="signature" />
    <uses-permission android:name="com.experiment.myapplication.permission.C2D_MESSAGE" />

    <application>
        <receiver
                android:name=".GcmBroadcastReceiver"
                android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.experiment.myapplication" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
于 2013-07-12T08:37:06.040 回答
6

这是更改变体的包名称的当前已知限制。我打算尽快解决这个问题。

于 2013-05-31T05:06:01.223 回答
1

我已经用占位符 ${packageName} 替换了我在 AndroidManifest.xml 中的所有应用程序包名称,因此 Manifest Merger 可以正常工作

例如:

<uses-permission android:name="${packageName}.permission.C2D_MESSAGE" />
于 2014-12-16T01:52:58.593 回答
1

您可以使用:

<permission android:name=".permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
<uses-permission android:name=".permission.C2D_MESSAGE" />

Android 将自动添加当前包名称,就像您从..

于 2016-03-10T16:39:10.367 回答