对Gradle 7.x的支持,欢迎提PR,或者Fork自己修改(2022.06.27)
極速通路打包工具
V2版只支援APK Signature Scheme v2
,要求在signingConfigs
裡v2SigningEnabled true
啟用新版簽章模式,如果你需要使用舊版,請看這裡v1.0.9。
packer-ng-plugin是下一代Android渠道打包工具Gradle插件,支援極速打包, 100個渠道包只需要10秒鐘,速度是gradle-packer-plugin的300倍以上,可方便的用於CI系統集成,同時提供命令列打包腳本,頻道讀取提供Python和C語言的實作。
Maven Central
// build.gradle
buildscript {
dependencies{
classpath ' com.mcxiaoke.packer-ng:plugin:2.0.1 '
}
}
apply plugin : ' packer '
// build.gradle
dependencies {
compile ' com.mcxiaoke.packer-ng:helper:2.0.1 '
}
注意: plugin
和helper
的版本號碼需要保持一致
packer {
archiveNameFormat = ' ${buildType}-v${versionName}-${channel} '
archiveOutput = new File (project . rootProject . buildDir, " apks " )
// channelList = ['*Douban*', 'Google/', '中文/@#市场', 'Hello@World',
// 'GradleTest', '20070601!@#$%^&*(){}:"<>?-=[];',./']
// channelFile = new File(project.rootDir, "markets.txt")
channelMap = [
" Cat " : project . rootProject . file( " channels/cat.txt " ),
" Dog " : project . rootProject . file( " channels/dog.txt " ),
" Fish " : project . rootProject . file( " channels/channels.txt " )
]
}
${appPkg}-${channel}-${buildType}-v${versionName}-${versionCode}
(可選)${project.buildDir}/archives
(可選)注意: channelList
/ channelMap
/ channelFile
不能同時使用,根據實際情況選擇一種即可,三個屬性同時存在時優先級為: channelList
> channelMap
> channelFile
,另外,這三個屬性會被命令列參數-Pchannels
覆蓋。
渠道名列表文件是純文字文件,按行讀取,每行一個渠道,行首和行尾的空白會被忽略,如果有註釋,渠道名和註釋之間用#
分割。
渠道名建議盡量使用規範的中英文和數字,不要使用特殊字元和不可見字元。範例:channels.txt
專案中沒有使用productFlavors
./gradlew clean apkRelease
專案中使用了productFlavors
如果專案中指定了多個flavor
,需要指定需要打渠道包的flavor
名字,假設你有Paid
Free
兩個flavor
,打包的時候命令如下:
./gradlew clean apkPaidRelease
./gradlew clean apkFreeRelease
直接使用./gradlew clean apkRelease
會輸出所有flavor
的頻道包。
透過參數直接指定頻道清單(會覆寫build.gradle
中的屬性):
./gradlew clean apkRelease -Pchannels=ch1,ch2,douban,google
渠道數目很少時可以使用此種方式。
透過參數指定頻道清單檔案的位置(會覆寫build.gradle
中的屬性):
./gradlew clean apkRelease [email protected]
使用@符號指定頻道清單檔案的位置,使用相對於項目根目錄的相對路徑。
也可以指定輸出目錄和檔名格式模版:
./gradlew clean apkRelease -Poutput=build/apks
./gradlew clean apkRelease -Pformat= ${versionName} - ${channel}
這些參數channels
output
format
可以組合使用,命令列參數會覆蓋build.gradle
對應的屬性。
Gradle打包指令說明
渠道打包的Task名字是apk${flavor}${buildType}
buildType一般是release,也可以是你自己指定的beta或者someOtherType,如果沒有flavor
可以忽略,使用時首字母需要大寫,假設flavor
是Paid
, release
類型對應的任務名稱是apkPaidRelease
, beta
類型對應的任務名稱是apkPaidBetaBeta
,其它的以此類推。
特別提示
如果你同時使用其它的資源壓縮工具或應用加固功能,請使用命令列腳本打包增加渠道信息,增加渠道信息需要放在APK處理過程的最後一步。
除了使用Gradle整合以外,還可以使用專案提供的Java腳本打包,Jar位於本專案的tools
目錄,請使用最新版,以下以packer-ng
指涉java -jar tools/packer-ng-2.0.1.jar
,下面是幾個範例。
packer-ng - 表示 java -jar packer-ng-2.0.1.jar
channels.txt - 替换成你的渠道列表文件的实际路径
build/archives - 替换成你指定的渠道包的输出路径
app.apk - 替换成你要打渠道包的APK文件的实际路径
packer-ng generate --channels=ch1,ch2,ch3 --output=build/archives app.apk
packer-ng generate [email protected] --output=build/archives app.apk
packer-ng verify app.apk
java -jar tools/packer-ng-2.0.1.jar --help
python tools/packer-ng-v2.py app.apk
cd tools
make
make install
packer app.apk
// 如果没有找到渠道信息或遇到错误,默认返回的是""
// com.mcxiaoke.packer.helper.PackerNg
String channel = PackerNg . getChannel ( Context )
格式模版使用Groovy字串模版引擎,預設檔名格式為: ${appPkg}-${channel}-${buildType}-v${versionName}-${versionCode}
。
假如你的App套件名稱是com.your.company
,頻道名稱是Google_Play
, buildType
是release
, versionName
是2.1.15
, versionCode
是200115
,那麼產生的預設APK的檔案名稱是com.your.company-Google_Player-release-2.1.15-20015.apk
。
可使用以下變數:
applicationId
(App套件名稱packageName)buildType
(release/debug/beta等)flavor
(flavor名字,如paid/free等)versionName
(顯示使用的版本號)versionCode
(內部版本號)buildTime
(編譯建置日期時間)fileSHA1
(最終APK檔案的SHA1雜湊值) 頻道讀取C語言實作使用GenericMakefile 構建,APK Signing Block 讀取和寫入Java實作修改自apksig 和walle ,特此致謝。
Copyright 2014 - 2021 Xiaoke Zhang
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.