extensive lz4 ramdisk support

for/win
cfig 5 years ago
parent 15921efa2d
commit fed5daeeba
No known key found for this signature in database
GPG Key ID: B104C307F0FDABB7

@ -111,19 +111,20 @@ class Common {
Helper.extractFile(s.srcFile, s.dumpFile, s.offset.toLong(), s.length) Helper.extractFile(s.srcFile, s.dumpFile, s.offset.toLong(), s.length)
when { when {
Helper.isGZ(s.dumpFile) -> { Helper.isGZ(s.dumpFile) -> {
Helper.unGnuzipFile(s.dumpFile, s.dumpFile.removeSuffix(".gz")) File(s.dumpFile).renameTo(File(s.dumpFile + ".gz"))
Helper.unGnuzipFile(s.dumpFile + ".gz", s.dumpFile)
} }
Helper.isLZ4(s.dumpFile) -> { Helper.isLZ4(s.dumpFile) -> {
log.info("ramdisk is compressed lz4") log.info("ramdisk is compressed lz4")
Helper.decompressLZ4(s.dumpFile, s.dumpFile.removeSuffix(".gz")) File(s.dumpFile).renameTo(File(s.dumpFile + ".lz4"))
File(s.dumpFile).renameTo(File(s.dumpFile.replace(".gz", ".lz4"))) Helper.decompressLZ4(s.dumpFile + ".lz4", s.dumpFile)
ret = "lz4" ret = "lz4"
} }
else -> { else -> {
throw IllegalArgumentException("ramdisk is in unknown format") throw IllegalArgumentException("ramdisk is in unknown format")
} }
} }
unpackRamdisk(s.dumpFile.removeSuffix(".gz"), root) unpackRamdisk(s.dumpFile, root)
return ret return ret
} }

