Issue #130: payload.bin unpack enhancement

- support ZERO op
- support extracting only 1 specified partition
Usage:
    gradle unpack -Dpart=<part_name>
Example:
    gradle unpack -Dpart=boot
    gradle unpack -Dpart=system
Note:
    "build/payload/" will be deleted before each "unpack" task
pull/140/head
cfig 1 year ago
parent a8c3166994
commit 08f1d3b548
No known key found for this signature in database
GPG Key ID: B104C307F0FDABB7

3
.gitignore vendored

@ -2,4 +2,7 @@
.gradle
build/
local.properties
.classpath
.project
.settings
__pycache__

@ -15,7 +15,7 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.9.0"
kotlin("jvm") version "1.9.20"
application
}

@ -16,8 +16,8 @@ package cc.cfig.droid.ota
import cc.cfig.io.Struct
import cfig.helper.CryptoHelper.Hasher
import cfig.helper.Helper
import cfig.helper.Dumpling
import cfig.helper.Helper
import chromeos_update_engine.UpdateMetadata
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.databind.ObjectMapper
@ -181,6 +181,14 @@ class Payload {
UpdateMetadata.InstallOperation.Type.REPLACE_XZ -> CommandLine("xzcat")
UpdateMetadata.InstallOperation.Type.REPLACE_BZ -> CommandLine("bzcat")
UpdateMetadata.InstallOperation.Type.REPLACE -> return inBytes
UpdateMetadata.InstallOperation.Type.ZERO -> {
if (inBytes.any { it.toInt() != 0 }) {
throw IllegalArgumentException("ZERO is not zero")
}
log.warn("op type ZERO: ${inBytes.size} bytes")
return inBytes
}
else -> throw IllegalArgumentException(opType.toString())
}
cmd.addArgument("-")
@ -196,7 +204,7 @@ class Payload {
sortBy { it.getDstExtents(0).startBlock }
}
ops.forEach { op ->
log.debug(pu.partitionName + ": " + (op.getDstExtents(0).startBlock * this.manifest.blockSize) + ", size=" + op.dataLength)
log.debug(pu.partitionName + ": " + (op.getDstExtents(0).startBlock * this.manifest.blockSize) + ", size=" + op.dataLength + ", type=" + op.type)
val piece = ByteArray(op.dataLength.toInt()).let {
ras.seek(this.dataOffset + op.dataOffset)
ras.read(it)
@ -210,7 +218,7 @@ class Payload {
fun setUp() {
File(workDir).let {
if (it.exists()) {
log.info("Removing $workDir")
log.info("Removing $workDir")
it.deleteRecursively()
}
log.info("Creating $workDir")
@ -225,9 +233,21 @@ class Payload {
val parts = this.manifest.partitionsList.map { it.partitionName }
log.info("There are $totalNum partitions $parts")
log.info("dumping images to $workDir")
this.manifest.partitionsList.forEach { pu ->
unpackInternal(ras, pu, String.format("%2d/%d", currentNum, totalNum))
currentNum++
val partArg = System.getProperty("part", "")
if (partArg.isNotBlank()) {
//Usage: gradle unpack -Dpart=vendor_boot
log.warn("dumping partition [$partArg] only")
this.manifest.partitionsList
.filter { it.partitionName == partArg }
.forEach { pu ->
unpackInternal(ras, pu, String.format("%2d/%d", currentNum, totalNum))
currentNum++
}
} else {
this.manifest.partitionsList.forEach { pu ->
unpackInternal(ras, pu, String.format("%2d/%d", currentNum, totalNum))
currentNum++
}
}
}
}

@ -15,6 +15,7 @@
package cfig.packable
import cc.cfig.droid.ota.Payload
import cfig.helper.Helper.Companion.deleteIfExists
import org.slf4j.LoggerFactory
class PayloadBinParser : IPackable {
@ -45,6 +46,8 @@ class PayloadBinParser : IPackable {
}
fun clear(fileName: String) {
super.clear()
fileName.deleteIfExists()
}
override fun flash(fileName: String, deviceName: String) {

@ -118,4 +118,11 @@
"algorithm" : "SHA256_RSA4096",
"pubk" : "AAAQAB696fOqmcvPXp24WvrWaiOAGtKfhdEcA1qb8i/z1aNA7pMnUaJrP+eWn22VfnViO9+OhvdM6c7+9f6BtThWfyMgtYhGC1iLwBdy9ywNOqY+/AxLKv5IpCCAVL4AyRPf+22ETAjyIqdDykGCRC6LWIGXoWT+fBuZaGGQ635A5lqp1ZhMvaCaCd+fJpZ2NvymO3RRISZyhMaVSMJbGi3p6aLT8NuAzk7VxMIooBV5U5FQ3ExhWSakrjR/zoyFVazzhBtywAv/dXSxivaN/2BpoEXUWlZShk2A1hNkvxT2vIslxXhKUyo38D3f328bDDl9j6hdrZPRwd/iZFH2sWsnzQNZ1Uq/CWIqJxr73sZCx0+EC+h2nYGrhUxPeY1M9ST/bhRroLb67JjGwidKo3LlX5BAysTiUj0jevYmEMRgzCQERxWmknNI/FpySAkAvxO2h9eaJtdcU34MfI62xck3p3rpp+jv88OTV2xUsmaPU2WCVuECkZALzKwGkVpc9uuTRBtviXOpqZcmRjKAcVg1bWFqEsgAONzwyLSUMNkZQbidz+MAObmE5I4NpqDXFU6nz7XWXfKbKQzaG5Mg9TGacBSQY4+dubeUJrO41FxtjHHzImvaLfXD+/EGbaaeqGAjB2Vo02v6dBCXd8bOyOL0rq9kzfTmfQQHjUaEvfGxE1mVJb8oxZ/EwsMVoCj0oz8cgGVVJg65JfvHjHnUKGwWHg9jQIedAZawHvRcYlSulh4BvfiDsHY9zIT5NkZ5gNXP8BFVsXMhX/xWYXa39Tlls2eq6n0s3B/YU+myyYiOL6QFsoNB1QX1fNkZKAgEQpcwRapXHHlvRwdKP8FscyLKmwdBfKg8RZeIZ/9TXL49mq3ocbfrX8se/DdPT61V2nGbApmPErcCrgtbUrxwV1a4LI3C5aMP+52brzOrUYLMeotd8xFgZj1DVgP0nKmuYeq2kzgeTOBWud53KQ+qBcegk942LGGNr1BSuBynkBywTm7iZHidjONcJUgiaB+NnCYewbLDwF21bRphkXthvak/Di2KcVugDUOGblb6X4XNR++ZTnZiBw6IbY85eL2YddPJg4ZH1zNIWa9rRuv9q6VWX1XD5+J92bd34EPuMLrmGvXgYpbfzfuqqLGpPBvbqoRfdgHe7CSe0xa3lDePOTll8sDsKKnr8jOW9CvsbS1s6+x8Nie2UFPwsb/LvfmhhsRTmlZaESRltCOjdZ+XbnSaCw7of/4oQfjk3gLiFNlH6uHDOTdi/QuFsGselWCi8I3NsMf57+1FXiQZsXbR59D+uooDC+J75IDlp2/fkBOVsyTEXe3C4gznsbvoN9GjzkAEo7uti2hjTwhaXHTQ2o3T6XpEBQzj",
"sha1" : "b42c87bedcf600d7bebe3dbade2444e9724c3159"
} ]
}, {
"device" : "OnePlus 9",
"manufacturer" : "OnePlus",
"algorithm" : "SHA256_RSA4096",
"pubk" : "AAAQAJ9bJvuspEBdWZsVzvQNS/UIWMBHJaW/gqgIk49TvV6GuPM5lHkWmmSeYBKYcVeGW4QTLfF9sonh1IZFlvRkdhcKsyqz4t33bGqtw+ZEbtHCLC5W3QfnTAtOMlKV/8hVImvJjul0RuBnyTZTVGltmpAeb/lq2gTuzjfxebIyNMkKhzmyIIKPtYWUXzVpz+ZBCqpfVqiRZNMNv24jhD1eDKWR5UgTihhjI/CbZGDPhLOy/C3H02sZRN/pJshZTyL/vv+OVu4ZW4arlN6P9DiXskav9puv4L7PlhWJzlm15ReCUxnmekHK9EAJWIdVcKmcraofUIewki4BPCSRVH7TF/3/Mvmhfjvz8OpCVvGR1qg7OAjA7Do+I9vkSviiXCKL8WT2TVmhmgXpV5hXtrTWBgKdhBo4u5LmiQAyih6CIbM66lubtc00xVwgIsPwIFnpW8KsjT2XCrgXMVcbbyrK52/RJbCC905gaJjd0bzlT630IvGSk04vZb7IhrtVn854iyc7ASwyzM1UyRWDqKf82jVpro6GDz+mhgNs2lQ4+hmrGQ4+YNb1uR5zNxOoW3YVqBRottMtWlNCKrV8UW1VaAOUaIOmL9vudENQ4rSAWGHu3EGfEOvpVUWWcp1VkCpX/2qFgPBT5wxUUhFT674pqVE/d3Epc/M0yoU8oANsj5l7L+8LzSLJE2rE3biMrz4INsgfa+0zwmqFJ5ajPIRbq7Hiu8mt4Vx3bflThOrBZqYjWszZRN5Pdln4DeC9SF+RFf6dJ1q/oyWGRVYaVgKU27fV1VCpclwfDpupbSEohGoTiP5+mTI5v7sa3BPUQbwBSKNRjOgnVQh189mezW/u9b9+y0lqqcUGnEVXczG/RmlwQ8wPBnX8NWIytjCvZT3Zy7siG1t0yKuH+CNM51Ewz++91yAzdPBqV4GfpChZIBCN0qeLBvRcUk99NAC8XmY7A0PpQVy9P/2gg2U2H9b+UnyY1Jcmfs4BNlDbUPYxQK+9CRJm/AV7Lg5ewmkTKqhycPuh62veRLnhrgULo7SHbN2Bfeg32S2gVLepairXgPsGBdDJc7sj01UMrbcQW3m+TQ+vfOJMpn8yHZS52lz1btRFQn9BtEQg2LR6FL0ev2NDaT3g6Z20v6ICyCKdGYAlN9CWQWbd2tfgsmqvZAjopE4DVHFbN6R5FBTo6/AMkAtXVNBH613CLKab5qdjgoGhSQ3dFXoAMsPZqDEUv/8AIASPME+hNHU9QEL2ngBEp8SVZTc4yHXB9Z9/hYmjzaw/KvBHHg6+Cree89GmznDfwx4nlCK777QvMGguvXYbHJL4odvnBxz3YVgfnSBbxO2+y0JoZCrNwjx2wSfCq2SfVgAb6xPv",
"sha1" : "dcd6a21568bb4d10c8c267ff0a122c6597b4a045"
}
]

@ -37,6 +37,7 @@ tasks {
classpath = files("bbootimg/build/libs/bbootimg.jar")
this.maxHeapSize = "128m"
enableAssertions = true
systemProperties(mapOf("part" to System.getProperty("part", "")))
args("unpack")
}
unpackTask.dependsOn("bbootimg:jar")

@ -15,7 +15,7 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.9.0"
kotlin("jvm") version "1.9.20"
`java-library`
application
}

@ -14,9 +14,6 @@
package cfig.helper
import org.bouncycastle.asn1.est.CsrAttrs
import org.bouncycastle.cert.X509CertificateHolder
import org.bouncycastle.cert.crmf.CertificateRequestMessageBuilder
import org.junit.Test
import org.slf4j.LoggerFactory
import java.io.File

@ -7,7 +7,7 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.9.0"
kotlin("jvm") version "1.9.20"
application
}

Loading…
Cancel
Save