我有两个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>
但是我怎么能只为产品味道做呢?或者还有另一种方式吗?
答案 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,因为所有的方式都基于他的想法。
对于未来的读者,我想留下一些评论如何解决我的项目中的问题。
AndroidManifest.xml
中的app/src/main
保持不变AndroidManifest.xml
中创建app/src/stage
。<?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>
AndroidManifest.xml
会自动合并gradle
。我为该项目设置了一个自定义Application
类,但它完美无缺。此方法比使用receiver
选项关闭enabled
更常见,并且允许像往常一样配置receiver
和service
。此外,我只需创建一个附加文件,因此非常简单。