对Gradle 7.x的支持,欢迎提PR,或者Fork自己修改(2022.06.27)
เครื่องมือบรรจุช่องที่รวดเร็วเป็นพิเศษ
เวอร์ชัน V2 รองรับเฉพาะ APK Signature Scheme v2
ซึ่งต้องใช้ v2SigningEnabled true
ใน signingConfigs
เพื่อเปิดใช้งานเวอร์ชันใหม่ของโหมดลายเซ็น หากคุณต้องการใช้เวอร์ชันเก่า โปรดดู v1.0.9 ที่นี่
packer-ng-plugin เป็นเครื่องมือบรรจุภัณฑ์ช่อง Android รุ่นต่อไป รองรับการบรรจุภัณฑ์ที่รวดเร็วมาก ใช้เวลาเพียง 10 วินาทีในการสร้างแพ็คเกจ 100 ช่อง ความเร็วมากกว่า 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
ไฟล์รายการชื่อช่องเป็นไฟล์ข้อความธรรมดา อ่านทีละบรรทัด โดยละเว้นช่องว่างที่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัด หากมีความคิดเห็น ให้ใช้ #
เพื่อแยกชื่อช่องและความคิดเห็น .
ขอแนะนำให้ชื่อช่องใช้ ภาษาจีนมาตรฐาน อังกฤษ และตัวเลข ให้มากที่สุด และอย่าใช้อักขระพิเศษและอักขระที่มองไม่เห็น ตัวอย่าง: channel.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}
โดยปกติแล้ว buildType จะเป็นเวอร์ชันเบต้าหรือบางประเภทที่คุณระบุ หากไม่มี flavor
คุณสามารถเพิกเฉยต่อสิ่งแรกได้ ตัวอักษรจะต้องเป็นตัวพิมพ์ release
เมื่อใช้งาน สมมติว่าเป็น Paid
ชื่อ flavor
ที่สอดคล้องกับประเภทคือ apkPaidRelease
ชื่องานที่สอดคล้องกับประเภท beta
คือ apkPaidBetaBeta
และอื่น ๆ
คำเตือนพิเศษ
หากคุณใช้เครื่องมือบีบอัดทรัพยากรอื่นๆ หรือฟังก์ชันเสริมความแข็งแกร่งของแอปพลิเคชันในเวลาเดียวกัน โปรดใช้แพ็คเกจสคริปต์บรรทัดคำสั่งเพื่อเพิ่มข้อมูลช่องสัญญาณจะต้องอยู่ในขั้นตอนสุดท้ายของกระบวนการประมวลผล APK
นอกเหนือจากการใช้การรวม Gradle แล้ว คุณยังสามารถใช้แพ็กเกจสคริปต์ Java ที่จัดทำ packer-ng
โปรเจ็กต์ได้ด้วย Jar อยู่ในไดเร็กทอรี tools
ของโปรเจ็กต์นี้ โปรดใช้เวอร์ชันล่าสุดเพื่ออ้างถึง 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 Signing Block ได้รับการแก้ไขจาก 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.