使用Build Flavors - 正确构建源文件夹和build.gradle

dan*_*c05 163 android intellij-idea gradle android-studio

请注意:在Xavier的答案后编辑的答案

我试图在Android Studio中为同一个应用程序项目使用不同的Build Flavors.但是,我似乎很难配置它以正常工作.

脚步:

  1. 创建一个名为"Test"的新Android Studio项目.
  2. 打开build.gradle*并添加以下行:

    productFlavors {
    flavor1 {
        packageName 'com.android.studio.test.flavor1'
        }
    flavor2 {
        packageName 'com.android.studio.test.flavor2'
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新启动Android Studio后,我现在看到Build Variants部分下的4个构建变体.这意味着我们迄今为止在成功提供产品口味方面取得了成功.**
  4. flavor1创建了一个新的Source文件夹; 但是,我不确定我是否采取了正确的方式.我是这样做的:

    • 请记住,此项目的包名称是: com.foo.test
    • 右键单击src文件夹,对于flavor1,我实际上是以结构的方式在资源管理器中创建了各个文件夹src/flavor1/java/com/foo/test/MainActivity.java.
    • 上面工作得很好,因为'java'文件夹是蓝色的,这意味着IDE知道它是一个活动的源目录.此外,包是自动创建的.尽管如此,我发现了重复课程的警告.在此处查看截图.
    • 对于flavor2,我尝试手动创建包,但是flavor2的'src'文件夹似乎不是蓝色,因此右键单击时选项不同,并且我无法使用'New Package'.见图.
    • 请注意,对于flavor1,我还创建了一个'res'目录,它确实变成了蓝色,但尽管如此,如果我想使用不同的东西,它不能提供创建Android资源文件或Andorid资源目录的能力.适合不同口味的食物.

难道我做错了什么?或者我错过了什么?如果您需要更多信息,请告诉我.

*我的项目似乎有两个 build.gradle文件.一个位于项目文件夹(\ GradleTest)的根目录下,这个是空的.第二个位于\ GradleTest子文件夹的根目录,也标记为'GradleTest'(GradleTest-GradleTest),这是打开时已经有代码的那个; 因此,这是我编辑的那个.

**我检查gradle这个设置,显然使用自动导入已启用.尽管如此,对build.gradle文件进行更改不会自动更新构建变体.注意:我也尝试使用Build - Rebuild Project和/或Build - Make Project,no-go.我仍然需要关闭项目,并重新打开以使更改生效.

Xav*_*het 219

如果您已进入Studio首选项,则在Gradle部分下,您可以为项目启用自动导入(稍后我们将默认启用此选项).这将允许Studio在您编辑时重新导入build.gradle.

创建口味并不意味着您将使用自定义代码,因此我们不会创建文件夹.你需要自己创建它们.

如果你看看我的IO演讲,你会看到我们如何将各种风格和构建类型的值混合在一起来创建变体.

对于Java源代码:

src/main/java
src/flavor1/java
src/debug/java
Run Code Online (Sandbox Code Playgroud)

都是3用于创建单个输出.这意味着他们无法定义同一个类.

如果你想在两种口味中拥有相同类的不同版本,你需要在两种口味中创建它.

src/flavor1/java/com/foo/A.java
src/flavor2/java/com/foo/A.java
Run Code Online (Sandbox Code Playgroud)

然后你在src/main/java中的代码可以做到

import com.foo.A
Run Code Online (Sandbox Code Playgroud)

根据所选的风味,使用正确版本的com.foo.A.

这也意味着两个版本的A必须具有相同的API(至少在src/main/java /中的类使用的API时...

编辑以匹配修订的问题

此外,将相同的A类仅放在互斥的源文件夹中非常重要.在这种情况下,src/flavor1/java和src/flavor2/java永远不会一起选择,但main和flavor1是.

如果要提供不同版本的活动,请不要将它放在src/main/java中.

请注意,如果您有3种口味并且只想要一个自定义的flavor1,而flavor2和flavor3共享相同的活动,您可以为这两个其他活动创建一个共同的源文件夹.您可以完全灵活地创建新的源文件夹并配置源集以使用它们.

关于你的其他观点:

第二个风味源文件夹不是蓝色是正常的.您需要切换到第二种风格才能启用它,然后您就可以在其中创建包和类.在此之前,Studio不会将其视为源文件夹.我们希望将来能够改进这一点,以使IDE了解那些不活跃的源文件夹.

我认为你不能在res文件夹中创建资源文件也是正常的.菜单系统尚未更新以处理所有这些额外的资源文件夹.这将在以后发生.

  • @ValerioSantinelli你可以做每个味道的依赖.使用`flavorCompile ...` (3认同)

A-D*_*ech 19

Android上的"产品风味"

我有时会被问到如何使用不同的主机,图标甚至包名,在同一个应用程序的不同版本上进行更换.

有很多理由可以做到这一点,还有一个简单的方法:产品口味.

您可以在build.gradle脚本上定义我之前描述的这些事情.

产品风味 本文的部分内容是关于产品口味的书面思考,那么它们是什么?关于Android文档:

产品风格定义项目构建的应用程序的自定义版本.单个项目可以有不同的风格,可以更改生成的应用程序.

你怎么定义它们?您必须在build.gradle上编写要定义的flavor:

productFlavors {  
        ...
        devel {
            ...
        }

        prod {
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,我们将有两种不同风格的应用程序.您也可以在Build Variants选项卡中的Android Studio上查看它

构建变体

多个包名称

如果您希望在手机上安装一个具有开发状态且一个用于生产状态的应用程序,该怎么办?您可能知道,您只能安装一个具有相同软件包名称的应用程序(如果您尝试安装一些与手机上安装的APK相同的新APK,它会尝试更新它).

您唯一需要做的就是在每种产品口味上定义它:

android {  
    productFlavors {
        devel {
            applicationId "zuul.com.android.devel"
        }
        prod {
            applicationId "zuul.com.android"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据风格向多个主机发送请求与以前一样,您必须在产品风口配置字段中包含一些参数.

android {  
    productFlavors {
        devel {
            applicationId "zuul.com.android.devel"
            buildConfigField 'String', 'HOST', '"http://192.168.1.34:3000"'

        }

        prod {
            applicationId "zuul.com.android"
               buildConfigField 'String', 'HOST', '"http://api.zuul.com"'

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

作为一个例子,我们将尝试向您展示如何将其与Retrofit集成,以便向适当的服务器发送请求,而无需根据风格处理您指向的服务器.在这种情况下,这是Zuul Android应用程序的摘录:

public class RetrofitModule {

    public ZuulService getRestAdapter() {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(BuildConfig.HOST)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        return restAdapter.create(ZuulService.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

如您所见,您只需使用BuildConfigclass来访问您刚刚定义的变量.

通过代码可用的任何变量HOST变量不是您可以在代码中公开的唯一变量.你可以随心所欲地做到这一点:

prod {  
    applicationId "zuul.com.android"
    buildConfigField 'String', 'HOST', '"http://api.zuul.com"'
    buildConfigField 'String', 'FLAVOR', '"prod"'
    buildConfigField "boolean", "REPORT_CRASHES", "true"
}
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式访问它们:

BuildConfig.HOST  
BuildConfig.FLAVOR  
BuildConfig.REPORT_CRASHES  
Run Code Online (Sandbox Code Playgroud)

每种口味的不同图标如果你想要每种口味有不同的图标,那么你可以直观地检测出你正在打开哪一个(你也可以通过这个名字来做...但它不适合空间!),你只需要为每种口味定义新的目录结构.

在我刚刚使用的例子中有两种口味:devel和prod.然后,我们可以定义两个新的目录结构,以便我们可以定义我们想要的资源:

结构体

这适用于其他类型的资源,如strings.xml, integers.xml, arrays.xml,等.

配置签名设置

要使用Gradle构建配置为发布版本类型手动配置签名配置,请执行以下操作:

1.创建一个密钥库.密钥库是包含一组私钥的二进制文件.您必须将密钥库保存在安全可靠的位置.2.创建一个私钥.私钥表示要与应用程序标识的实体,例如个人或公司.3.将签名配置添加到模块级build.gradle文件:

android {
...
defaultConfig {...}
signingConfigs {
    release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
    }
}
buildTypes {
    release {
        ...
        signingConfig signingConfigs.release
    }
}
Run Code Online (Sandbox Code Playgroud)

}

生成已签名的APK:

要生成签名的APK,请从主菜单中选择"生成">"生成签名的APK".app/build/apk/app-release.apk中的包现在使用您的发布密钥进行签名.

参考:https://developer.android.com/studio/build/build-variants.html#signing,http://blog.brainattica.com/how-to-work-with-flavours-on-android/

  • 这是一样的http://blog.brainattica.com/how-to-work-with-flavours-on-android/ (2认同)

ben*_*n75 7

在添加新口味后,似乎需要重新加载项目build.gradle.之后,您将在Build Variants视图中看到4个构建变体(您可以从窗口的左边缘访问它).

关于其他源目录,似乎您需要手动创建它们:src/flavor1/javasrc/flavor2/java.你会看到,在"构建变量"视图改变味道会改变当前活动的源目录(目录为蓝色,当它是一个活跃的源目录)

最后,"gradle将为您的新口味创建新的sourceSet"意味着gradle将创建对象android.sourceSets.flavor1,android.sourceSets.flavor2并且您可以在build.gradle脚本中使用它们.但这些对象是动态创建的,这就是为什么你没有看到它们build.gradle(我建议你阅读这篇文章:http://www.gradle.org/docs/current/userguide/tutorial_using_tasks.html特别是6.6:它解释了创建动态任务.gradle脚本是一个groovy脚本,所以我建议你熟悉groovy)

  • 我认为导入笔记是`Build Variants`视图,我没注意到. (2认同)