升級打包工具packer-ng-plugin支持V3簽名

升級打包工具packer-ng-plugin支持V3簽名

該庫github:https://github.com/mcxiaoke/packer-ng-plugin

升級後jar包下載地址: https://download.csdn.net/download/liuyu0915/11200365

前言:

打包工具packer-ng-plugin生成多渠道包的核心代碼是集成美團多渠道打包工具。美團已經升級了打包工具,支持將V3簽名後的包生成多渠道包,而packer-ng-plugin工具並沒有更新集成美團打包工具的代碼。

造成影響:使用v3簽名的apk,再用該庫創建渠道包,不能安裝在安卓9.0及以上系統上。這是因爲安卓9.0及以上系統首先校驗V3簽名,生成的渠道包帶有V3簽名,但該庫並不支持將V3簽名的apk包生成渠道包,所以不能安裝在9.0及以上系統上。不過,由v3簽名的apk生成的渠道包是可以安裝在9.0以下系統上的。這是因爲9.0以下系統不會校驗V3簽名。

解決辦法

方法一:使用V2簽名的apk創建渠道包。 這樣生成的渠道包沒有了V3簽名,就不會影響該庫寫入和讀取渠道信息,9.0及以上系統在未發現V3簽名時自動去校驗V2簽名。

 

方法二:升級該庫(packer-ng-plugin),使其支持v3簽名。將美團讀取和寫入渠道的代碼移值過來即可。

測試結果如下:

注:360加固未使用它默認勾選的“自動簽名功能”和“簽名校驗”功能。下面測試的順序是release包加固再簽名,再生成渠道包。最後安裝至8.0和9.0系統上。

源文件 360加固 簽名工具 是否是渠道包 簽名驗證 安裝狀況 提示信息
build-tools25.0.0 build-tools28.0.3 8.0系統 9.0系統
release安裝包   通過 正常安裝 正常安裝  
release安裝包   通過 正常安裝 不能安裝 1號信息
release安裝包 不能安裝 不能安裝 2號信息
release安裝包   通過 正常安裝 可以安裝  
release安裝包   通過 正常安裝 不能安裝 1號信息
release安裝包   通過 正常安裝 正常安裝  
                 
1號信息:安卓9.0系統安裝時提示簽名不一致。這是因爲apk使用了V3簽名,在安卓9.0及以上系統校驗V3簽名時不通過。
2號信息:只加固不能安裝。驗證簽名失敗,未發現簽名文件

結論:

1.360加固會破壞簽名文件,加固後需要重新簽名(未使用360自帶的自動簽名功能,建議不用360簽名)。

2.V3簽名的包可以在任何手機上安裝,但通過該庫生成的渠道包不能安裝在9.0及以上系統上。

備註:

1.V3簽名就是使用buildTools28.0.0及以版本進行簽名的。如果使用V2簽名可以使用25 26 27等版本的buildtools進行簽名。

2.無論是v3還是v2簽名的release包,都可以安裝在任何系統上。如上不能安裝在9.0及以上系統的故障是因爲使用v3簽名的apk,再用該庫創建渠道包,渠道包不能安裝。

 

升級打包工具packer-ng-plugin

具體步驟:

步驟一:將packer-ng-plugin下庫並導入工程

下載地址: https://github.com/mcxiaoke/packer-ng-plugin

步驟二:修改該庫寫入渠道信息的模塊 ,並生成jar包。

2.1依賴payload_writer庫,並在packer-ng-plugin庫中的Bridege類中修改如下。

2.2生成新的jar包。

該庫創建的task。執行cli>Tasks>other>distJar .執行後項目根目錄下面tools文件夾下的packer-ng-2.0.1.jar已經得到更新。


打開jar包可以看到代碼已經更新。

 

 步驟三:修改該庫讀取渠道信息的模塊,生成jar包導入安卓工程。

3.1 將安卓項目中依賴讀取渠道信息的庫導入到本地,再進行修改讀取渠道信息的那部分。同上述一樣。

也可以將美團payload_reader模塊打成jar包,通過ChannelReader來讀取渠道信息。代碼如下。

在安卓項目中調用下面getChannel(Context context)方法即可。

  public static String getChannel(final File file) {
        try {
            ChannelInfo channelInfo = ChannelReader.get(file);
            if (channelInfo != null) {
                String channel = channelInfo.getChannel();
                return channel;
            }
            return EMPTY_STRING;
        } catch (Exception e) {
            return EMPTY_STRING;
        }
    }

    public static String getChannel(final Context context) {
        try {
            return getChannelOrThrow(context);
        } catch (Exception e) {
            return EMPTY_STRING;
        }
    }

    public static synchronized String getChannelOrThrow(final Context context)
            throws IOException {
        final ApplicationInfo info = context.getApplicationInfo();
        File file = new File(info.sourceDir);
        return getChannel(file);
    }

 

 

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