mirror of
https://github.com/revanced/revanced-manager
synced 2024-05-14 13:56:57 +02:00
fix: properly log messages and progress
This commit is contained in:
parent
64a96fc3ce
commit
7911a8f49e
@ -21,13 +21,9 @@ import kotlinx.coroutines.runBlocking
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
import java.io.StringWriter
|
import java.io.StringWriter
|
||||||
import java.util.logging.Level
|
|
||||||
import java.util.logging.LogRecord
|
import java.util.logging.LogRecord
|
||||||
import java.util.logging.Logger
|
import java.util.logging.Logger
|
||||||
import java.util.logging.SimpleFormatter
|
|
||||||
|
|
||||||
private const val PATCHER_CHANNEL = "app.revanced.manager.flutter/patcher"
|
|
||||||
private const val INSTALLER_CHANNEL = "app.revanced.manager.flutter/installer"
|
|
||||||
|
|
||||||
class MainActivity : FlutterActivity() {
|
class MainActivity : FlutterActivity() {
|
||||||
private val handler = Handler(Looper.getMainLooper())
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
@ -37,9 +33,16 @@ class MainActivity : FlutterActivity() {
|
|||||||
|
|
||||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||||
super.configureFlutterEngine(flutterEngine)
|
super.configureFlutterEngine(flutterEngine)
|
||||||
val mainChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, PATCHER_CHANNEL)
|
|
||||||
installerChannel =
|
val patcherChannel = "app.revanced.manager.flutter/patcher"
|
||||||
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, INSTALLER_CHANNEL)
|
val installerChannel = "app.revanced.manager.flutter/installer"
|
||||||
|
|
||||||
|
val mainChannel =
|
||||||
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, patcherChannel)
|
||||||
|
|
||||||
|
this.installerChannel =
|
||||||
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, installerChannel)
|
||||||
|
|
||||||
mainChannel.setMethodCallHandler { call, result ->
|
mainChannel.setMethodCallHandler { call, result ->
|
||||||
when (call.method) {
|
when (call.method) {
|
||||||
"runPatcher" -> {
|
"runPatcher" -> {
|
||||||
@ -79,9 +82,7 @@ class MainActivity : FlutterActivity() {
|
|||||||
keyStoreFilePath,
|
keyStoreFilePath,
|
||||||
keystorePassword
|
keystorePassword
|
||||||
)
|
)
|
||||||
} else {
|
} else result.notImplemented()
|
||||||
result.notImplemented()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
"stopPatcher" -> {
|
"stopPatcher" -> {
|
||||||
@ -116,110 +117,94 @@ class MainActivity : FlutterActivity() {
|
|||||||
val cacheDir = File(cacheDirPath)
|
val cacheDir = File(cacheDirPath)
|
||||||
|
|
||||||
Thread {
|
Thread {
|
||||||
try {
|
fun updateProgress(progress: Double, header: String, log: String) {
|
||||||
Logger.getLogger("").apply {
|
|
||||||
handlers.forEach {
|
|
||||||
it.close()
|
|
||||||
removeHandler(it)
|
|
||||||
}
|
|
||||||
object : java.util.logging.Handler() {
|
|
||||||
override fun publish(record: LogRecord) = formatter.format(record).toByteArray().let {
|
|
||||||
if (record.level.intValue() > Level.INFO.intValue())
|
|
||||||
System.err.write(it)
|
|
||||||
else
|
|
||||||
System.out.write(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun flush() {
|
|
||||||
System.out.flush()
|
|
||||||
System.err.flush()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun close() = flush()
|
|
||||||
}.also {
|
|
||||||
it.level = Level.ALL
|
|
||||||
it.formatter = SimpleFormatter()
|
|
||||||
}.let(::addHandler)
|
|
||||||
}
|
|
||||||
handler.post {
|
handler.post {
|
||||||
installerChannel.invokeMethod(
|
installerChannel.invokeMethod(
|
||||||
"update",
|
"update",
|
||||||
mapOf(
|
mapOf(
|
||||||
"progress" to 0.1,
|
"progress" to progress,
|
||||||
"header" to "",
|
"header" to header,
|
||||||
"log" to "Copying original APK"
|
"log" to log
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun postStop() = handler.post { stopResult!!.success(null) }
|
||||||
|
|
||||||
|
// Setup logger
|
||||||
|
Logger.getLogger("").apply {
|
||||||
|
handlers.forEach {
|
||||||
|
it.close()
|
||||||
|
removeHandler(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
object : java.util.logging.Handler() {
|
||||||
|
override fun publish(record: LogRecord) =
|
||||||
|
updateProgress(-1.0, "", record.message)
|
||||||
|
|
||||||
|
override fun flush() = Unit
|
||||||
|
override fun close() = flush()
|
||||||
|
}.let(::addHandler)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
updateProgress(0.0, "", "Copying APK")
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
originalFile.copyTo(inputFile, true)
|
originalFile.copyTo(inputFile, true)
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post {
|
updateProgress(0.05, "Reading APK...", "Reading APK")
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf(
|
|
||||||
"progress" to 0.2,
|
|
||||||
"header" to "Reading APK...",
|
|
||||||
"log" to "Reading input APK"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val patcher =
|
val patcher = Patcher(
|
||||||
Patcher(
|
PatcherOptions(
|
||||||
PatcherOptions(
|
inputFile,
|
||||||
inputFile,
|
cacheDir,
|
||||||
cacheDir,
|
Aapt.binary(applicationContext).absolutePath,
|
||||||
Aapt.binary(applicationContext).absolutePath,
|
cacheDir.path,
|
||||||
cacheDir.path,
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post {
|
updateProgress(0.1, "Loading patches...", "Loading patches")
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf("progress" to 0.3, "header" to "Loading patches...", "log" to "Loading patches")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val patches =
|
val patches = PatchBundleLoader.Dex(
|
||||||
PatchBundleLoader.Dex(
|
File(patchBundleFilePath)
|
||||||
File(patchBundleFilePath)
|
).filter { patch ->
|
||||||
).filter { patch ->
|
val isCompatible = patch.compatiblePackages?.any {
|
||||||
(patch.compatiblePackages?.any { it.name == patcher.context.packageMetadata.packageName } == true || patch.compatiblePackages.isNullOrEmpty()) &&
|
it.name == patcher.context.packageMetadata.packageName
|
||||||
selectedPatches.any { it == patch.patchName }
|
} ?: false
|
||||||
}
|
|
||||||
|
val compatibleOrUniversal =
|
||||||
|
isCompatible || patch.compatiblePackages.isNullOrEmpty()
|
||||||
|
|
||||||
|
compatibleOrUniversal && selectedPatches.any { it == patch.patchName }
|
||||||
|
}
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post {
|
updateProgress(0.15, "Executing...", "")
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
// Update the progress bar every time a patch is executed from 0.15 to 0.7
|
||||||
mapOf(
|
val totalPatchesCount = patches.size
|
||||||
"progress" to 0.5,
|
val progressStep = 0.55 / totalPatchesCount
|
||||||
"header" to "Executing patches...",
|
var progress = 0.15
|
||||||
"log" to ""
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
patcher.apply {
|
patcher.apply {
|
||||||
acceptIntegrations(listOf(integrations))
|
acceptIntegrations(listOf(integrations))
|
||||||
@ -227,59 +212,34 @@ class MainActivity : FlutterActivity() {
|
|||||||
|
|
||||||
runBlocking {
|
runBlocking {
|
||||||
apply(false).collect { patchResult: PatchResult ->
|
apply(false).collect { patchResult: PatchResult ->
|
||||||
patchResult.exception?.let {
|
if (cancel) {
|
||||||
if (cancel) {
|
handler.post { stopResult!!.success(null) }
|
||||||
handler.post { stopResult!!.success(null) }
|
this.cancel()
|
||||||
this.cancel()
|
this@apply.close()
|
||||||
return@collect
|
return@collect
|
||||||
}
|
|
||||||
StringWriter().use { writer ->
|
|
||||||
it.printStackTrace(PrintWriter(writer))
|
|
||||||
handler.post {
|
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf("progress" to 0.5, "header" to "", "log" to "${patchResult.patchName} failed: $writer")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} ?: run {
|
|
||||||
if (cancel) {
|
|
||||||
handler.post { stopResult!!.success(null) }
|
|
||||||
this.cancel()
|
|
||||||
return@collect
|
|
||||||
}
|
|
||||||
val msg = "${patchResult.patchName} succeeded"
|
|
||||||
handler.post {
|
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf(
|
|
||||||
"progress" to 0.5,
|
|
||||||
"header" to "",
|
|
||||||
"log" to msg
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val msg = patchResult.exception?.let {
|
||||||
|
val writer = StringWriter()
|
||||||
|
it.printStackTrace(PrintWriter(writer))
|
||||||
|
"${patchResult.patchName} failed: $writer"
|
||||||
|
} ?: run {
|
||||||
|
"${patchResult.patchName} succeeded"
|
||||||
|
}
|
||||||
|
|
||||||
|
updateProgress(progress, "", msg)
|
||||||
|
progress += progressStep
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
patcher.close()
|
patcher.close()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post {
|
updateProgress(0.8, "Building...", "")
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf(
|
|
||||||
"progress" to 0.7,
|
|
||||||
"header" to "Repacking APK...",
|
|
||||||
"log" to ""
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
val res = patcher.get()
|
val res = patcher.get()
|
||||||
patcher.close()
|
patcher.close()
|
||||||
@ -287,7 +247,7 @@ class MainActivity : FlutterActivity() {
|
|||||||
ZipFile(patchedFile).use { file ->
|
ZipFile(patchedFile).use { file ->
|
||||||
res.dexFiles.forEach {
|
res.dexFiles.forEach {
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
file.addEntryCompressData(
|
file.addEntryCompressData(
|
||||||
@ -308,92 +268,33 @@ class MainActivity : FlutterActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cancel) {
|
if (cancel) {
|
||||||
handler.post { stopResult!!.success(null) }
|
postStop()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post {
|
updateProgress(0.9, "Signing...", "Signing APK")
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf(
|
|
||||||
"progress" to 0.9,
|
|
||||||
"header" to "Signing APK...",
|
|
||||||
"log" to ""
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Signer("ReVanced", keystorePassword).signApk(
|
Signer("ReVanced", keystorePassword)
|
||||||
patchedFile,
|
.signApk(patchedFile, outFile, keyStoreFile)
|
||||||
outFile,
|
|
||||||
keyStoreFile
|
|
||||||
)
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
//log to console
|
|
||||||
print("Error signing APK: ${e.message}")
|
print("Error signing APK: ${e.message}")
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post {
|
updateProgress(1.0, "Patched", "Patched")
|
||||||
installerChannel.invokeMethod(
|
|
||||||
"update",
|
|
||||||
mapOf(
|
|
||||||
"progress" to 1.0,
|
|
||||||
"header" to "Finished!",
|
|
||||||
"log" to "Finished!"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} catch (ex: Throwable) {
|
} catch (ex: Throwable) {
|
||||||
if (!cancel) {
|
if (!cancel) {
|
||||||
val stack = ex.stackTraceToString()
|
val stack = ex.stackTraceToString()
|
||||||
handler.post {
|
updateProgress(
|
||||||
installerChannel.invokeMethod(
|
-100.0,
|
||||||
"update",
|
"Aborted",
|
||||||
mapOf(
|
"An error occurred:\n$stack"
|
||||||
"progress" to -100.0,
|
)
|
||||||
"header" to "Aborted...",
|
|
||||||
"log" to "An error occurred! Aborted\nError:\n$stack"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.post { result.success(null) }
|
handler.post { result.success(null) }
|
||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
// inner class ManagerLogger : Logger {
|
|
||||||
// override fun error(msg: String) {
|
|
||||||
// handler.post {
|
|
||||||
// installerChannel
|
|
||||||
// .invokeMethod(
|
|
||||||
// "update",
|
|
||||||
// mapOf("progress" to -1.0, "header" to "", "log" to msg)
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// override fun warn(msg: String) {
|
|
||||||
// handler.post {
|
|
||||||
// installerChannel.invokeMethod(
|
|
||||||
// "update",
|
|
||||||
// mapOf("progress" to -1.0, "header" to "", "log" to msg)
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// override fun info(msg: String) {
|
|
||||||
// handler.post {
|
|
||||||
// installerChannel.invokeMethod(
|
|
||||||
// "update",
|
|
||||||
// mapOf("progress" to -1.0, "header" to "", "log" to msg)
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// override fun trace(_msg: String) { /* unused */
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user