Browse Source

Benchmark: share stacktrace through provider

merge-requests/2174/head
Duncan McNamara 2 years ago
committed by Nicolas Pomepuy
parent
commit
95c4b51945
  1. 3
      application/vlc-android/res/xml/provider_paths.xml
  2. 89
      application/vlc-android/src/org/videolan/vlc/gui/video/benchmark/BenchActivity.kt

3
application/vlc-android/res/xml/provider_paths.xml

@ -4,4 +4,7 @@
name="external_files"
path="."/>
<root-path name="external_files" path="/storage/" />
<files-path
name="files"
path="."/>
</paths>

89
application/vlc-android/src/org/videolan/vlc/gui/video/benchmark/BenchActivity.kt

@ -27,17 +27,21 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.ActivityInfo
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.support.v4.media.session.PlaybackStateCompat
import android.util.Log
import android.view.View
import androidx.core.content.FileProvider
import androidx.core.content.edit
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.libvlc.MediaPlayer
import org.videolan.resources.BuildConfig
import org.videolan.resources.VLCInstance
import org.videolan.resources.util.registerReceiverCompat
import org.videolan.tools.AppScope
@ -48,6 +52,8 @@ import org.videolan.vlc.gui.helpers.restartMediaPlayer
import org.videolan.vlc.gui.video.PlayerOrientationMode
import org.videolan.vlc.media.PlaylistManager
import java.io.*
import java.text.SimpleDateFormat
import java.util.Date
/**
* BenchActivity is a class that overrides VideoPlayerActivity through ShallowVideoPlayer.
@ -113,6 +119,8 @@ class BenchActivity : ShallowVideoPlayer() {
private var position = 0f
private var positionCounter = 0
/* Extract stacktrace or not */
private var getStacktrace: Boolean = false
/* File in which vlc will store logs in case of a crash or freeze */
private var stacktraceFile: String? = null
@ -176,10 +184,6 @@ class BenchActivity : ShallowVideoPlayer() {
return
}
if (intent.hasExtra(EXTRA_STACKTRACE_FILE)) {
stacktraceFile = intent.getStringExtra(EXTRA_STACKTRACE_FILE)
}
timeLimit = intent.getLongExtra(EXTRA_TIME_LIMIT, 0L)
when (intent.getStringExtra(EXTRA_ACTION)) {
EXTRA_ACTION_PLAYBACK -> {
@ -207,6 +211,9 @@ class BenchActivity : ShallowVideoPlayer() {
}
}
if (intent.hasExtra(EXTRA_STACKTRACE_FILE))
getStacktrace = intent.getBooleanExtra(EXTRA_STACKTRACE_FILE, false)
orientationMode = PlayerOrientationMode(true, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
requestedOrientation = getScreenOrientation(orientationMode)
@ -467,45 +474,55 @@ class BenchActivity : ShallowVideoPlayer() {
Log.e(TAG, "errorFinish: $resultString")
val sendIntent = Intent()
sendIntent.putExtra("Error", resultString)
getStackTrace()
setResult(RESULT_FAILED, sendIntent)
super.finish()
AppScope.launch {
if (getStacktrace) {
val uri = getStackTrace()
if (uri != null) {
sendIntent.putExtra("stacktrace_uri", uri)
val packageName = if (BuildConfig.DEBUG)
"org.videolan.vlcbenchmark.debug"
else "org.videolan.vlcbenchmark"
grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
setResult(RESULT_FAILED, sendIntent)
super.finish()
}
}
/**
* Method reading vlc-android logs so that the benchmark can get the cause
* of the crash / freeze
*/
private fun getStackTrace() = AppScope.launch(Dispatchers.IO) {
if (stacktraceFile != null) {
try {
val pid = android.os.Process.myPid()
/*Displays priority, tag, and PID of the process issuing the message from this pid*/
val process = Runtime.getRuntime().exec("logcat -d -v brief --pid=$pid")
val bufferedReader = BufferedReader(
InputStreamReader(process.inputStream))
var line = bufferedReader.readLine()
val stacktraceContent = StringBuilder()
while (line != null) {
stacktraceContent.append(line)
line = bufferedReader.readLine()
}
val outputFile = File(stacktraceFile!!)
val fileOutputStream = FileOutputStream(outputFile)
fileOutputStream.write(stacktraceContent.toString().toByteArray(Charsets.UTF_8))
fileOutputStream.close()
bufferedReader.close()
/* Clear logs, so that next test is not polluted by current one */
ProcessBuilder()
.command("logcat", "-c")
.redirectErrorStream(true)
.start()
} catch (ex: IOException) {
Log.e(TAG, ex.toString())
private suspend fun getStackTrace() : Uri? = withContext(Dispatchers.IO) {
val stacktraceFile = "${SimpleDateFormat("yyyy-MM-dd_HH-mm").format(Date(System.currentTimeMillis()))}.log"
try {
val pid = android.os.Process.myPid()
/*Displays priority, tag, and PID of the process issuing the message from this pid*/
val process = Runtime.getRuntime().exec("logcat -d -v brief --pid=$pid")
val bufferedReader = BufferedReader(
InputStreamReader(process.inputStream))
var line = bufferedReader.readLine()
val stacktraceContent = StringBuilder()
while (line != null) {
stacktraceContent.append(line + "\n")
line = bufferedReader.readLine()
}
} else {
Log.e(TAG, "getStackTrace: There was no stacktrace file provided")
val outputFile = File(filesDir, stacktraceFile)
val fileOutputStream = FileOutputStream(outputFile)
fileOutputStream.write(stacktraceContent.toString().toByteArray(Charsets.UTF_8))
fileOutputStream.close()
bufferedReader.close()
/* Clear logs, so that next test is not polluted by current one */
ProcessBuilder()
.command("logcat", "-c")
.redirectErrorStream(true)
.start()
return@withContext FileProvider.getUriForFile(this@BenchActivity, applicationContext.packageName + ".provider", outputFile)
} catch (ex: IOException) {
Log.e(TAG, ex.toString())
}
return@withContext null
}
/**
@ -604,7 +621,7 @@ class BenchActivity : ShallowVideoPlayer() {
private const val EXTRA_ACTION_SPEED = "extra_benchmark_action_speed"
private const val EXTRA_ACTION = "extra_benchmark_action"
private const val EXTRA_HARDWARE = "extra_benchmark_disable_hardware"
private const val EXTRA_STACKTRACE_FILE = "stacktrace_file"
private const val EXTRA_STACKTRACE_FILE = "extra_stacktrace_file"
private const val EXTRA_TIME_LIMIT = "extra_benchmark_time_limit"
private const val ACTION_TRIGGER_SCREENSHOT = "org.videolan.vlcbenchmark.TRIGGER_SCREENSHOT"

Loading…
Cancel
Save