Google Play 下架App之后的替身制作

前段时间升级 qq sdk 实现第三方登录功能。在用户手机未安装QQ时,会引导用户下载安装。Google Play 商店以它的规则为由下架了我们的App。这个问题很多开发者都遇到过,毕竟我们都得听 Google 的,规则制定者不是开玩笑的。经过沟通,坚决不让重新上架,提议换个包名拷贝代码,重新上传一个新的应用。我们当时按照这个简单的方法上架了紧急修复的App,但是考虑到后续功能迭代以及两个项目的维护成本,需要寻求一个新的方式来完成这些操作。

背景

公司有个老版本的读书软件一直在线上,但是很久没维护了。这次事故正好可以把老的软件作为壳子,替换成目前维护的新的App。这样可以避免用户流失(Google Play 渠道用户量本身就不是很大)。

修改应用ID

每个 Android 应用均有一个唯一的应用 ID,像 Java 软件包名称一样,如 com.example.myapp。 此 ID 可以在设备上和 Google Play 商店中对您的应用进行唯一标识。 如果您想要上传新版本的应用,应用 ID(以及使用它签署的证书)必须与原始 APK 相同 - 如果您更改应用 ID,Google Play 商店会将 APK 视为完全不同的应用。所以您发布应用后,绝不应更改应用 ID。

基于这个原则,我们实现的方式很简单,配置编译变体,指定特定的 applicationId

应用是基于 Walle 进行多渠道打包的,那么我们需要配置两个 productFlavors ,其中一个是对 Google Play 商店的定制版,另一个是使用 [Wally] 进行多渠道打包的基础apk。当然如果你没有做多渠道打包,那么也至少需要配置两个,毕竟你需要一个 未变体的 Apk 供其他渠道使用。

flavorDimensions "default" // 当只有一个时,不需要在 Flavors 中重复指定
productFlavors {
    google { // Google Play 商店的定制版
        applicationId "com.yun.reader"
    }

    yun { // 基础版本 apk
        applicationId "com.yun.news"
    }
}

好了,现在我们可以编译两个不同的 apk 了。

指定不同的签名

老版本的 Apk 签名和新开发 Apk 并不是用的同一个签名文件,所以,在productFlavors中需要指定签名文件。

首先我们需要定义签名文件:

android {
    signingConfigs {
        yun {
            if (System.getenv("YUN_NEWS_KEYSTORE_FILE") != null) {
                storeFile file(System.getenv("YUN_NEWS_KEYSTORE_FILE"))
                storePassword System.getenv("YUN_NEWS_KEYSTORE_PASSWORD")
                keyAlias System.getenv("YUN_NEWS_KEY_ALIAS")
                keyPassword System.getenv("YUN_NEWS_KEY_PASSWORD")
            }
        }

        google {
            if (System.getenv("YUN_READER_KEYSTORE_FILE") != null) {
                storeFile file(System.getenv("YUN_READER_KEYSTORE_FILE"))
                storePassword System.getenv("YUN_READER_KEYSTORE_PASSWORD")
                keyAlias System.getenv("YUN_READER_KEY_ALIAS")
                keyPassword System.getenv("YUN_READER_KEY_PASSWORD")
            }
        }
    }
}

看上面的代码你会发现,我们的路径都是放在远程编译服务器的环境变量中的,你也可以存放在本地的 local.properties 中,具体的操作可以自行Google。

两个签名定义完成,使用起来很简单:

flavorDimensions "default" // 当只有一个时,不需要在 Flavors 中重复指定
productFlavors {
    google { // Google Play 商店的定制版
        applicationId "com.yun.reader"
        signingConfig signingConfigs.google
    }

    yun { // 基础版本 apk
        applicationId "com.yun.news"
        signingConfig signingConfigs.yun
    }
}

这里有几点需要注意

  1. signingConfigs 声明需要放在 productFlavors 之前,否则找不到对应的自定义签名
  2. productFlavors 中已指定签名,需要把 buildTypes -> release 下面指定的签名删除,否则在编译 Release 版本时会覆盖掉 productFlavors 中指定的签名。

微信支付相关报错

我们替换掉 applicationId 之后,其实 Context.getPackageName() 方法返回的值也跟着变化了,那么,微信支付根据这个包名去查找相关的配置肯定是找不到的,所以,我们需要将 WXEntryActivityWXPayEntryActivity 拷贝一份到 com.yun.reader.wxapi 包名下面。记得在 manifests 中用绝对路径声明这两个 Activity。

有的同学就算这样配置之后,微信支付仍然会报错,因为我们改了 applicationId 导致以前默认是 news 的相关配置对 reader 是不适用的。所以我们需要为以前的代码背锅,将所有写死的地方改为配置型。

例如:
在微信支付时,需要传递 app_code 字段,让服务器在生成订单时,知晓当前的应用是哪一个,方便后续的校对。如果服务器直接写死了是 news, 那么在后续匹配中,news 申请的 支付码和 packageName 不能匹配,那么支付失败是必然的。

类似的问题还有 cookie , 与Web端交互的时候,对方会根据cookie来判别应用,所以Web端也需要做兼容。RN 端类似。

参考:https://developer.android.com/studio/build/application-id?hl=zh-cn

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 最近在项目中遇到需要实现 Apk 多渠道、定制化打包, Google 、百度查找了一些资料,成功实现了上述功能,在...
    看一季残花落幕阅读 2,490评论 1 8
  • 听说生活很忙 ——瘦桶 山高细水长流 秋风十里 今夜的风又吹向哪里 只有湖水 关闭了所有的秘密 安静的守...
    瘦桶阅读 367评论 1 23
  • 社会和谐与否,不仅取决于法律约束,更重要的是无形中的道德标准。而道德标准又取决于家庭背景,社会环境等多方面因素。协...
    梁梦婷阅读 157评论 0 1