Skip to content

Commit 25c87a9

Browse files
committed
Add Support for Vendor_boot ramdisk detection and KSU LKM Driver Flashing
1 parent 9531e67 commit 25c87a9

File tree

10 files changed

+45
-33
lines changed

10 files changed

+45
-33
lines changed

app/src/main/java/com/github/capntrips/kernelflasher/ui/components/SlotCard.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ fun SlotCard(
7373
mutableMaxWidth = cardWidth
7474
)
7575
DataRow(
76-
label = if (viewModel.slotInfo.ramdiskInfo.ramdiskLocation == "init_boot.img") stringResource(R.string.init_boot_fmt) else stringResource(R.string.ramdisk_fmt),
76+
label = if (viewModel.slotInfo.ramdiskInfo.ramdiskLocation == "init_boot.img") stringResource(R.string.init_boot_fmt)
77+
else if (viewModel.slotInfo.ramdiskInfo.ramdiskLocation == "vendor_boot.img") stringResource(R.string.vendor_boot_fmt)
78+
else stringResource(R.string.ramdisk_fmt),
7779
value = viewModel.slotInfo.ramdiskInfo.ramdiskFmt ?: stringResource(R.string.not_found),
7880
mutableMaxWidth = cardWidth
7981
)

app/src/main/java/com/github/capntrips/kernelflasher/ui/screens/slot/SlotViewModel.kt

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class SlotViewModel(
5353
const val HEADER_VER = "HEADER_VER"
5454
const val KERNEL_FMT = "KERNEL_FMT"
5555
const val RAMDISK_FMT = "RAMDISK_FMT"
56+
const val VND_RAMDISK = "VND_RAMDISK"
5657
}
5758

5859
data class BootSlotInfo(
@@ -119,8 +120,8 @@ class SlotViewModel(
119120
refresh(context)
120121
}
121122

122-
private fun extractKernelValues(input: String, key: String): String? {
123-
val regex = Regex("$key\\s*\\[([^]]+)]")
123+
private fun extractKernelValues(input: String, key: String, isVendor_boot: Boolean = false): String? {
124+
val regex = if(isVendor_boot == true) Regex("VND_RAMDISK.*fmt=\\[([^]]+)]") else Regex("$key\\s*\\[([^]]+)]")
124125
return regex.find(input)?.groupValues?.get(1)
125126
}
126127

@@ -169,6 +170,17 @@ class SlotViewModel(
169170
_slotInfo.value.ramdiskInfo.ramdiskLocation = "init_boot.img"
170171
}
171172
}
173+
else
174+
{
175+
var vendor_boot = PartitionUtil.findPartitionBlockDevice(context, "vendor_boot", slotSuffix)
176+
val unpackVendorBootOutput = mutableListOf<String>()
177+
if(Shell.cmd("$magiskboot unpack $vendor_boot").to(unpackVendorBootOutput, unpackVendorBootOutput).exec().isSuccess)
178+
{
179+
val vendorBootUnpackOp = unpackVendorBootOutput.joinToString("\n")
180+
_slotInfo.value.ramdiskInfo.ramdiskFmt = extractKernelValues(vendorBootUnpackOp.trimIndent(), VND_RAMDISK, true)
181+
_slotInfo.value.ramdiskInfo.ramdiskLocation = "vendor_boot.img"
182+
}
183+
}
172184

173185
val ramdisk = File(context.filesDir, "ramdisk.cpio")
174186
val kernel = File(context.filesDir, "kernel")
@@ -702,6 +714,7 @@ class SlotViewModel(
702714
}
703715
}
704716

