Фон
Я пытаюсь извлечь какой-то файл из zip-архива в новое место, даже если для этого нет разрешения (используя «su», если необходимо).
Проблема
Для этого, скажем, мне не разрешено создавать файл, используя обычный фреймворк, а только с помощью команд Linux / Unix Android. У меня есть доступ к содержимому, которое должно быть отправлено в файл.
То, что я пробовал
Я пробовал команду «tee», и она почти работает.
Почему-то отправил только часть файла (68К вместо 656К). Входные данные - это zip-файл, внутри которого находится файл PNG.
fun InputStream.copyToAndClose(out: OutputStream, bufferSize: Int = DEFAULT_BUFFER_SIZE): Long = this.copyTo(out, bufferSize).also { this.close() }
...
val inputFile = File(Environment.getExternalStorageDirectory(), "1.zip")
thread {
ZipFile(inputFile).use {
for (entry in it.entries()) {
val outputFile = File(Environment.getExternalStorageDirectory(), "check.apk")
val command = arrayOf("tee", "${outputFile.absolutePath}") // I plan to add here "su" as first parameter, but let's use this for now
val process: Process = Runtime.getRuntime().exec(command)
try {
process.outputStream.use { outputStream -> it.getInputStream(entry).copyToAndClose(outputStream) }
} catch (e: Exception) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) process.destroyForcibly() else process.destroy()
throw e
}
process.waitFor()
val inputStr = process.inputStream.reader(Charset.defaultCharset()).readLines()
val errStr = process.errorStream.reader(Charset.defaultCharset()).readLines()
val isSucceeded = process.exitValue() == 0
}
}
}
В этом случае я вижу, что это частично верно, потому что по какой-то причине я все еще могу открыть файл PNG и увидеть часть изображения.
Я также пробовал несколько вариантов команды «cat», но, похоже, она тоже не работает, или я просто не знаю, как ее использовать для этой цели.
Вопрос
Почему мой код работает только частично? Как это исправить (без создания файла с помощью фреймворка)?
Какой должна быть правильная команда Linux / Unix для копирования из inputStream прямо в новый файл?