From 8d1b57d7edec4205afd3402e22ce63d15216bf45 Mon Sep 17 00:00:00 2001 From: LukeMackin Date: Mon, 20 Jul 2026 15:45:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B3=A8=E5=86=8CPackageInstallerModule?= =?UTF-8?q?=E5=8E=9F=E7=94=9F=E6=A8=A1=E5=9D=97(MainApplication+ReactPacka?= =?UTF-8?q?ge)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gradle/8.10.2/fileHashes/fileHashes.bin | Bin 36597 -> 88765 bytes .../.gradle/8.10.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.10.2/fileHashes/resourceHashesCache.bin | Bin 19687 -> 19823 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../android/.gradle/file-system.probe | Bin 8 -> 8 bytes .../main/java/dev/yuzu/gca/MainApplication.kt | 21 +++++++- .../dev/yuzu/gca/PackageInstallerModule.kt | 51 ++++++++++++++++++ .../dev/yuzu/gca/PackageInstallerPackage.kt | 12 +++++ 8 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerModule.kt create mode 100644 packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerPackage.kt 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 83bf4f15d61bde7103b4734573bf13cb00b1a21b..93366934a3bc78d9075b0bfa08cc76353ecddc96 100644 GIT binary patch literal 88765 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 delta 901 zcmXYuZAjf!9LMjK?r5NE26BGKr|tTfsr#S5TTV?|-sSFf;G$v!Uo>wo3Jex((Ao_~ zY+$fnMD?M>K%qfWLDCo-6c`w6V35$j7lW>PojPx7o2GZpr}_mQ_?++IJbcgZd(QBU z&{}`i4`q@oHCX{|PrVlixa>e6_%<)&=K(&iU<=* z#nI^Az=dgI%d^<1PRT|Tl%V}XF9p~Ji>b;;fELh%OFpMmy|Dteh(K5Yg$X&8TmJI2o zPxHx<^SoO3<{fxz>FmkE8tl*pk0tNNhMpHY_EZ!mFExzD>)on^CH^ zELXRLJ6oDzTQhEJM%5M7#vPx_JHpt}==HXjo(%R@Wd)_TQ#;n$zUl3ILI<2lrfmIW~CgU#0ziH~;_u 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 d1377833770c4b0d0c616703622d9fb35ae9f969..fd1f4ec1e28e6ae5eb2dcef83d0688a5ba461eb0 100644 GIT binary patch literal 17 VcmZQB%juVvop5vw0~jzL0RSyM1a$xa literal 17 VcmZQB%juVvop5vw0~jz)1pqAy1VjJ; 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 577e9c0563cbce621599bda35d9e9b13103f534b..079ba66529858dbdb93d0245b5107bf82fefb405 100644 GIT binary patch delta 253 zcmaDplkxp5#tkMCjOvq3B~}O=`8CDC^H%u_1~Bk>zWJ(z1ET=5ZPwhwJ^G3eQD5K5 zyix%IA}?*jOgI@upn}?yL!~wdgqVjen3Q@t3@XSu`L9$r%#?n99soX$8IaC$*-(4-2F%z6|>z = + PackageList(this).packages.apply { add(PackageInstallerPackage()) } + override fun getJSMainModuleName() = "index" + override fun getUseDeveloperSupport() = false + } + + override fun onCreate() { + super.onCreate() + SoLoader.init(this, false) + } +} diff --git a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerModule.kt b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerModule.kt new file mode 100644 index 0000000..3237fd7 --- /dev/null +++ b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerModule.kt @@ -0,0 +1,51 @@ +package dev.yuzu.gca + +import android.app.PendingIntent +import android.content.Intent +import android.content.pm.PackageInstaller +import com.facebook.react.bridge.* +import java.io.File +import java.security.MessageDigest + +class PackageInstallerModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { + override fun getName() = "PackageInstallerModule" + + @ReactMethod + fun installApk(filePath: String, expectedSha256: String, promise: Promise) { + try { + val context = reactApplicationContext + val apkFile = File(filePath) + if (!apkFile.exists()) { promise.reject("NOT_FOUND", "APK not found"); return } + + if (!context.packageManager.canRequestPackageInstalls()) { + promise.reject("PERMISSION", "Install permission not granted"); return + } + + // SHA256 verify + val sha256 = MessageDigest.getInstance("SHA-256") + apkFile.inputStream().use { input -> + val buf = ByteArray(8192); var read: Int + while (input.read(buf).also { read = it } != -1) sha256.update(buf, 0, read) + } + if (sha256.digest().joinToString("") { "%02x".format(it) } != expectedSha256) { + promise.reject("SHA256", "SHA256 mismatch"); return + } + + val pi = context.packageManager.packageInstaller + val sessionId = pi.createSession(PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)) + val session = pi.openSession(sessionId) + try { + apkFile.inputStream().use { input -> + session.openWrite("package", 0, apkFile.length()).use { output -> + input.copyTo(output); session.fsync(output) + } + } + val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName) + ?: run { promise.reject("NO_INTENT", "No launch intent"); return } + session.commit(PendingIntent.getActivity(context, 0, launchIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE).intentSender) + promise.resolve("installed") + } finally { session.close() } + } catch (e: Exception) { promise.reject("ERROR", e.message) } + } +} diff --git a/packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerPackage.kt b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerPackage.kt new file mode 100644 index 0000000..eb4c2f1 --- /dev/null +++ b/packages/client-android/android/app/src/main/java/dev/yuzu/gca/PackageInstallerPackage.kt @@ -0,0 +1,12 @@ +package dev.yuzu.gca + +import com.facebook.react.ReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.ViewManager + +class PackageInstallerPackage : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): List = + listOf(PackageInstallerModule(reactContext)) + override fun createViewManagers(reactContext: ReactApplicationContext): List> = emptyList() +}