@ -6,6 +6,7 @@ import cfig.bootimg.Common
import cfig.bootimg.Common.Companion.deleleIfExists import cfig.bootimg.Common.Companion.deleleIfExists
import cfig.bootimg.Common.Slice import cfig.bootimg.Common.Slice
import cfig.bootimg.Signer import cfig.bootimg.Signer
import cfig.bootimg.v3.BootV3
import cfig.packable.VBMetaParser import cfig.packable.VBMetaParser
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import de.vandermeer.asciitable.AsciiTable import de.vandermeer.asciitable.AsciiTable
@ -94,7 +95,7 @@ data class BootV2(
theRamdisk.loadOffset = bh2.ramdiskOffset theRamdisk.loadOffset = bh2.ramdiskOffset
theRamdisk.position = ret.getRamdiskPosition() theRamdisk.position = ret.getRamdiskPosition()
if (bh2.ramdiskLength > 0) { if (bh2.ramdiskLength > 0) {
theRamdisk.file = "${workDir}ramdisk.img.gz" theRamdisk.file = "${workDir}ramdisk.img"
} }
} }
if (bh2.secondBootloaderLength > 0) { if (bh2.secondBootloaderLength > 0) {
@ -168,8 +169,11 @@ data class BootV2(
Common.dumpKernel(Slice(info.output, kernel.position.toInt(), kernel.size, kernel.file!!)) Common.dumpKernel(Slice(info.output, kernel.position.toInt(), kernel.size, kernel.file!!))
//ramdisk //ramdisk
if (this.ramdisk.size > 0) { if (this.ramdisk.size > 0) {
Common.dumpRamdisk(Slice(info.output, ramdisk.position.toInt(), ramdisk.size, ramdisk.file!!), val fmt = Common.dumpRamdisk(Slice(info.output, ramdisk.position.toInt(), ramdisk.size, ramdisk.file!!),
"${workDir}root") "${workDir}root")
this.ramdisk.file = this.ramdisk.file!! + ".$fmt"
//dump info again
ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(File(workDir + this.info.json), this)
} }
//second bootloader //second bootloader
secondBootloader?.let { secondBootloader?.let {

@ -45,7 +45,7 @@ data class BootV3(var info: MiscInfo = MiscInfo(),
ret.kernel.size = header.kernelSize ret.kernel.size = header.kernelSize
ret.kernel.position = BootHeaderV3.pageSize ret.kernel.position = BootHeaderV3.pageSize
//ramdisk //ramdisk
ret.ramdisk.file = workDir + "ramdisk.img.gz" ret.ramdisk.file = workDir + "ramdisk.img"
ret.ramdisk.size = header.ramdiskSize ret.ramdisk.size = header.ramdiskSize
ret.ramdisk.position = ret.kernel.position + header.kernelSize + ret.ramdisk.position = ret.kernel.position + header.kernelSize +
getPaddingSize(header.kernelSize, BootHeaderV3.pageSize) getPaddingSize(header.kernelSize, BootHeaderV3.pageSize)
@ -82,7 +82,7 @@ data class BootV3(var info: MiscInfo = MiscInfo(),
} }
fun pack(): BootV3 { fun pack(): BootV3 {
if (File( this.ramdisk.file).exists() && !File(workDir + "root").exists()) { if (File(this.ramdisk.file).exists() && !File(workDir + "root").exists()) {
//do nothing if we have ramdisk.img.gz but no /root //do nothing if we have ramdisk.img.gz but no /root
log.warn("Use prebuilt ramdisk file: ${this.ramdisk.file}") log.warn("Use prebuilt ramdisk file: ${this.ramdisk.file}")
} else { } else {
@ -91,7 +91,7 @@ data class BootV3(var info: MiscInfo = MiscInfo(),
C.packRootfs("$workDir/root", this.ramdisk.file, parseOsMajor()) C.packRootfs("$workDir/root", this.ramdisk.file, parseOsMajor())
} }
this.kernel.size = File(this.kernel.file).length().toInt() this.kernel.size = File(this.kernel.file).length().toInt()
this.ramdisk.size = File( this.ramdisk.file).length().toInt() this.ramdisk.size = File(this.ramdisk.file).length().toInt()
//header //header
FileOutputStream(this.info.output + ".clear", false).use { fos -> FileOutputStream(this.info.output + ".clear", false).use { fos ->
@ -147,14 +147,11 @@ data class BootV3(var info: MiscInfo = MiscInfo(),
//kernel //kernel
C.dumpKernel(C.Slice(info.output, kernel.position, kernel.size, kernel.file)) C.dumpKernel(C.Slice(info.output, kernel.position, kernel.size, kernel.file))
//ramdisk //ramdisk
val fmt = C.dumpRamdisk(C.Slice(info.output, ramdisk.position, ramdisk.size, ramdisk.file), "${workDir}root") val fmt = C.dumpRamdisk(
if (fmt in listOf("xz", "lzma", "bz2", "lz4")) { C.Slice(info.output, ramdisk.position, ramdisk.size, ramdisk.file), "${workDir}root")
this.ramdisk.file = this.ramdisk.file.replace(".gz", ".$fmt") this.ramdisk.file = this.ramdisk.file + ".$fmt"
//dump info again //dump info again
ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(File(workDir + this.info.json), this) ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(File(workDir + this.info.json), this)
} else {
throw IllegalArgumentException("unknown format $fmt")
}
return this return this
} }

@ -57,7 +57,7 @@ data class VendorBoot(var info: MiscInfo = MiscInfo(),
ret.info.pageSize = header.pageSize ret.info.pageSize = header.pageSize
ret.info.headerVersion = header.headerVersion ret.info.headerVersion = header.headerVersion
//ramdisk //ramdisk
ret.ramdisk.file = workDir + "ramdisk.img.gz" ret.ramdisk.file = workDir + "ramdisk.img"
ret.ramdisk.size = header.vndRamdiskSize ret.ramdisk.size = header.vndRamdiskSize
ret.ramdisk.loadAddr = header.ramdiskLoadAddr ret.ramdisk.loadAddr = header.ramdiskLoadAddr
ret.ramdisk.position = Helper.round_to_multiple( ret.ramdisk.position = Helper.round_to_multiple(
@ -145,11 +145,13 @@ data class VendorBoot(var info: MiscInfo = MiscInfo(),
fun extractImages(): VendorBoot { fun extractImages(): VendorBoot {
val workDir = Helper.prop("workDir") val workDir = Helper.prop("workDir")
//header //header
ObjectMapper().writerWithDefaultPrettyPrinter().writeValue( ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(File(workDir + this.info.json), this)
File(workDir + this.info.json), this)
//ramdisk //ramdisk
C.dumpRamdisk(C.Slice(info.output, ramdisk.position.toInt(), ramdisk.size.toInt(), ramdisk.file), val fmt = C.dumpRamdisk(C.Slice(info.output, ramdisk.position.toInt(), ramdisk.size.toInt(), ramdisk.file),
"${workDir}root") "${workDir}root")
this.ramdisk.file = this.ramdisk.file + ".$fmt"
//dump info again
ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(File(workDir + this.info.json), this)
//dtb //dtb
C.dumpDtb(C.Slice(info.output, dtb.position.toInt(), dtb.size.toInt(), dtb.file)) C.dumpDtb(C.Slice(info.output, dtb.position.toInt(), dtb.size.toInt(), dtb.file))
return this return this

Loading…
Cancel
Save