Java 如何为通过gradle build变体生成的两个版本的GPS应用程序获取不同的图标?
我想让一个Android Studio AS 1.1.0项目创建两个APK文件:一个用于付费版本,一个用于免费版本的Google Play Store GPS应用程序。使用渐变构建变体。我很接近。我从一个项目上传了两个版本的免费和付费 唯一相对次要的问题是:我不能让这两个版本有不同的图标,也不能让动作栏为不同的应用显示不同的标题 因为我们处理的是口味,所以有三个AndroidManifest.xml文件:一个我可以编辑,两个gradle生成,每个口味一个。如果我编辑了这些内容,下一次生成时编辑内容将丢失 以下是我的AndroidManifest.xml: 我所做的工作基于列出的build.gradle文件,该文件的内容已过时,并标有////:Java 如何为通过gradle build变体生成的两个版本的GPS应用程序获取不同的图标?,java,android,android-studio,build.gradle,Java,Android,Android Studio,Build.gradle,我想让一个Android Studio AS 1.1.0项目创建两个APK文件:一个用于付费版本,一个用于免费版本的Google Play Store GPS应用程序。使用渐变构建变体。我很接近。我从一个项目上传了两个版本的免费和付费 唯一相对次要的问题是:我不能让这两个版本有不同的图标,也不能让动作栏为不同的应用显示不同的标题 因为我们处理的是口味,所以有三个AndroidManifest.xml文件:一个我可以编辑,两个gradle生成,每个口味一个。如果我编辑了这些内容,下一次生成时编辑内
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+' /////////(wrong version)
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 18
buildToolsVersion "18.0.1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 18
}
productFlavors {
production {
packageName "be.tamere.gradlebuildtypesexample" ////// packageName should be applicationId
}
staging {
packageName "be.tamere.gradlebuildtypesexample.staging"
}
}
}
dependencies {
compile 'com.android.support:appcompat-v7:18.0.0'
}
我的工作也基于此关联文件结构的草图:
+-- main
¦ +-- AndroidManifest.xml
¦ +-- ic_launcher-web.png
¦ +-- java
¦ ¦ +-- be
¦ ¦ +-- tamere
¦ ¦ +-- gradlebuildtypesexample
¦ ¦ +-- 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
¦ +-- be
¦ +-- tamere
¦ +-- gradlebuildtypesexample
¦ +-- Constants.java
+-- staging
+-- java
¦ +-- be
¦ +-- tamere
¦ +-- gradlebuildtypesexample
¦ +-- 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
我不知道在舞台上缺少符号是否重要。如果是这样,那可能就是我的分歧所在
当我尝试创建两个APK时,我最终得到了这个屏幕,这是一个好消息:
在AS内部,我看到了这一点,这是个好消息:
在Windows 7资源管理器中,我看到:
以下是我的内部结构:
这与链接中显示的结构相对应。特别要注意的是,免费版本中没有res文件夹。main中的res文件夹包含免费版本的图标。pro中的res文件夹包含pro版本的图标
如何为两个不同的APK获取不同的图标
为什么两个版本的操作栏中的标题都显示为完全限定的包名
有没有办法编辑生成的AndroidManifest.xml文件?或者让每种口味都有自己的可编辑AndroidManifest.xml
我无法使这两个版本具有不同的图标,也无法使操作栏为不同的应用程序显示不同的标题
步骤1:选择一个免费的或付费的,作为您在主/源集中拥有的。出于这个答案的目的,我假设自由的一个在main/中
步骤2:编辑main/res/values/strings.xml以获得所需的免费版本的app_名称资源,因为您正在清单中使用app_名称字符串资源
步骤3:创建一个paid/res/values/strings.xml,其中定义了app_name,其中包含了付费应用的显示名称所需的值
第4步:决定是使用mipmap还是drawables作为启动器图标。您似乎有mipmap目录,但您的清单引用了一个可绘制的资源。为了回答这个问题,我假设你会选择Mipmap
第五步:决定你要称之为启动器图标的内容。你的应用程序目前没有生成,它会出现,因为你的清单引用了一个kc_图标,但你的目录列表显示了ic_启动器。特别是,您希望该名称不是指免费或付费。我在这里假设你使用ic_发射器
步骤6:按照上面的方法重新组织图标和清单,并在主源集中使用免费版本的图标
步骤7:创建付费/res/mipmap-*/目录,并将ic_启动器图标的付费版本放在其中
因为我们处理的是口味,所以有三个AndroidManifest.xml文件:一个我可以编辑,两个gradle生成,每个口味一个。如果我编辑了这些内容,下一次生成时编辑内容将丢失
当然欢迎您在免费和付费的源集中使用AndroidManifest.xml文件。它们将与main、Gradle设置和任何依赖项的清单合并
话虽如此,你在这里不需要这个。有一个清单,指向标签和图标的一组资源。在主源集中有一个版本的标签和图标;将另一个放在产品风味的源集中,例如,按照上面的步骤付费
为什么两个版本的操作栏中的标题都显示为完全限定的包名
据推测,这就是app_name字符串资源值的值。如果不喜欢,请更改字符串资源
有没有办法编辑生成的AndroidManifest.xml文件
不是合并的
或者让每种口味都有自己的可编辑AndroidManifest.xml
见上文。同样,这不是解决您问题的正确方法。下面是一张我在@commonware上被卡住的图片,非常清楚: 每个应用程序都有不同的应用程序名称: Gradle通过ProductFlavors块声明消除歧义:
apply plugin: 'com.android.application'
android
{
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig
{
applicationId "com.dslomer64.kakurocombosbuildvariants"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes
{
release
{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors
{
pro
{
applicationId "com.dslomer64.kakurocombosbuildvariants.pro"
}
free
{
applicationId "com.dslomer64.kakurocombosbuildvariants.free"
}
}
}
dependencies
{
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
}
下面是对这两种变体的MyActivity.java引用:
public class MyActivity extends Activity {
boolean FREE = Free.FREE;
根据每个变量中FREE值的设置方式,变量为FREE-FREE=true或pro-FREE=false。以下是这两个变体类,它们在各自的文件中都被命名为Free:
在KakuroCombosbuild中
\app\src\free\java\com\dslomer64\kakurocombosbuildvariants\free.java:
在KakuroCombosBuildVariants\app\src\pro\java\com\dslomer64\KakuroCombosBuildVariants\Free.java中:
我使用了Android的Ribbonizer插件,由FUJI Goro编写 这是一个ribbonizer作为Android的Gradle插件,它会自动为启动器图标添加一个功能区
@公共软件哇。多好的回答啊。我需要花一段时间来检查我混乱中的大量文件和内容,并将你所说的应用于其中,但我敢打赌你已经告诉了我我所需要的。当我开始工作时,你的答案就是。谢谢你费力地回答了我冗长的问题。我不确定是否应该包含链接中的结构和gradle构建,因为它不是我的,可能会混淆,但你似乎已经完成了。@Commonware一个关闭,一个关闭。我没有编辑原始帖子,而是提供了一个答案,以便于显示我在app_名称方面的情况,但仍然没有解决。在我最终修复app_name之后,我将以某种方式取消我的答案。@commonware 2关闭,0结束。我没有把app_名称的引用放在活动中,而是放在应用程序中。没问题!谢谢
apply plugin: 'com.android.application'
android
{
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig
{
applicationId "com.dslomer64.kakurocombosbuildvariants"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes
{
release
{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors
{
pro
{
applicationId "com.dslomer64.kakurocombosbuildvariants.pro"
}
free
{
applicationId "com.dslomer64.kakurocombosbuildvariants.free"
}
}
}
dependencies
{
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
}
public class MyActivity extends Activity {
boolean FREE = Free.FREE;
package com.dslomer64.kakurocombosbuildvariants;
public class Free
{
public static final boolean FREE = true;
}
package com.dslomer64.kakurocombosbuildvariants;
public class Free
{
public static final boolean FREE = false;
}