[Fix] (ci): harden Android trace replay CI

This commit is contained in:
2026-06-21 00:07:13 +08:00
parent b4f9401395
commit f270988e03
2 changed files with 75 additions and 16 deletions
@@ -4,7 +4,9 @@
#include <android/native_window_jni.h>
#include <jni.h>
#include <exception>
#include <string>
#include <sys/stat.h>
extern "C" void mobilegl_trace_set_native_window(ANativeWindow *window);
extern "C" void mobilegl_trace_set_requested_size(int width, int height);
@@ -46,6 +48,35 @@ jobject MakeResult(JNIEnv* env, const mobilegl_trace::Result& result) {
return object;
}
void EnsureDirectory(const std::string& path) {
if (!path.empty()) {
mkdir(path.c_str(), 0775);
}
}
mobilegl_trace::Result MakeFailureResult(const mobilegl_trace::Request& request,
int statusCode,
const std::string& message) {
mobilegl_trace::Result result;
result.statusCode = statusCode;
result.message = message;
if (!request.outputDir.empty()) {
EnsureDirectory(request.outputDir);
result.resultPath = request.outputDir + "/result.json";
result.actualPath = request.outputDir + "/actual.png";
}
result.diffPath = request.diffPath;
return result;
}
class ScopedTraceReplayState {
public:
~ScopedTraceReplayState() {
mobilegl_trace_set_native_window(nullptr);
mobilegl_trace_set_requested_size(0, 0);
}
};
} // namespace
extern "C" JNIEXPORT jobject JNICALL
@@ -89,6 +120,7 @@ Java_top_mobilegl_plugin_trace_TraceReplayActivity_nativeRunTraceReplay(JNIEnv*
request.cropHeight = cropHeight;
request.fuzzPercent = fuzzPercent;
ScopedTraceReplayState replayState;
mobilegl_trace_set_requested_size(request.width, request.height);
const bool needsNativeWindow = request.backend == "DirectVulkan";
ANativeWindow *window = needsNativeWindow && surface != nullptr ? ANativeWindow_fromSurface(env, surface) : nullptr;
@@ -97,9 +129,19 @@ Java_top_mobilegl_plugin_trace_TraceReplayActivity_nativeRunTraceReplay(JNIEnv*
ANativeWindow_release(window);
}
mobilegl_trace::Result result = mobilegl_trace::RunTraceReplay(request);
mobilegl_trace_set_native_window(nullptr);
mobilegl_trace_set_requested_size(0, 0);
mobilegl_trace::Result result;
try {
result = mobilegl_trace::RunTraceReplay(request);
} catch (const std::exception& exception) {
result = MakeFailureResult(request,
mobilegl_trace::STATUS_RETRACE_FAILED,
"trace replay failed with unhandled native exception: " +
std::string(exception.what()));
} catch (...) {
result = MakeFailureResult(request,
mobilegl_trace::STATUS_RETRACE_FAILED,
"trace replay failed with unknown native exception");
}
if (!result.resultPath.empty()) {
mobilegl_trace::WriteResultJson(request, result);
}