Skip to content

Commit

Permalink
Extract assets from apk file
Browse files Browse the repository at this point in the history
  • Loading branch information
schroda committed Jul 18, 2023
1 parent 526fef8 commit 6afaeca
Showing 1 changed file with 55 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ import suwayomi.tachidesk.manga.model.table.SourceTable
import suwayomi.tachidesk.server.ApplicationDirs
import uy.kohesive.injekt.injectLazy
import java.io.File
import java.io.FileOutputStream
import java.io.InputStream
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream

object Extension {
private val logger = KotlinLogging.logger {}
Expand Down Expand Up @@ -136,6 +140,7 @@ object Extension {
logger.debug("Main class for extension is $className")

dex2jar(apkFilePath, jarFilePath, fileNameWithoutType)
extractAssetsFromApk(apkFilePath, jarFilePath)

// clean up
File(apkFilePath).delete()
Expand Down Expand Up @@ -198,6 +203,55 @@ object Extension {
}
}

private fun extractAssetsFromApk(apkPath: String, jarPath: String) {
val apkFile = File(apkPath)
val jarFile = File(jarPath)

val assetsFolder = File("${apkFile.parent}/${apkFile.nameWithoutExtension}_assets")
assetsFolder.mkdir()
ZipInputStream(apkFile.inputStream()).use { zipInputStream ->
var zipEntry = zipInputStream.nextEntry
while (zipEntry != null) {
if (zipEntry.name.startsWith("assets/")) {
val assetFile = File(assetsFolder, zipEntry.name.substringAfter("assets/"))
assetFile.parentFile.mkdirs()
FileOutputStream(assetFile).use { outputStream ->
zipInputStream.copyTo(outputStream)
}
}
zipEntry = zipInputStream.nextEntry
}
}

val tempJarFile = File("${jarFile.parent}/${jarFile.nameWithoutExtension}_temp.jar")
ZipInputStream(jarFile.inputStream()).use { jarZipInputStream ->
ZipOutputStream(FileOutputStream(tempJarFile)).use { jarZipOutputStream ->
var zipEntry = jarZipInputStream.nextEntry
while (zipEntry != null) {
if (!zipEntry.name.startsWith("META-INF/")) {
jarZipOutputStream.putNextEntry(ZipEntry(zipEntry.name))
jarZipInputStream.copyTo(jarZipOutputStream)
}
zipEntry = jarZipInputStream.nextEntry
}
assetsFolder.walkTopDown().forEach { file ->
if (file.isFile) {
jarZipOutputStream.putNextEntry(ZipEntry("assets/${file.relativeTo(assetsFolder)}"))
file.inputStream().use { inputStream ->
inputStream.copyTo(jarZipOutputStream)
}
jarZipOutputStream.closeEntry()
}
}
}
}

jarFile.delete()
tempJarFile.renameTo(jarFile)

assetsFolder.deleteRecursively()
}

private val network: NetworkHelper by injectLazy()

private suspend fun downloadAPKFile(url: String, savePath: String) {
Expand All @@ -206,7 +260,7 @@ object Extension {

val downloadedFile = File(savePath)
downloadedFile.sink().buffer().use { sink ->
response.body!!.source().use { source ->
response.body.source().use { source ->
sink.writeAll(source)
sink.flush()
}
Expand Down

0 comments on commit 6afaeca

Please sign in to comment.