diff --git a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin index 748738b..0803200 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin and b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.bin differ diff --git a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock index 273fe3b..1153a92 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock and b/packages/client-android/android/.gradle/8.10.2/executionHistory/executionHistory.lock differ diff --git a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin index bc3fd01..2f9b3a6 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin and b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.bin differ diff --git a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock index d014e12..633a0cd 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock and b/packages/client-android/android/.gradle/8.10.2/fileHashes/fileHashes.lock differ diff --git a/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin b/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin index 7accf69..2b51860 100644 Binary files a/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin and b/packages/client-android/android/.gradle/8.10.2/fileHashes/resourceHashesCache.bin differ diff --git a/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 922e025..fade1c2 100644 Binary files a/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/packages/client-android/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/packages/client-android/android/.gradle/file-system.probe b/packages/client-android/android/.gradle/file-system.probe index 4b43214..a519afb 100644 Binary files a/packages/client-android/android/.gradle/file-system.probe and b/packages/client-android/android/.gradle/file-system.probe differ diff --git a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt index 08d3816..1fbd110 100644 --- a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt +++ b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/MainActivity.kt @@ -1,5 +1,8 @@ package dev.yuzu.gca +import android.app.PendingIntent +import android.content.Intent +import android.content.pm.PackageInstaller import android.graphics.Color import android.os.Bundle import android.widget.Button @@ -161,6 +164,14 @@ class MainActivity : AppCompatActivity() { val actualSha256 = computeSha256(apkFile) if (actualSha256 == manifestSha256) { appendLog(" ✅ SHA256 校验通过!") + // 5. 安装 APK + appendLog("[5/5] 提交安装...") + try { + installApk(apkFile) + appendLog(" ✅ 安装已提交,稍后通知栏点击重启") + } catch (e: Exception) { + appendLog(" ❌ 安装失败: ${e.message}") + } } else { appendLog(" ❌ SHA256 校验失败!") appendLog(" expected: ${manifestSha256.take(32)}") @@ -192,6 +203,33 @@ class MainActivity : AppCompatActivity() { } } + private fun installApk(apkFile: File) { + if (!packageManager.canRequestPackageInstalls()) { + throw SecurityException("需要允许安装未知应用权限") + } + val packageInstaller = packageManager.packageInstaller + val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) + val sessionId = packageInstaller.createSession(params) + val session = packageInstaller.openSession(sessionId) + try { + apkFile.inputStream().use { input -> + session.openWrite("package", 0, apkFile.length()).use { output -> + input.copyTo(output) + session.fsync(output) + } + } + val launchIntent = packageManager.getLaunchIntentForPackage(packageName) + ?: throw Exception("无法获取启动Intent") + val pendingIntent = PendingIntent.getActivity( + this, 0, launchIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + session.commit(pendingIntent.intentSender) + } finally { + session.close() + } + } + private fun computeSha256(file: File): String { val digest = MessageDigest.getInstance("SHA-256") file.inputStream().use { input ->