对Gradle 7.x的支持,欢迎提PR,或者Fork自己修改(2022.06.27)
Чрезвычайно быстрый инструмент упаковки каналов
Версия V2 поддерживает только APK Signature Scheme v2
, для которой требуется v2SigningEnabled true
в signingConfigs
, чтобы включить новую версию режима подписи. Если вам нужно использовать более старую версию, см. v1.0.9 здесь.
Packer-ng-plugin — это плагин Gradle для упаковки каналов Android. Он поддерживает чрезвычайно быструю упаковку. Для создания 100 пакетов каналов требуется всего 10 секунд. Скорость более чем в 300 раз превышает скорость gradle-packer-plugin . Его можно легко использовать для интеграции системы 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
Файл списка имен каналов представляет собой обычный текстовый файл, читаемый построчно, по одному каналу в строке. Если есть комментарии, используйте #
для разделения имени канала и комментариев. .
Рекомендуется в названии канала использовать как можно больше стандартных китайских, английских символов и цифр , а также не использовать специальные символы и невидимые символы. Пример: каналы.txt
productFlavors
в проекте не используются
./gradlew clean apkRelease
productFlavors
используются в проекте
Если в проекте указано несколько flavor
, вам необходимо указать имя flavor
необходимо упаковать в канал. Предположим, что у вас есть два flavor
, Paid
Free
, и команда при упаковке выглядит следующим образом:
./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}
format
output
этих channels
параметров можно использовать в комбинации, а параметры командной строки будут переопределять соответствующие свойства build.gradle
.
Инструкции по командам упаковки Gradle
Имя задачи, упакованной каналом, — apk${flavor}${buildType}
Тип сборки обычно — это версия, или это может быть бета-версия или какой-либо другой тип, который вы указываете. Если flavor
отсутствует, вы можете его игнорировать. При его использовании буква должна быть заглавной. Предположим, что flavor
— Paid
, release
Имя задачи, соответствующее типу, — apkPaidRelease
, имя задачи, соответствующее beta
типу, — apkPaidBetaBeta
, и так далее для остальных.
Специальное напоминание
Если вы одновременно используете другие инструменты сжатия ресурсов или функции защиты приложений, используйте упаковку сценариев командной строки для добавления информации о канале. Добавление информации о канале должно быть размещено на последнем этапе процесса обработки APK.
Помимо использования интеграции Gradle, вы также можете использовать пакет Java-скриптов, предоставляемый проектом. Jar находится в каталоге tools
этого проекта. Здесь и далее для ссылки на java -jar tools/packer-ng-2.0.1.jar
используется 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}
.
Если имя вашего пакета приложения — 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
(имя пакета приложения packageName)buildType
(релиз/отладка/бета и т. д.)flavor
(название вкуса, например платный/бесплатный и т. д.)versionName
(номер версии, используемый для отображения)versionCode
(номер сборки)buildTime
(дата и время сборки)fileSHA1
(хеш SHA1 окончательного APK-файла) Реализация чтения каналов на языке C построена с использованием GenericMakefile, а Java-реализация чтения и записи блока подписи APK модифицирована из 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.