Android 自动升级故障之血泪排查
背景
我们的创业项目,好不容易接到了一个单,要在合作厂商的安卓平板上安装一批我们研发的APP,首批已经安装成功,由于这是定制产品,所以我们没有自己的应用市场,采用APK包方式安装。
如果我们app做了更新,会推送到平板,平板电机下载按钮自动安装。
此前我们是自己的产品,是B2C模式,打包是 release。现在是客户定制版本,是 B2B2C,需要很多条件编译,例如区分来自那个合作厂商,因为后面涉及到的盈利分成。
解决方案
我们的解决方案就是,增加构建类型 buildTypes,然后通过下面三种方式给APP传递参数
manifestPlaceholders.put("app_name", "netkiller")
buildConfigField("String", "apiUrl", "\"https://api.netkiller.cn\"")
resValue("string", "baseUrl", "https://api.netkiller.cn")
这样编译之后,每个合作厂商都会有专属定制的内容。我们只需要为每个合作厂商提供对应的 apk 文件即可。
下面就是我们例子
plugins {
id("com.android.application")
}
android {
namespace = "cn.netkiller.student"
compileSdk = 33
defaultConfig {
applicationId = "cn.netkiller.student"
minSdk = 27
targetSdk = 33
versionCode = 1
versionName = "1.1.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
signingConfigs {
create("release") {
keyAlias = "key0"
keyPassword = "netkiller"
storeFile = file("netkiller.jks")
storePassword = "netkiller"
}
}
buildTypes {
create("dev") {
// signingConfig = signingConfigs.getByName("dev")
manifestPlaceholders.put("app_name", "Neo")
buildConfigField("String", "apiUrl", "\"http://192.168.3.10:8080\"")
buildConfigField("String", "resUrl", "\"http://res.netkiller.cn\"")
buildConfigField("String", "appId", "\"netkiller\"")
buildConfigField("String", "appKey", "\"netkiller-cbae-4c1e-9d09-8ce65d76627a\"")
buildConfigField("String", "appSecret", "\"5DA6CA3F-46C3-4B65-B5CF-5157F64B699F\"")
buildConfigField("String", "subject", "\"tablet\"")
buildConfigField("String", "mqttServerUri", "\"tcp://dev.netkiller.cn:1883\"")
buildConfigField("String", "mqttUsername", "\"netkiller\"")
buildConfigField("String", "mqttPassword", "\"6BAF9850-4075-4256-9106-688F28A335AD\"")
signingConfig = signingConfigs.getByName("release")
}
create("example") {
isDebuggable = true