Google Play app signing 最終完美解決方式+packer-ng渠道包信息添加

      App在經歷重重磨難之後,終於在Google Play商店上架,滿懷自信下載體驗,結果微信登錄異常,提示簽名不一致,[黑人疑問]

      查找原因之後,發現是在上傳App過程中,勾選了「谷歌簽名保護計劃」。所謂的「谷歌簽名保護計劃」,簡單來說,就是apk上傳到Google Play後,Google Play會替換APK本地簽名,實際上用戶下載的APK的簽名並不是你最初上傳的簽名,而是 Google Play 自己的簽名,這個簽名存放在 Google 服務器,我們是不能下載的。這就導致了線上版本和本地版本的簽名不一致, facebook 登錄失敗,google 登錄失敗、微信登錄失敗......

     線上版本APK開發者在發版之前是可以下載的,在上傳App之後,右邊有個下載入口點擊下載,彈出下面浮窗注意,原始APK是本地簽名的,派生APK就是Google Play商店用戶下載的APK,也就是經過Google Play再次簽名生成的APK。前面說了,勾選谷歌簽名保護計劃之後,Google會自動提供一個跟本地簽名不一致的app signing,這就是導致線上版本和本地版本的簽名不一致的原因。

      那麼如何解決這個問題呢?第一種方案,如果App還未發佈,重新創建一個同包名應用,不勾選谷歌簽名保護計劃,具體參考重新創建項目,不啓用app signing。第二種方案,App已經發布,這個時候不能重新創建新的同包名應用,只能修改Google Play app signing,具體參考Android Google Play app signing 最終完美解決方式關於Google Play app signing的坑 以及最終完美解決方式(替換自己的簽名)GooglePlay重簽名引發的第三方失效,統一解決有效,上面文章已經踩過坑,利用經驗順利替換Google Play app signing跟本地簽名一樣。

      至此,Google Play app signing簽名不一致的問題就解決了,微信登錄也能正常使用。項目使用的是packer-ng多渠道打包,通過packer-ng打的渠道包在下載派生APK分析渠道信息發現,APK的簽名信息爲null,[黑人疑問],仔細分析還是因爲Google Play重新簽名導致渠道信息丟失,也有人遇到相同問題,那隻能通過在AndroidManifest.xml配置渠道信息,我把配置信息代碼貼下來,僅供參考
AndroidManifest.xml

<!--google play渠道包只能放在xml寫死,不能使用packer-ng添加渠道信息-->
<meta-data
   android:name="XX_CHANNEL_NAME"
   android:value="${XX_CHANNEL_VALUE}" />

獲取渠道的工具類,MetaDataUtils是接入的blankj工具類,讀者亦可以從網上搜索如何獲取metaData數據。

    /**
     * 獲取渠道名稱
     */
    public String getChannel() {
        if (TextUtils.isEmpty(channel)) {
            channel = PackerNg.getChannel(Utils.getApp());
            // 如果沒有使用PackerNg打包添加渠道,默認返回的是"自定義渠道名"
            if (TextUtils.isEmpty(channel)) {
                channel = MetaDataUtils.getMetaDataInApp("XX_CHANNEL_NAME");
            }
            if (TextUtils.isEmpty(channel)) {
                channel = "自定義渠道名";
            }
        }
        return channel;
    }

app 主module配置,isJPushDefaultModel是區分google和普通App使用的極光SDK,極光SDK做成組件化,讀者可以不用理會這裏的邏輯。

    flavorDimensions "abi"
    productFlavors {
        if (isJPushDefaultModel) {
            //默認渠道,以packer-ng多渠道打包爲主,否則爲該值
            XX {
                dimension "abi"
            }
        } else {
            //google play渠道包只能放在xml寫死,不能使用packer-ng添加渠道信息
            google {
                dimension "abi"
            }
        }
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [XX_CHANNEL_VALUE: name]
        }
    }


      

參考文章:
Google Play app signing相關
0、重新創建項目,不啓用app signing
1、Android Google Play app signing 最終完美解決方式
2、關於Google Play app signing的坑 以及最終完美解決方式(替換自己的簽名)
3、GooglePlay重簽名引發的第三方失效,統一解決有效
多渠道配置相關
flavorDimensions和productFlavors——安卓gradle 強烈安利這篇博客,裏面的內容好全
packer-ng-plugin多渠道打包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章