AndroidStudio利用productFlavors分环境或平台编译app

本文详细介绍如何利用Gradle的productFlavors特性,为同一应用创建不同版本,包括配置、资源分配、动态变量、APK命名及第三方库引用。通过案例解析,帮助开发者掌握多渠道打包技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

productFlavor

productFlavors直译过来就是特色的产品,所以他的主要作用就是让你同一套代码生产出不同的特色产品
productFlavors是build.gradle里面配置的,主要就是通过gradle打包时可以有多种配置供选择,类似buildTypes,并且可以和buildTypes共存

1.应用场景

  • 创建不同的产品(staging,production)(各种手机品牌)
  • 创建不同的产品并为不同产品分配专有属性
  • 设置不同代码引用
  • 先在src目录下简历对应的文件夹比如java代码则建立productjavares文件夹则建立productres
  • 建立包名建立Java类文件
  • 在app-level下的gradle文件中设置sourceSets
  • 设置不同的产品引入不同的包

2.组合

//使用flavorDimensions属性来创建一个“模式”风味维度,维度来区分不同的类型,然后两个类型之间组合
//“dev”指的是编译出来是什么环境的apk
//“app”指的是app1和app2
//(app的配置+dev的环境一起编译)
flavorDimensions "dev","app"`

productFlavors{
    //app2产品,注意(这边的产品名字字母不能大写)
   B{
      dimension "app"
      applicationIdSuffix "com.wmj.b"
      versionCode 1
      versionName "1.0.0"
    }
    //app1产品,注意(这边的产品名字字母不能大写)
   A{
      dimension "app"
      applicationId "com.wmj.a"
      versionCode 1
      versionName "1.0.0"
   }
    //线上环境
   product{
      dimension "dev"
   }
   //测试环境
   staging{
      dimension "dev"

   }
   //预发环境
   deving{
      dimension "dev"
   }
}

3.分配资源(关键)

main {
    manifest.srcFile 'src/main/AndroidManifest.xml'
    java.srcDirs = ['src/main/java']
    resources.srcDirs = ['src/main/java']
    aidl.srcDirs = ['src/main/java']
    renderscript.srcDirs = ['src/main/java']
    res.srcDirs = ['src/main/res']
    assets.srcDirs = ['src/main/assets']
    jniLibs.srcDirs = ['libs']
}

staging.java.srcDirs = ['src/local/java']
staging.res.srcDirs = ['src/local/res']

production.java.srcDirs = ['src/us/java']
production.res.srcDirs = ['src/us/res']

把main下的资源,列如Constant.java文件剪切+粘贴到”src/staging/java/com/xx/lib/Constant.java”和”src/production/java/com/xx/lib/Constant.java”的对应包下(注意千万不能保留main下的Constant.java文件,且两个包名路径必须是一样的),并且相应修改Constant.java里面的服务器地址,同理相关res文件也是一样

步骤分析:在Gradle进行构建时,它会现在main目录下寻找所需的.java文件,如果找不到,就会在构建时选择的渠道对应源码目录下寻找,如果此时main和渠道源码目录都有同一个.java文件,就会报“duplicate class(重复类)”错误。因此,应该删除main的原文件。

4.动态变量

declare in the gradle file:

productFlavors{
    xiaomi{
        buildConfigField "int", "APP_TYPE", "1"
        manifestPlaceholders = [CHANNEL_VALUE: "xiaomi",APP_NAME:"xiaomi版"]

    }
    huawei{
        buildConfigField "int", "APP_TYPE", "2"
        manifestPlaceholders = [CHANNEL_VALUE: "xiaomi",APP_NAME:"xiaomi版"]

    }
}

read in the java code:
int type = BuildConfig.APP_TYPE;

read in the Mainifest.xml:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="${APP_NAME}"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

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


    <meta-data android:name="CHANNEL"    android:value="${CHANNEL_VALUE}" />
</application>

5.生成apk命名规则

 // rename the apk with the version name(https://blog.youkuaiyun.com/hzypf/article/details/80251310)
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def date, buildName
            //get productFlavors's name
            variant.productFlavors.each { product ->
                buildName = product.name
            }
            if (variant.buildType.name == "release") {
                date = new Date().format("yyyyMMdd_HH_mm_ss", TimeZone.getTimeZone("GMT+8"))
                outputFileName = "TigerBox_${variant.buildType.name}_${variant.versionName}_${variant.versionCode}_${buildName}_${date}.apk"
            }
            if (variant.buildType.name == "debug") {
                date = new Date().format("yyyy_MM_dd", TimeZone.getTimeZone("GMT+8"))
                outputFileName = "TigerBox_${variant.versionName}_${variant.versionCode}_${buildName}_${date}.apk"
            }
        }
    }

6.不同buildType引用不同第三方库

使用方式:[buildTypeName+Compile] “xxx.xxx.xx”

//不同产品引入不同的包
productCompile "com.android.support:appcompat-v7:26.+"
tempCompile "com.android.support.constraint:constraint-layout:1.0.2"

7.build with productFlavor

切换好以后记得sync一下gradle文件(必须,否则会提示duplicate文件错误)

只要在app里切换就可以了,下面的会自动同步相同flavor

<think>嗯,用户想了解Android Studio中代码编译的相关配置和最佳实践。首先,我需要回忆一下自己之前处理过的类似问题,以及相关的文档和引用资料。根据用户提供的引用内容,引用[1]提到了build.gradle的配置,引用[2]和[3]讨论了第三方库的集成和布式构建,引用[4]则涉及Gradle的迁移和构建优化。这些应该都是重要的点。 首先,Gradle的配置优化是关键。模块化构建脚本可以提升可维护性,用户可能需要知道如何将大型build.gradle文件拆成更小的部。然后,依赖管理方面,统一版本号和使用动态版本号是常见的最佳实践,但动态版本号可能有风险,需要权衡。 构建变体也是重点,比如产品风味和构建类型,用户可能需要配置不同的环境,比如开发和生产环境的不同API地址。这部需要结合productFlavors和buildConfigField来设置。 然后是编译性能优化。引用[3]提到的布式构建可能对大型项目有帮助,比如开启并行构建和配置Gradle守护进程。此外,调整JVM内存设置也是常见做法,但需要根据机器配置来推荐。 增量编译和缓存机制,比如启用构建缓存和配置CI环境下的缓存路径,这些都能加快编译速度。用户可能关心如何实际应用这些设置,需要给出具体的Gradle属性配置。 第三方库集成方面,引用[2]以FFmpeg为例,可能需要使用CMakendkBuild来配置本地库,并设置正确的sourceSets。这部需要详细说明如何在Android Studio中添加本地库的路径。 最后是APK优化和代码混淆,这部涉及ProGuardR8的使用,以及资源缩减。引用[4]提到生成APK而不运行,所以可能需要配置不同的构建变体来生成不同版本的APK。 生成的相关问题需要覆盖用户可能进一步询问的方向,比如Gradle加速、构建变体配置、第三方库集成、APK优化、资源缩减和持续集成集成。这些应该能帮助用户深入探索各个子主题。 现在需要确保回答结构清晰,点说明,并且每个部都引用对应的引用资料。比如提到构建脚本模块化时引用[1]和[4],依赖管理引用[4],布式构建引用[3],第三方库引用[2]等。同时,代码示例要正确,使用正确的Gradle语法,并注意格式是否符合用户的要求,比如独立公式用$$...$$,但这里可能不需要数学公式,而是代码块。需要检查LaTeX语法是否正确,但用户的问题更多是关于Gradle配置,所以可能不需要数学表达式,但如果有的话要按规则处理。 另外,用户可能希望了解最新的最佳实践,比如是否推荐使用Kotlin DSL代替Groovy,者是否使用新版Gradle的特性。不过根据引用资料,可能没有提到这些,所以可能需要根据现有引用内容来回答,避免超出引用范围。 最后,确保回答使用中文,问题生成部覆盖用户可能感兴趣的方面,并且引用标识正确放置在对应的建议末尾。比如在提到并行构建时引用[3],在迁移项目时引用[4]等。</think>以下是为您整理的Android Studio编译配置最佳实践指南,结合Gradle优化和工程管理经验: ### 一、Gradle配置优化 1. **模块化构建脚本** ```groovy // 通用配置抽取到根build.gradle subprojects { apply plugin: 'com.android.library' android { compileSdkVersion 34 defaultConfig { minSdkVersion 21 targetSdkVersion 34 } } } ``` 2. **依赖管理规范** ```groedy // 版本号统一管理 ext { retrofit_version = '2.9.0' } dependencies { implementation "com.squareup.retrofit2:retrofit:$retrofit_version" } ``` 建议使用动态版本号谨慎(如`2.+`),推荐精确版本控制[^4] ### 二、构建性能优化 1. **开启并行编译(gradle.properties)** ```properties org.gradle.parallel=true org.gradle.daemon=true org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m ``` 通过布式构建可提升40%以上编译速度[^3] 2. **增量编译配置** ```groovy android { compileOptions { incremental = true } } ``` ### 三、构建变体管理 ```groovy flavorDimensions "env" productFlavors { dev { dimension "env" applicationIdSuffix ".dev" resValue "string", "app_name", "MyApp Dev" } prod { dimension "env" resValue "string", "app_name", "MyApp" } } ``` ### 四、第三方库集成实践 以FFmpeg为例的本地库配置: ```groovy android { sourceSets.main { jniLibs.srcDirs = ['src/main/jniLibs'] } externalNativeBuild { cmake { path "CMakeLists.txt" } } } ``` 需保持NDK版本与库架构匹配[^2] ### 五、APK优化配置 ```groovy buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ``` 建议开启R8代码优化器[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值