仅为一个产品风味添加Android AppWidget

时间:2015-06-17 12:43:18

标签: android gradle android-appwidget android-productflavors

我有两个gradle product flavors:用于prod和舞台服务器。

productFlavors {
        stage {
            // stage specific stuff
        }
        production {
            // production only
        }
    }

另外,我有一个AppWidget必须只能用于舞台现在。我想我应该在清单中隐藏我的AppWidgetProvider

<receiver
    android:name=".appwidget.AppWidgetProvider"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data
       android:name="android.appwidget.provider"
       android:resource="@xml/appwidget_info" />
</receiver>

但是我怎么能只为产品味道做呢?或者还有另一种方式吗?

3 个答案:

答案 0 :(得分:3)

因此,我们将在gradle产品风格中为您的生产和暂存构建提供以下示例包。

productFlavors {
        production {
            packageName "x(path).x(path).gradleexample"
        }

        staging {
            packageName "x(path).x(path).gradleexample.staging"
        }
    }

以下是您的文件夹结构示例,其中一些可能适用于您的项目,也可能不适用于您的项目,但应该让您了解所需的内容。

├── main
│   ├── AndroidManifest.xml
│   ├── ic_launcher-web.png
│   ├── java
│   │   └── x(path)
│   │       └── x(path)
│   │           └── gradlebuildexample
│   │               └── MainActivity.java
│   └── res
│       ├── drawable-hdpi
│       │   └── ic_launcher.png
│       ├── drawable-mdpi
│       │   └── ic_launcher.png
│       ├── drawable-xhdpi
│       │   └── ic_launcher.png
│       ├── drawable-xxhdpi
│       │   └── ic_launcher.png
│       ├── layout
│       │   └── activity_main.xml
│       ├── menu
│       │   └── main.xml
│       ├── values
│       │   ├── dimens.xml
│       │   ├── strings.xml
│       │   └── styles.xml
│       ├── values-v11
│       │   └── styles.xml
│       └── values-v14
│           └── styles.xml
├── production
│   └── java
│       └── x(path)
│           └── x(path)
│               └── gradlebuildexample
│                   └── Constants.java
└── staging
    ├── java
    │   └── x(path)
    │       └── x(path)
    │           └── gradlebuildexample
    │               └── Constants.java
    └── res
        ├── drawable-hdpi
        │   └── ic_launcher.png
        ├── drawable-mdpi
        │   └── ic_launcher.png
        ├── drawable-xhdpi
        │   └── ic_launcher.png
        ├── drawable-xxhdpi
        │   └── ic_launcher.png
        └── values
            └── string.xml

现在要清楚你的字符串结果集xml在生产和登台中的值 - &gt; string.xml,必须包含适用于清单的以下值,这将在下面描述。

如下所示

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="receiver">false</string>
</resources>

根据我目前对你的清单的理解,它看起来像这样

<receiver
    android:name=".appwidget.AppWidgetProvider"
    android:label="@string/app_name"
    android:enabled="@string/receiver">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data
       android:name="android.appwidget.provider"
       android:resource="@xml/appwidget_info" />
</receiver>

所以这可行,但是如果你从我的第三条评论中看到,一个更好更简单的解决方案是为每个构建阶段提供不同的清单,因为您可能需要更多的更改而不仅仅是一个。所以下面我将提供相关的工作,你可以根据我提供的内容进行推断。

在gradle中使用source set,您可以为每个清单指定不同的构建路径,如下所示

sourceSets {

        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            res.srcDirs = ['src/main/res']
        }

        debug {
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            res.srcDirs = ['src/main/debug/res']
        }

        release {
            manifest.srcFile 'src/main/release/AndroidManifest.xml'
            res.srcDirs = ['src/main/release/res']
        }
}

答案 1 :(得分:2)

在@ kev2316的另一个答案的基础上,这是一个更简单的方法:

<meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml"
    android:enabled="@bool/widget_enabled"/>

在您的build.gradle

productFlavors {
    production {
        resValue "bool", "widget_enabled", "true"
    }
    staging {
        resValue "bool", "widget_enabled", "false"
    }
}

答案 2 :(得分:1)

好的,我尝试了所有的方法,他们都工作:) 我奖励@ kev2316,因为所有的方式都基于他的想法。

对于未来的读者,我想留下一些评论如何解决我的项目中的问题。

  1. AndroidManifest.xml中的app/src/main保持不变
  2. 使用此内容在AndroidManifest.xml中创建app/src/stage
  3. <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="my.package" >
    <application>
    <!-- Declarations for the widget -->
        <receiver
            android:name=".appwidget.AppWidgetProvider"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/appwidget_info" />
        </receiver>
        <service
            android:name=".appwidget.AppWidgetRefreshService"
            android:permission="android.permission.BIND_REMOTEVIEWS"
            android:exported="false" />
    </application>
    </manifest>
    
    1. 的利润!结果AndroidManifest.xml会自动合并gradle。我为该项目设置了一个自定义Application类,但它完美无缺。
    2. 此方法比使用receiver选项关闭enabled更常见,并且允许像往常一样配置receiverservice。此外,我只需创建一个附加文件,因此非常简单。