如何简单的使用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许可证)