717+
@OptIn(ExperimentalSerializationApi::class)
705718
fun flashKsuDriver(context: Context, uri: Uri) {
706719
launch {
707720
_clearFlash()
@@ -720,49 +733,38 @@ class SlotViewModel(
720733
val partitionName = _slotInfo.value.ramdiskInfo.ramdiskLocation?.removeSuffix(".img") ?: "boot"
721734
val magiskboot = File(context.filesDir, "magiskboot")
722735
val ksuinit = File(context.filesDir, "ksuinit")
736+
addMessage("Unpacking $partitionName")
737+
var ramdisk = File(context.filesDir, "ramdisk.cpio")
723738
if(partitionName == "boot")
724-
{
725-
addMessage("Unpacking boot.img")
726739
Shell.cmd("$magiskboot unpack $boot").exec()
727-
}
728-
else
729-
{
730-
addMessage("Unpacking init_boot")
740+
else if(partitionName == "init_boot")
731741
Shell.cmd("$magiskboot unpack $initBoot").exec()
742+
else {
743+
var vendor_boot = PartitionUtil.findPartitionBlockDevice(context, "vendor_boot", slotSuffix)
744+
Shell.cmd("$magiskboot unpack $vendor_boot").exec()
745+
ramdisk = File(context.filesDir, "vendor_ramdisk/ramdisk.cpio")
746+
if (!ramdisk.exists())
747+
ramdisk = File(context.filesDir, "vendor_ramdisk/init_boot.cpio")
732748
}
733749

734-
val ramdisk = File(context.filesDir, "ramdisk.cpio")
750+
735751

736752
if (ramdisk.exists()) {
737753
addMessage("Patching Ramdisk")
738754

739-
if(Shell.cmd("$magiskboot cpio ramdisk.cpio 'exists kernelsu.ko'").to(flashOutput, flashOutput).exec().isSuccess) {
740-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'rm init'")
741-
.to(flashOutput, flashOutput).exec()
742-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'add 0755 init $ksuinit'")
743-
.to(flashOutput, flashOutput).exec()
744-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'rm kernelsu.ko'")
745-
.to(flashOutput, flashOutput).exec()
746-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'add 0755 kernelsu.ko $driver'")
747-
.to(flashOutput, flashOutput).exec()
748-
}
755+
if(Shell.cmd("$magiskboot cpio $ramdisk 'exists kernelsu.ko'").to(flashOutput, flashOutput).exec().isSuccess)
756+
Shell.cmd("$magiskboot cpio $ramdisk 'rm init' 'add 0755 init $ksuinit' 'rm kernelsu.ko' 'add 0755 kernelsu.ko $driver'").to(flashOutput, flashOutput).exec()
749757
else
750-
{
751-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'mv init init.real'").to(flashOutput, flashOutput).exec()
752-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'add 0755 init $ksuinit'")
753-
.to(flashOutput, flashOutput).exec()
754-
Shell.cmd("$magiskboot cpio ramdisk.cpio 'add 0755 kernelsu.ko $driver'")
755-
.to(flashOutput, flashOutput).exec()
756-
}
758+
Shell.cmd("$magiskboot cpio $ramdisk 'mv init init.real' 'add 0755 init $ksuinit' 'add 0755 kernelsu.ko $driver'").to(flashOutput, flashOutput).exec()
759+
760+
addMessage("Repacking $partitionName")
757761
if(partitionName == "boot")
758-
{
759-
addMessage("Repacking boot.img")
760762
Shell.cmd("$magiskboot repack $boot").exec()
761-
}
762-
else
763-
{
764-
addMessage("Repacking init_boot.img")
763+
else if(partitionName == "init_boot")
765764
Shell.cmd("$magiskboot repack $initBoot").exec()
765+
else {
766+
var vendor_boot = PartitionUtil.findPartitionBlockDevice(context, "vendor_boot", slotSuffix)
767+
Shell.cmd("$magiskboot repack $vendor_boot").exec()
766768
}
767769

768770
if(newBootImg.exists()) {

app/src/main/res/values-it/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@
6767
<string name="ramdisk_fmt">Formato Ramdisk</string>
6868
<string name="susfs_version">Versione SUSFS</string>
6969
<string name="backup_now">Backup Partizioni Selezionate</string>
70+
<string name="vendor_boot_fmt">Formato vendor_boot.img</string>
7071
<!-- TODO: Make error and success messages string resources -->
7172
</resources>

app/src/main/res/values-ja/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,6 @@
6868
<string name="ramdisk_fmt">Ramdisk形式</string>
6969
<string name="susfs_version">SUSFSバージョン</string>
7070
<string name="backup_now">選択したパーティションをバックアップする</string>
71+
<string name="vendor_boot_fmt">vendor_boot.img形式</string>
7172
<!-- TODO: Make error and success messages string resources -->
7273
</resources>

app/src/main/res/values-pl/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,5 @@
6868
<string name="ramdisk_fmt">Format Ramdisk</string>
6969
<string name="susfs_version">Wersja SUSFS</string>
7070
<string name="backup_now">Utwórz kopię zapasową wybranych partycji</string>
71+
<string name="vendor_boot_fmt">Format vendor_boot.img</string>
7172
</resources>

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@
6767
<string name="ramdisk_fmt">Formato do Ramdisk</string>
6868
<string name="susfs_version">SUSFS Versão</string>
6969
<string name="backup_now">Fazer backup das partições selecionadas</string>
70+
<string name="vendor_boot_fmt">Formato do vendor_boot.img</string>
7071
</resources>

app/src/main/res/values-ru/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@
6767
<string name="ramdisk_fmt">Ramdisk формат</string>
6868
<string name="susfs_version">SUSFS Версия</string>
6969
<string name="backup_now">Резервное копирование выбранных разделов</string>
70+
<string name="vendor_boot_fmt">vendor_boot.img формат</string>
7071
</resources>

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@
6767
<string name="ramdisk_fmt">Ramdisk 格式</string>
6868
<string name="susfs_version">SUSFS 版本</string>
6969
<string name="backup_now">備份选定的分区</string>
70+
<string name="vendor_boot_fmt">vendor_boot.img 格式</string>
7071
</resources>

app/src/main/res/values-zh-rTW/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@
6767
<string name="ramdisk_fmt">Ramdisk 格式</string>
6868
<string name="susfs_version">SUSFS 版本</string>
6969
<string name="backup_now">備份选定的分区</string>
70+
<string name="vendor_boot_fmt">vendor_boot.img 格式</string>
7071
</resources>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@
6767
<string name="ramdisk_fmt">Ramdisk Format</string>
6868
<string name="susfs_version">SUSFS Version</string>
6969
<string name="backup_now">Backup Selected Partitions</string>
70+
<string name="vendor_boot_fmt">vendor_boot.img Format</string>
7071
<!-- TODO: Make error and success messages string resources -->
7172
</resources>

0 commit comments

Comments
 (0)