Skip to content

Commit 71a7d2a

Browse files
committed
update BootV3 for abe
1 parent 585e2fd commit 71a7d2a

File tree

7 files changed

+162
-37
lines changed

7 files changed

+162
-37
lines changed

bbootimg/src/main/kotlin/avb/Avb.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ class Avb {
174174

175175
fun getJsonFileName(image_file: String): String {
176176
val jsonFile = File(image_file).name.removeSuffix(".img") + ".avb.json"
177-
log.warn("XXXX: json file = " + Helper.joinPath(Helper.prop("workDir")!!, jsonFile))
178177
return Helper.joinPath(Helper.prop("workDir")!!, jsonFile)
179178
}
180179

@@ -201,10 +200,17 @@ class Avb {
201200
}
202201

203202
fun updateVbmeta(fileName: String, desc: Any = HashDescriptor::class) {
204-
if (File("vbmeta.img").exists()) {
203+
val vbmetaCompanion = getJsonFileName("vbmeta.img")
204+
if (File(vbmetaCompanion).exists()) {
205205
log.info("Updating vbmeta.img side by side ...")
206206
val readBackInfo = ObjectMapper().readValue(File(getJsonFileName(fileName)), AVBInfo::class.java)
207-
val newHashDesc = AVBInfo.parseFrom(Dumpling("$fileName.signed"))
207+
val intermediateDir = Helper.joinPath(Helper.prop("workDir")!!, "intermediate")
208+
val newHashDesc = if (File(intermediateDir).exists()) {
209+
AVBInfo.parseFrom(Dumpling(Helper.joinPath(intermediateDir, "$fileName.signed")))
210+
} else {
211+
//FIXME: before BootV2 supports abe mode
212+
AVBInfo.parseFrom(Dumpling("$fileName.signed"))
213+
}
208214

209215
when (desc) {
210216
HashDescriptor::class -> {

bbootimg/src/main/kotlin/bootimg/Common.kt

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class Common {
135135
)
136136
ZipHelper.zcat(s.dumpFile + ".gz", s.dumpFile)
137137
}
138+
138139
ZipHelper.isXz(s.dumpFile) -> {
139140
log.info("ramdisk is compressed xz")
140141
Files.move(
@@ -144,15 +145,17 @@ class Common {
144145
ZipHelper.xzcat(s.dumpFile + ".xz", s.dumpFile)
145146
ret = "xz"
146147
}
148+
147149
ZipHelper.isLzma(s.dumpFile) -> {
148150
log.info("ramdisk is compressed lzma")
149151
Files.move(
150-
Paths.get(s.dumpFile), Paths.get(s.dumpFile + ".lzma"),
151-
java.nio.file.StandardCopyOption.REPLACE_EXISTING
152+
Paths.get(s.dumpFile), Paths.get(s.dumpFile + ".lzma"),
153+
java.nio.file.StandardCopyOption.REPLACE_EXISTING
152154
)
153155
ZipHelper.lzcat(s.dumpFile + ".lzma", s.dumpFile)
154156
ret = "lzma"
155157
}
158+
156159
ZipHelper.isLz4(s.dumpFile) -> {
157160
log.info("ramdisk is compressed lz4")
158161
Files.move(
@@ -162,6 +165,7 @@ class Common {
162165
ZipHelper.lz4cat(s.dumpFile + ".lz4", s.dumpFile)
163166
ret = "lz4"
164167
}
168+
165169
ZipHelper.isAndroidCpio(s.dumpFile) -> {
166170
log.info("ramdisk is uncompressed cpio")
167171
Files.copy(
@@ -170,6 +174,7 @@ class Common {
170174
)
171175
ret = "cpio"
172176
}
177+
173178
else -> {
174179
throw IllegalArgumentException("ramdisk is in unknown format")
175180
}
@@ -248,9 +253,11 @@ class Common {
248253
ramdiskGz.endsWith(".gz") -> {
249254
ZipHelper.minigzip(ramdiskGz, ByteArrayInputStream(outputStream.toByteArray()))
250255
}
256+
251257
ramdiskGz.endsWith(".lz4") -> {
252258
ZipHelper.lz4(ramdiskGz, ByteArrayInputStream(outputStream.toByteArray()))
253259
}
260+
254261
else -> {
255262
throw IllegalArgumentException("$ramdiskGz is not supported")
256263
}
@@ -268,26 +275,31 @@ class Common {
268275
AndroidCpio().pack(root, f, "${f}_filelist.txt")
269276
FileInputStream(f).use { ZipHelper.minigzip(ramdiskGz, it) }
270277
}
278+
271279
ramdiskGz.endsWith(".lz4") -> {
272280
val f = ramdiskGz.removeSuffix(".lz4")
273281
AndroidCpio().pack(root, f, "${f}_filelist.txt")
274282
FileInputStream(f).use { ZipHelper.lz4(ramdiskGz, it) }
275283
}
284+
276285
ramdiskGz.endsWith(".lzma") -> {
277286
val f = ramdiskGz.removeSuffix(".lzma")
278287
AndroidCpio().pack(root, f, "${f}_filelist.txt")
279288
FileInputStream(f).use { ZipHelper.lzma(ramdiskGz, it) }
280289
}
290+
281291
ramdiskGz.endsWith(".xz") -> {
282292
val f = ramdiskGz.removeSuffix(".xz")
283293
AndroidCpio().pack(root, f, "${f}_filelist.txt")
284294
FileInputStream(f).use { ZipHelper.xz(ramdiskGz, it, compressorArgs!!) }
285295
}
296+
286297
ramdiskGz.endsWith(".cpio") -> {
287298
val f = ramdiskGz.removeSuffix(".cpio")
288299
AndroidCpio().pack(root, f, "${f}_filelist.txt")
289300
File(f).copyTo(File(ramdiskGz), true)
290301
}
302+
291303
else -> {
292304
throw IllegalArgumentException("$ramdiskGz is not supported")
293305
}
@@ -381,9 +393,11 @@ class Common {
381393
log.warn("Os Major exceeds current max $MAX_ANDROID_VER")
382394
MAX_ANDROID_VER
383395
}
396+
384397
ret < 10 -> {
385398
10
386399
}
400+
387401
else -> {
388402
ret
389403
}
@@ -405,7 +419,8 @@ class Common {
405419
com.github.freva.asciitable.Column().header("Where")
406420
.headerAlign(HorizontalAlign.CENTER)
407421
.dataAlign(HorizontalAlign.LEFT)
408-
.with { it.second }))
422+
.with { it.second })
423+
)
409424
}
410425

411426
fun printPackSummary(imageName: String) {
@@ -441,5 +456,34 @@ class Common {
441456
log.info("\n\t\t\tPack Summary of ${imageName}\n{}\n{}", tableHeader.render(), tab.render())
442457
}
443458
}
459+
460+
fun printPackSummaryInternal(imageName: String) {
461+
val prints: MutableList<Pair<String, String>> = mutableListOf()
462+
val tableHeader = de.vandermeer.asciitable.AsciiTable().apply {
463+
addRule(); addRow("What", "Where"); addRule()
464+
}
465+
val tab = de.vandermeer.asciitable.AsciiTable().let {
466+
it.addRule()
467+
it.addRow("re-packed $imageName", Helper.prop("out.file"))
468+
prints.add(Pair("re-packed $imageName", Helper.prop("out.file")!!))
469+
it.addRule()
470+
it
471+
}
472+
if (File("vbmeta.img").exists()) {
473+
if (File("vbmeta.img.signed").exists()) {
474+
tab.addRow("re-packed vbmeta", "vbmeta.img.signed")
475+
prints.add(Pair("re-packed vbmeta", "vbmeta.img.signed"))
476+
} else {
477+
tab.addRow("re-packed vbmeta", "-")
478+
prints.add(Pair("re-packed vbmeta", "-"))
479+
}
480+
tab.addRule()
481+
}
482+
if (EnvironmentVerifier().isWindows) {
483+
log.info("\n" + Common.table2String(prints))
484+
} else {
485+
log.info("\n\t\t\tPack Summary of ${imageName}\n{}\n{}", tableHeader.render(), tab.render())
486+
}
487+
}
444488
}
445489
}

bbootimg/src/main/kotlin/bootimg/v3/BootV3.kt

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -214,27 +214,50 @@ data class BootV3(
214214
}
215215

216216
fun sign(fileName: String): BootV3 {
217-
log.warn("XXXX: sign $fileName")
217+
var bSigningNeeded = false
218218
if (File(Avb.getJsonFileName(info.role)).exists()) {
219+
bSigningNeeded = true
219220
Signer.signAVB(
220221
Helper.joinPath(Helper.prop("intermediateDir")!!, info.role),
221222
this.info.imageSize,
222223
String.format(Helper.prop("avbtool")!!, "v1.2")
223224
)
224225
} else {
226+
bSigningNeeded = false
225227
log.warn("no AVB info found, assume it's clear image")
226228
}
229+
227230
if (fileName != info.role) {
228-
File(Helper.joinPath(Helper.prop("intermediateDir")!!, info.role + ".signed")).copyTo(File(fileName), true)
229-
log.info("Signed image saved as $fileName")
231+
Helper.setProp("out.file", fileName)
232+
if (bSigningNeeded) {
233+
//@formatter:off
234+
File(Helper.joinPath(Helper.prop("intermediateDir")!!, info.role + ".signed"))
235+
.copyTo(File(fileName), true)
236+
//@formatter:on
237+
log.info("Signed image saved as $fileName")
238+
} else {
239+
//@formatter:off
240+
File(Helper.joinPath(Helper.prop("intermediateDir")!!, info.role + ".clear"))
241+
.copyTo(File(fileName), true)
242+
//@formatter:on
243+
log.info("Unsigned image saved as $fileName")
244+
}
230245
} else {
231-
File(
232-
Helper.joinPath(
233-
Helper.prop("intermediateDir")!!,
234-
info.role + ".signed"
235-
)
236-
).copyTo(File(info.role + ".signed"), true)
237-
log.info("Signed image saved as ${info.role}.signed")
246+
if (bSigningNeeded) {
247+
Helper.setProp("out.file", info.role + ".signed")
248+
//@formatter:off
249+
File(Helper.joinPath(Helper.prop("intermediateDir")!!, info.role + ".signed"))
250+
.copyTo(File(info.role + ".signed"), true)
251+
//@formatter:on
252+
log.info("Signed image saved as ${info.role}.signed")
253+
} else {
254+
Helper.setProp("out.file", info.role + ".clear")
255+
//@formatter:off
256+
File(Helper.joinPath(Helper.prop("intermediateDir")!!, info.role + ".clear"))
257+
.copyTo(File(info.role + ".clear"), true)
258+
//@formatter:on
259+
log.info("Unsigned image saved as ${info.role}.clear")
260+
}
238261
}
239262
return this
240263
}
@@ -284,11 +307,12 @@ data class BootV3(
284307
fun extractVBMeta(): BootV3 {
285308
// vbmeta in image
286309
try {
287-
log.warn("XXXX: info.output ${info.input}")
310+
val vbmetaCompanion = Helper.joinPath(File(info.input).parentFile.normalize().path, "vbmeta.img")
311+
log.info("XXXX: $vbmetaCompanion")
288312
val ai = AVBInfo.parseFrom(Dumpling(info.input)).dumpDefault(info.role)
289-
if (File("vbmeta.img").exists()) {
313+
if (File(vbmetaCompanion).exists()) {
290314
log.warn("Found vbmeta.img, parsing ...")
291-
VBMetaParser().unpack("vbmeta.img")
315+
VBMetaParser().unpack(vbmetaCompanion)
292316
}
293317
} catch (e: IllegalArgumentException) {
294318
log.warn(e.message)
@@ -368,7 +392,6 @@ data class BootV3(
368392
it.addRow("kernel", this.kernel.file)
369393
prints.add(Pair("kernel", this.kernel.file))
370394
File(Helper.joinPath(workDir, Helper.prop("kernelVersionStem")!!)).let { kernelVersionFile ->
371-
log.warn("XXXX: kernelVersionFile ${kernelVersionFile.path}")
372395
if (kernelVersionFile.exists()) {
373396
it.addRow("\\-- version " + kernelVersionFile.readLines().toString(), kernelVersionFile.path)
374397
prints.add(
@@ -380,7 +403,6 @@ data class BootV3(
380403
}
381404
}
382405
File(Helper.joinPath(workDir, Helper.prop("kernelConfigStem")!!)).let { kernelConfigFile ->
383-
log.warn("XXXX: kernelConfigFile ${kernelConfigFile.path}")
384406
if (kernelConfigFile.exists()) {
385407
it.addRow("\\-- config", kernelConfigFile.path)
386408
prints.add(Pair("\\-- config", kernelConfigFile.path))
@@ -460,14 +482,19 @@ data class BootV3(
460482
it
461483
}
462484
val tabVBMeta = AsciiTable().let {
463-
if (File("vbmeta.img").exists()) {
485+
val vbmetaCompanion = Helper.joinPath(File(info.input).parentFile.normalize().path, "vbmeta.img")
486+
log.warn("XXXX: vbmetaCompanion: $vbmetaCompanion")
487+
if (File(vbmetaCompanion).exists()) {
488+
log.warn("XXXX: Found vbmeta.img, parsing ...")
489+
//basic
490+
prints.add(Pair("vbmeta.img", Avb.getJsonFileName("vbmeta.img")))
491+
//table
464492
it.addRule()
465493
it.addRow("vbmeta.img", Avb.getJsonFileName("vbmeta.img"))
466494
it.addRule()
467495
"\n" + it.render()
468-
//basic
469-
prints.add(Pair("vbmeta.img", Avb.getJsonFileName("vbmeta.img")))
470496
} else {
497+
log.warn("XXXX: no vbmeta.img found")
471498
""
472499
}
473500
}
@@ -483,7 +510,7 @@ data class BootV3(
483510
}
484511

485512
fun printPackSummary(fileName: String): BootV3 {
486-
Common.printPackSummary(fileName)
513+
Common.printPackSummaryInternal(fileName)
487514
return this
488515
}
489516

bbootimg/src/main/kotlin/packable/BootImgParser.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,10 @@ class BootImgParser : IPackable {
4949
}
5050

5151
fun unpackInternal(targetFile: String, fileName: String, unpackDir: String) {
52-
log.warn("Unpacking $fileName")
53-
log.warn("fileName: $fileName, unpackDir: $unpackDir")
52+
log.info("unpackInternal(fileName: $fileName, unpackDir: $unpackDir)")
5453
Helper.setProp("workDir", unpackDir)
5554
clear()
56-
File("$outDir/role").writeText(File(File(fileName).canonicalPath).name)
55+
File("$outDir/role").writeText(File(File(targetFile).canonicalPath).name)
5756
val hv = probeHeaderVersion(fileName)
5857
log.info("header version $hv")
5958
when (hv) {
@@ -87,7 +86,7 @@ class BootImgParser : IPackable {
8786
}
8887

8988
fun packInternal(targetFile: String, workspace: String, fileName: String) {
90-
log.warn("XXXX: targetFile: $targetFile, fileName: $fileName, workspace: $workspace")
89+
log.info("packInternal(targetFile: $targetFile, fileName: $fileName, workspace: $workspace)")
9190
Helper.setProp("workDir", workspace)
9291
val cfgFile = Helper.joinPath(outDir, targetFile.removeSuffix(".img") + ".json")
9392
log.info("Loading config from $cfgFile")
@@ -113,7 +112,7 @@ class BootImgParser : IPackable {
113112
}
114113
}
115114
if (worker == null) {
116-
log.warn("XXXX: worker is null")
115+
log.error("no worker available")
117116
exitProcess(2)
118117
}
119118
when (worker) {
@@ -130,7 +129,7 @@ class BootImgParser : IPackable {
130129
.pack()
131130
.sign(fileName)
132131
.updateVbmeta()
133-
.printPackSummary(fileName)
132+
.printPackSummary(worker.info.role)
134133
}
135134

136135
else -> {

bbootimg/src/main/kotlin/packable/PackableLauncher.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@
1414

1515
package cfig.packable
1616

17-
import rom.sparse.SparseImgParser
1817
import org.slf4j.LoggerFactory
1918
import packable.DeviceTreeParser
19+
import rom.sparse.SparseImgParser
2020
import java.io.File
21-
import java.util.*
2221
import java.util.regex.Pattern
2322
import kotlin.reflect.KClass
2423
import kotlin.reflect.full.createInstance
@@ -98,9 +97,9 @@ fun main(args: Array<String>) {
9897
// /* 2 */ no-args & handler : help for Handler
9998
// /* 3 */ args & no-handler: do nothing
10099
// /* 4 */ args & handler : work
100+
log.warn("args: ${args.size}, targetHandler: $targetHandler")
101101
when (listOf(args.isNotEmpty(), targetHandler != null)) {
102102
listOf(false, false) -> { /* 1 */
103-
log.warn("args: ${args.size}, targetHandler: $targetHandler")
104103
log.info("help:")
105104
log.info("available IPackable subcommands are:")
106105
IPackable::class.declaredFunctions.forEach {
@@ -110,7 +109,6 @@ fun main(args: Array<String>) {
110109
}
111110

112111
listOf(false, true) -> {/* 2 */
113-
log.warn("args: ${args.size}, targetHandler: $targetHandler")
114112
log.info("available ${targetHandler!!.simpleName} subcommands are:")
115113
targetHandler!!.declaredFunctions.forEach {
116114
log.info("\t" + it.name)
@@ -119,13 +117,11 @@ fun main(args: Array<String>) {
119117
}
120118

121119
listOf(true, false) -> {/* 3 */
122-
log.warn("args: ${args.size}, targetHandler: $targetHandler")
123120
log.warn("No handler is activated, DO NOTHING!")
124121
exitProcess(2)
125122
}
126123

127124
listOf(true, true) -> {/* 4 */
128-
log.warn("args: ${args.size}, targetHandler: $targetHandler")
129125
log.info("continue ...")
130126
}
131127
}

0 commit comments

Comments
 (0)