Android studio 分渠道打包,引用不同的moudle

转自:https://github.com/itlgl/note/issues/36

 

如何简单的使用keystore文件为apk签名

  1. 在项目根目录下创建文件夹keystore,并将签名文件比如keystore1.jks放到目录下。
    比如创建的keystore1.jks文件,密码为pass4keystore;签名文件下有一个alias为itlgl,密码为pass4itlgl
  2. build.gradle文件下增加配置:
android {
    signingConfigs {
        keystore1 {
            keyAlias 'itlgl'
            keyPassword 'pass4itlgl'
            storeFile file('./keystore/keystore1.jks')
            storePassword 'pass4keystore'
        }
    }
    // 省略部分配置
	
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.keystore1
        }
        debug {
            signingConfig signingConfigs.keystore1
        }
    }
}

这样release版本和debug版本就都用keystore1.jks文件进行了签名

不同的渠道有不同的包名

android {
    // android studio升级以后,需要在文件中加上一个这个
    // https://blog.csdn.net/syif88/article/details/75009663
    flavorDimensions "test"
    productFlavors {
        dev {
            // 包名将被修改为com.itlgl.dev
            applicationId "com.itlgl.dev"
            // 也可以用下面这种后缀的方式,dev模式下将会在原有的applicationId后面缀上.dev
            // applicationIdSuffix ".dev"
        }

        stage {
            applicationId "com.itlgl.stage"
        }

        prod {
            applicationId "com.itlgl.prod"
        }
    }
}

不同的渠道修改不同的versionName

android {
    // android studio升级以后,需要在文件中加上一个这个
    // https://blog.csdn.net/syif88/article/details/75009663
    flavorDimensions "test"
    productFlavors {
        dev {
            // versionName将被修改为xxx_dev
            versionName "xxx_dev"
            // 也可以用下面这种后缀的方式,dev模式下将会在原有的versionName后面缀上_dev
            // versionNameSuffix "_dev"
        }

        stage {
            versionName "xxx_stage"
        }

        prod {
            versionName "xxx_prod"
        }
    }
}

不同渠道在资源文件添加不同字段

利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。
如下就根据不同的类型,添加了不同的 app_name 字段,以及定义了 布尔值,可以通过 R.string.app_name 来引用。
注意,这里是添加,是在 string.xml 里面添加了一个字段app_name,所以在现有的 string.xml 中不能有这个字段,否则会报错!!!

android {
    // android studio升级以后,需要在文件中加上一个这个
    // https://blog.csdn.net/syif88/article/details/75009663
    flavorDimensions "test"
    productFlavors {
        dev {
            resValue "string", "app_name", "dev_myapp"
            resValue "bool", "isrRank", 'false'
        }
        stage {
            resValue "string", "app_name", "stage_myapp"
            resValue "bool", "isrRank", 'true'
        }
        prod {
            resValue "string", "app_name", "myapp"
            resValue "bool", "isrRank", 'true'
        }
    }
}

通过以上我们大概可以推测出 color、dimen 也可以通过类似的方法添加。

不同渠道添加不同的常量到BuildConfig

  1. 在BuildConfig中定义字段
android {
    // android studio升级以后,需要在文件中加上一个这个
    // https://blog.csdn.net/syif88/article/details/75009663
    flavorDimensions "test"
    productFlavors {
        dev {
            buildConfigField "String", "ENVIRONMENT", '"dev"'
        }
        stage {
            buildConfigField "String", "ENVIRONMENT", '"stage"'
        }
        prod {
            buildConfigField "String", "ENVIRONMENT", '"prod"'
        }
    }
}
  1. 使用常量
    在我们自己的任意的类中,来直接通过 BuildConfig 就可以调用我们定义的字段。
public class Constants {
    public static final String ENVIRONMENT = BuildConfig.ENVIRONMENT;
}

不同渠道,修改 AndroidManifest.xml 里渠道变量

  1. 在 AndroidManifest.xml 里添加渠道变量

    ...
    
    ...
  1. 在 build.gradle 设置 productFlavors
android {
    // android studio升级以后,需要在文件中加上一个这个
    // https://blog.csdn.net/syif88/article/details/75009663
    flavorDimensions "test"
    productFlavors {
        dev {
            manifestPlaceholders = [ENVIRONMENT: "dev",
                                    app_icon   : "@drawable/icon_dev"]
        }
        stage {
            manifestPlaceholders = [ENVIRONMENT: "stage",
                                    app_icon   : "@drawable/icon_stage"]
        }
        prod {
            manifestPlaceholders = [ENVIRONMENT: "prod",
                                    app_icon   : "@drawable/icon_prod"]
        }
    }
}

不同环境,引用不同的 module

这个就很强大了,根据不同的环境,引用对应的 module。
你可以替换大量的图片,string,color,vaule等等。

首先,要建立跟渠道对应的 module,然后再引用。
引用方式如下:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // 引用本的项目
    devCompile project(':devModule')
    stageCompile project(':stageModule')
    prodCompile project(':prodModule')

    // 也可以分渠道引用网络的。因为这里都相同,所以地址也就都一样了
    devCompile 'com.roughike:bottom-bar:2.0.2'
    stageCompile 'com.roughike:bottom-bar:2.0.2'
    prodCompile 'com.roughike:bottom-bar:2.0.2'
}

如何修改不同渠道apk的名称

在gradle下添加:

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.itlgl"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    // android studio升级以后,需要在文件中加上一个这个
    // https://blog.csdn.net/syif88/article/details/75009663
    flavorDimensions "test"

    productFlavors {
        dev {
            versionNameSuffix "_dev"
        }
        stage {
            versionNameSuffix "_stage"
        }
        prod {
            versionNameSuffix "_prod"
        }
    }
    
    // 生成的apk名字就变成了
    // --build
    // ----outputs
    // ------apk
    // --------dev
    // ----------debug
    // ------------xxx_1_dev.apk
    // --------stage
    // ----------debug
    // ------------xxx_1_stage.apk
    // --------prod
    // ----------debug
    // ------------xxx_1_prod.apk
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "xxx_${defaultConfig.versionName}${variant.productFlavors[0].versionNameSuffix}.apk"
        }
    }
}

参考资料

  • Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
  • Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量
  • AndroidStudio多渠道打包,生成不同app
  • All flavors must now belong to a named flavor dimension
  • 解决Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com
  • Cannot set the value of read-only property 'outputFile'
  • Android Gradle 配置打包输出名称格式
  • android studio gradle配置apk名称

你可能感兴趣的:(Android)