From a722b4a8c9715bca727b312e68537c49d76149ed Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Mon, 29 Jan 2024 20:48:01 +0700 Subject: [PATCH] Build: split sandboxed & TrollStore JIT version Sandboxed version installed using TrollStore will use URL Scheme to enable JIT. tipa build keeps self-JIT but is unsafe to use. --- .github/workflows/development.yml | 18 +++++++++++++- .github/workflows/release.yml | 12 +++++++++- .../java/net/kdt/pojavlaunch/uikit/UIKit.java | 1 - Makefile | 18 ++++++++++---- Natives/JavaGUIViewController.m | 17 ++++++------- Natives/LauncherMenuViewController.m | 2 +- Natives/LauncherNavigationController.m | 8 +++++-- Natives/main.m | 2 +- entitlements.sideload.xml | 24 +++++++++++++++++++ ...lements.xml => entitlements.trollstore.xml | 0 10 files changed, 82 insertions(+), 20 deletions(-) create mode 100644 entitlements.sideload.xml rename entitlements.xml => entitlements.trollstore.xml (100%) diff --git a/.github/workflows/development.yml b/.github/workflows/development.yml index 20e3fc2e17..b0a4af8eec 100644 --- a/.github/workflows/development.yml +++ b/.github/workflows/development.yml @@ -116,19 +116,35 @@ jobs: export PATH=/opt/procursus/bin:/opt/homebrew/bin:$PATH export RUNNER=1 SLIMMED=1 gmake -j$(sysctl -n hw.ncpu) dsym package PLATFORM=${{ matrix.platform }} - + # Additionally build TrollStore (auto JIT) tipa for iOS + if [ "${{ matrix.platform_name }}" == "ios" ]; then + gmake -j$(sysctl -n hw.ncpu) dsym package PLATFORM=${{ matrix.platform }} TROLLSTORE_JIT_ENT=1 + fi + - name: Upload regular ipa uses: actions/upload-artifact@v3 with: name: net.kdt.pojavlauncher-${{ matrix.platform_name }}.ipa path: artifacts/net.kdt.pojavlauncher-*-${{ matrix.platform_name }}.ipa + - name: Upload regular tipa + uses: actions/upload-artifact@v3 + with: + name: net.kdt.pojavlauncher-${{ matrix.platform_name }}-trollstore.tipa + path: artifacts/net.kdt.pojavlauncher-*-${{ matrix.platform_name }}-trollstore.tipa + - name: Upload slimmed ipa uses: actions/upload-artifact@v3 with: name: net.kdt.pojavlauncher.slimmed-${{ matrix.platform_name }}.ipa path: artifacts/net.kdt.pojavlauncher.slimmed-*-${{ matrix.platform_name }}.ipa + - name: Upload slimmed tipa + uses: actions/upload-artifact@v3 + with: + name: net.kdt.pojavlauncher.slimmed-${{ matrix.platform_name }}-trollstore.tipa + path: artifacts/net.kdt.pojavlauncher.slimmed-*-${{ matrix.platform_name }}-trollstore.tipa + - name: Upload PojavLauncher.dSYM uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index deeeca642a..ff5a224644 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -109,13 +109,23 @@ jobs: export PATH=/opt/procursus/bin:/opt/homebrew/bin:$PATH export RUNNER=1 gmake -j$(sysctl -n hw.ncpu) dsym package PLATFORM=${{ matrix.platform }} - + # Additionally build TrollStore (auto JIT) tipa for iOS + if [ "${{ matrix.platform_name }}" == "ios" ]; then + gmake -j$(sysctl -n hw.ncpu) dsym package PLATFORM=${{ matrix.platform }} TROLLSTORE_JIT_ENT=1 + fi + - name: Upload regular ipa uses: actions/upload-artifact@v3 with: name: net.kdt.pojavlauncher-${{ matrix.platform_name }}.ipa path: artifacts/net.kdt.pojavlauncher-*-${{ matrix.platform_name }}.ipa + - name: Upload regular tipa + uses: actions/upload-artifact@v3 + with: + name: net.kdt.pojavlauncher-${{ matrix.platform_name }}.tipa + path: artifacts/net.kdt.pojavlauncher-*-${{ matrix.platform_name }}-trollstore.tipa + - name: Upload PojavLauncher.dSYM uses: actions/upload-artifact@v3 with: diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java index 00883defa7..2c46a62677 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java @@ -64,7 +64,6 @@ public static void updateMCGuiScale() { System.load(System.getenv("BUNDLE_PATH") + "/PojavLauncher"); } - public static native void refreshAWTBuffer(int[] array); // public static native void runOnUIThread(UIKitCallback callback); diff --git a/Makefile b/Makefile index ebd0e7c645..690e65e8d1 100644 --- a/Makefile +++ b/Makefile @@ -135,11 +135,16 @@ METHOD_CHANGE_PLAT = \ # Function to package the application METHOD_PACKAGE = \ + if [ '$(TROLLSTORE_JIT_ENT)' == '1' ]; then \ + IPA_SUFFIX="-trollstore.tipa"; \ + else \ + IPA_SUFFIX=".ipa"; \ + fi; \ if [ '$(SLIMMED_ONLY)' = '0' ]; then \ - zip --symlinks -r $(OUTPUTDIR)/net.kdt.pojavlauncher-$(VERSION)-$(PLATFORM_NAME).ipa Payload; \ + zip --symlinks -r $(OUTPUTDIR)/net.kdt.pojavlauncher-$(VERSION)-$(PLATFORM_NAME)$$IPA_SUFFIX Payload; \ fi; \ if [ '$(SLIMMED)' = '1' ] || [ '$(SLIMMED_ONLY)' = '1' ]; then \ - zip --symlinks -r $(OUTPUTDIR)/net.kdt.pojavlauncher.slimmed-$(VERSION)-$(PLATFORM_NAME).ipa Payload --exclude='Payload/PojavLauncher.app/java_runtimes/*'; \ + zip --symlinks -r $(OUTPUTDIR)/net.kdt.pojavlauncher.slimmed-$(VERSION)-$(PLATFORM_NAME)$$IPA_SUFFIX Payload --exclude='Payload/PojavLauncher.app/java_runtimes/*'; \ fi # Function to download and unpack Java runtimes. @@ -325,8 +330,11 @@ payload: native java jre assets if [ '$(SLIMMED_ONLY)' != '1' ]; then \ cp -R $(OUTPUTDIR)/java_runtimes $(OUTPUTDIR)/Payload/PojavLauncher.app; \ fi - ldid -S $(OUTPUTDIR)/Payload/PojavLauncher.app; \ - ldid -S$(SOURCEDIR)/entitlements.xml $(OUTPUTDIR)/Payload/PojavLauncher.app/PojavLauncher; \ + if [ '$(TROLLSTORE_JIT_ENT)' == '1' ]; then \ + ldid -S$(SOURCEDIR)/entitlements.trollstore.xml $(OUTPUTDIR)/Payload/PojavLauncher.app; \ + else \ + ldid -S$(SOURCEDIR)/entitlements.sideload.xml $(OUTPUTDIR)/Payload/PojavLauncher.app; \ + fi chmod -R 755 $(OUTPUTDIR)/Payload if [ '$(PLATFORM)' != '2' ]; then \ $(call METHOD_MACHO,$(OUTPUTDIR)/Payload/PojavLauncher.app,$(call METHOD_CHANGE_PLAT,$(PLATFORM),$$file)); \ @@ -339,7 +347,7 @@ deploy: cd $(OUTPUTDIR); \ if [ '$(IOS)' = '1' ]; then \ ldid -S $(WORKINGDIR)/PojavLauncher.app || exit 1; \ - ldid -S$(SOURCEDIR)/entitlements.xml $(WORKINGDIR)/PojavLauncher.app/PojavLauncher || exit 1; \ + ldid -S$(SOURCEDIR)/entitlements.trollstore.xml $(WORKINGDIR)/PojavLauncher.app/PojavLauncher || exit 1; \ sudo mv $(WORKINGDIR)/*.dylib $(PREFIX)Applications/PojavLauncher.app/Frameworks/ || exit 1; \ sudo mv $(WORKINGDIR)/PojavLauncher.app/PojavLauncher $(PREFIX)Applications/PojavLauncher.app/PojavLauncher || exit 1; \ sudo mv $(SOURCEDIR)/JavaApp/local_out/*.jar $(PREFIX)Applications/PojavLauncher.app/libs/ || exit 1; \ diff --git a/Natives/JavaGUIViewController.m b/Natives/JavaGUIViewController.m index aa88ce313d..259828d985 100644 --- a/Natives/JavaGUIViewController.m +++ b/Natives/JavaGUIViewController.m @@ -298,16 +298,17 @@ - (void)viewDidLoad { setenv("POJAV_SKIP_JNI_GLFW", "1", 1); // Register the display loop - CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:surfaceView selector:@selector(refreshBuffer)]; - if (@available(iOS 15.0, tvOS 15.0, *)) { - if(getPrefBool(@"video.max_framerate")) { - displayLink.preferredFrameRateRange = CAFrameRateRangeMake(30, 120, 120); - } else { - displayLink.preferredFrameRateRange = CAFrameRateRangeMake(30, 60, 60); - } - } dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:surfaceView selector:@selector(refreshBuffer)]; + if (@available(iOS 15.0, tvOS 15.0, *)) { + if(getPrefBool(@"video.max_framerate")) { + displayLink.preferredFrameRateRange = CAFrameRateRangeMake(30, 120, 120); + } else { + displayLink.preferredFrameRateRange = CAFrameRateRangeMake(30, 60, 60); + } + } [displayLink addToRunLoop:NSRunLoop.currentRunLoop forMode:NSRunLoopCommonModes]; + [NSRunLoop.currentRunLoop run]; }); diff --git a/Natives/LauncherMenuViewController.m b/Natives/LauncherMenuViewController.m index 0915c2761c..672d915e50 100644 --- a/Natives/LauncherMenuViewController.m +++ b/Natives/LauncherMenuViewController.m @@ -88,7 +88,7 @@ - (void)viewDidLoad { UIActivityViewController *activityVC; if (realUIIdiom != UIUserInterfaceIdiomTV) { activityVC = [[UIActivityViewController alloc] - initWithActivityItems:@[@"latestlog.txt", [NSURL URLWithString:latestlogPath]] + initWithActivityItems:@[[NSURL URLWithString:latestlogPath]] applicationActivities:nil]; } else { dlopen("/System/Library/PrivateFrameworks/SharingUI.framework/SharingUI", RTLD_GLOBAL); diff --git a/Natives/LauncherNavigationController.m b/Natives/LauncherNavigationController.m index bcc705c4d1..20df559f62 100644 --- a/Natives/LauncherNavigationController.m +++ b/Natives/LauncherNavigationController.m @@ -281,6 +281,10 @@ - (void)invokeAfterJITEnabled:(void(^)(void))handler { handler(); }); return; + } else if (getEntitlementValue(@"local.sandboxed-jit")) { + NSURL *jitURL = [NSURL URLWithString:[NSString stringWithFormat:@"apple-magnifier://enable-jit?bundle-id=%@", NSBundle.mainBundle.bundleIdentifier]]; + [UIApplication.sharedApplication openURL:jitURL options:@{} completionHandler:nil]; + // Do not return, wait for TrollStore to enable JIT and jump back } else if (getPrefBool(@"debug.debug_skip_wait_jit")) { NSLog(@"Debug option skipped waiting for JIT. Java might not work."); handler(); @@ -302,8 +306,8 @@ - (void)invokeAfterJITEnabled:(void(^)(void))handler { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ while (!isJITEnabled(false)) { - // Perform check for every second - sleep(1); + // Perform check for every 200ms + usleep(1000*200); } dispatch_async(dispatch_get_main_queue(), ^{ [alert dismissViewControllerAnimated:YES completion:handler]; diff --git a/Natives/main.m b/Natives/main.m index 7326e55368..c7a2528b27 100644 --- a/Natives/main.m +++ b/Natives/main.m @@ -108,7 +108,7 @@ void init_logDeviceAndVer(char *argument) { NSString *tsPath = [NSString stringWithFormat:@"%@/../_TrollStore", NSBundle.mainBundle.bundlePath]; const char *type; - if ([fm fileExistsAtPath:tsPath]) { + if (!access(tsPath.UTF8String, F_OK)) { type = "TrollStore"; } else if (isJailbroken) { type = "Jailbroken"; diff --git a/entitlements.sideload.xml b/entitlements.sideload.xml new file mode 100644 index 0000000000..50970f4ad0 --- /dev/null +++ b/entitlements.sideload.xml @@ -0,0 +1,24 @@ + + + + application-identifier + net.kdt.pojavlauncher +com.apple.private.security.container-required + net.kdt.pojavlauncher + get-task-allow + + + com.apple.developer.kernel.extended-virtual-addressing + + com.apple.developer.kernel.increased-memory-limit + + + + com.apple.private.memorystatus + + + + local.sandboxed-jit + + + diff --git a/entitlements.xml b/entitlements.trollstore.xml similarity index 100% rename from entitlements.xml rename to entitlements.trollstore.xml