如何简单的使用keystore文件为apk签名
- 在项目根目录下创建文件夹
keystore,并将签名文件比如keystore1.jks放到目录下。
比如创建的keystore1.jks文件,密码为pass4keystore;签名文件下有一个alias为itlgl,密码为pass4itlgl。 - 在
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
- 在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"' } } } - 使用常量
在我们自己的任意的类中,来直接通过 BuildConfig 就可以调用我们定义的字段。public class Constants { public static final String ENVIRONMENT = BuildConfig.ENVIRONMENT; } 
不同渠道,修改 AndroidManifest.xml 里渠道变量
- 在 AndroidManifest.xml 里添加渠道变量
```xml 
2. 在 build.gradle 设置 productFlavors  
```gradle  
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名称
 
文档信息
- 本文作者:itlgl
 - 本文链接:https://itlgl.com/note/2019/03/26/issues-36/
 - 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)