better use of dex2jar, get dex2jar from jitpack

This commit is contained in:
Aria Moradi
2021-03-25 18:03:32 +04:30
parent 183972475b
commit 34d9a7a233
21 changed files with 42 additions and 72 deletions
@@ -4,7 +4,9 @@ package ir.armor.tachidesk.util
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
import com.googlecode.dex2jar.tools.Dex2jarCmd
import com.googlecode.d2j.dex.Dex2jar
import com.googlecode.d2j.reader.MultiDexFileReader
import com.googlecode.dex2jar.tools.BaksmaliBaseDexExceptionHandler
import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.NetworkHelper
@@ -29,9 +31,43 @@ import java.io.File
import java.io.InputStream
import java.net.URL
import java.net.URLClassLoader
import java.nio.file.Files
import java.nio.file.Path
private val logger = KotlinLogging.logger {}
private fun dex2jar(dexFile: String, jarFile: String, fileNameWithoutType: String) {
// adopted from com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine
// source at: https://github.com/DexPatcher/dex2jar/tree/v2.1-20190905-lanchon/dex-tools/src/main/java/com/googlecode/dex2jar/tools/Dex2jarCmd.java
val jarFilePath = File(jarFile).toPath()
val reader = MultiDexFileReader.open(Files.readAllBytes(File(dexFile).toPath()))
val handler = BaksmaliBaseDexExceptionHandler()
Dex2jar
.from(reader)
.withExceptionHandler(handler)
.reUseReg(false)
.topoLogicalSort()
.skipDebug(true)
.optimizeSynchronized(false)
.printIR(false)
.noCode(false)
.skipExceptions(false)
.to(jarFilePath)
if (handler.hasException()) {
val errorFile: Path = File(applicationDirs.extensionsRoot).toPath().resolve("$fileNameWithoutType-error.txt")
logger.error(
"Detail Error Information in File $errorFile\n" +
"Please report this file to one of following link if possible (any one).\n" +
" https://sourceforge.net/p/dex2jar/tickets/\n" +
" https://bitbucket.org/pxb1988/dex2jar/issues\n" +
" https://github.com/pxb1988/dex2jar/issues\n" +
" dex2jar@googlegroups.com"
)
handler.dump(errorFile, emptyArray<String>())
}
}
fun installAPK(apkName: String): Int {
logger.info("Installing $apkName")
val extensionRecord = getExtensionList(true).first { it.apkName == apkName }
@@ -55,7 +91,7 @@ fun installAPK(apkName: String): Int {
val className: String = APKExtractor.extract_dex_and_read_className(apkFilePath, dexFilePath)
logger.info(className)
// dex -> jar
Dex2jarCmd.main(dexFilePath, "-o", jarFilePath, "--force")
dex2jar(dexFilePath, jarFilePath, fileNameWithoutType)
// clean up
File(apkFilePath).delete()
@@ -81,7 +117,7 @@ fun installAPK(apkName: String): Int {
it[extension] = extensionId
}
}
logger.info("Installed source ${httpSource.name} with id:${httpSource.id}")
logger.info("Installed source ${httpSource.name} with id {httpSource.id}")
}
} else { // multi source
val sourceFactory = instance as SourceFactory
@@ -36,7 +36,6 @@ fun getHttpSource(sourceId: Long): HttpSource {
return cachedResult.second
}
val result: HttpSource = transaction {
val extensionId = sourceRecord.extension.id.value
val extensionRecord = ExtensionEntity.findById(extensionId)!!