Merge pull request #223 from FCL-Team/java21

Java21
This commit is contained in:
Tungstend 2024-01-28 20:01:22 +08:00 committed by GitHub
commit d95a5ee527
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 132 additions and 52 deletions

View File

@ -51,7 +51,7 @@ android {
variant.mergeAssetsProvider.get().doLast {
def arch = System.getProperty("arch", "all")
def assetsDir = mergeAssetsProvider.get().outputDir.get()
def java = ['jre8', 'jre17']
def java = ['jre8', 'jre17', 'jre21']
println(arch)
java.forEach { String str ->
def runtimeDir = new File([assetsDir, "app_runtime/java/" + str].join(File.separator))

View File

@ -0,0 +1 @@
1

View File

@ -7,7 +7,6 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -18,6 +17,7 @@ import com.tungsten.fcl.util.RuntimeUtils;
import com.tungsten.fclauncher.utils.FCLPath;
import com.tungsten.fclcore.util.io.FileUtils;
import com.tungsten.fcllibrary.component.FCLFragment;
import com.tungsten.fcllibrary.component.view.FCLProgressBar;
import com.tungsten.fcllibrary.util.LocaleUtils;
import com.tungsten.fcllibrary.component.view.FCLButton;
import com.tungsten.fcllibrary.component.view.FCLImageView;
@ -33,18 +33,21 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
boolean cacio17 = false;
boolean java8 = false;
boolean java17 = false;
boolean java21 = false;
private ProgressBar lwjglProgress;
private ProgressBar cacioProgress;
private ProgressBar cacio17Progress;
private ProgressBar java8Progress;
private ProgressBar java17Progress;
private FCLProgressBar lwjglProgress;
private FCLProgressBar cacioProgress;
private FCLProgressBar cacio17Progress;
private FCLProgressBar java8Progress;
private FCLProgressBar java17Progress;
private FCLProgressBar java21Progress;
private FCLImageView lwjglState;
private FCLImageView cacioState;
private FCLImageView cacio17State;
private FCLImageView java8State;
private FCLImageView java17State;
private FCLImageView java21State;
private FCLButton install;
@ -58,12 +61,14 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
cacio17Progress = findViewById(view, R.id.cacio17_progress);
java8Progress = findViewById(view, R.id.java8_progress);
java17Progress = findViewById(view, R.id.java17_progress);
java21Progress = findViewById(view, R.id.java21_progress);
lwjglState = findViewById(view, R.id.lwjgl_state);
cacioState = findViewById(view, R.id.cacio_state);
cacio17State = findViewById(view, R.id.cacio17_state);
java8State = findViewById(view, R.id.java8_state);
java17State = findViewById(view, R.id.java17_state);
java21State = findViewById(view, R.id.java21_state);
initState();
@ -80,26 +85,11 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
private void initState() {
try {
lwjgl = RuntimeUtils.isLatest(FCLPath.LWJGL_DIR, "/assets/app_runtime/lwjgl");
} catch (IOException e) {
e.printStackTrace();
}
try {
cacio = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_8_DIR, "/assets/app_runtime/caciocavallo");
} catch (IOException e) {
e.printStackTrace();
}
try {
cacio17 = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_17_DIR, "/assets/app_runtime/caciocavallo17");
} catch (IOException e) {
e.printStackTrace();
}
try {
java8 = RuntimeUtils.isLatest(FCLPath.JAVA_8_PATH, "/assets/app_runtime/java/jre8");
} catch (IOException e) {
e.printStackTrace();
}
try {
java17 = RuntimeUtils.isLatest(FCLPath.JAVA_17_PATH, "/assets/app_runtime/java/jre17");
java21 = RuntimeUtils.isLatest(FCLPath.JAVA_21_PATH, "/assets/app_runtime/java/jre21");
} catch (IOException e) {
e.printStackTrace();
}
@ -118,11 +108,12 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
cacio17State.setBackgroundDrawable(cacio17 ? stateDone : stateUpdate);
java8State.setBackgroundDrawable(java8 ? stateDone : stateUpdate);
java17State.setBackgroundDrawable(java17 ? stateDone : stateUpdate);
java21State.setBackgroundDrawable(java21 ? stateDone : stateUpdate);
}
}
private boolean isLatest() {
return lwjgl && cacio && cacio17 && java8 && java17;
return lwjgl && cacio && cacio17 && java8 && java17 && java21;
}
private void check() {
@ -245,6 +236,31 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
}
}).start();
}
if (!java21) {
java21State.setVisibility(View.GONE);
java21Progress.setVisibility(View.VISIBLE);
new Thread(() -> {
try {
RuntimeUtils.installJava(getContext(), FCLPath.JAVA_21_PATH, "app_runtime/java/jre21");
if (!LocaleUtils.getSystemLocale().getDisplayName().equals(Locale.CHINA.getDisplayName())) {
FileUtils.writeText(new File(FCLPath.JAVA_21_PATH + "/resolv.conf"), "nameserver 1.1.1.1\n" + "nameserver 1.0.0.1");
} else {
FileUtils.writeText(new File(FCLPath.JAVA_21_PATH + "/resolv.conf"), "nameserver 8.8.8.8\n" + "nameserver 8.8.4.4");
}
java21 = true;
} catch (IOException e) {
e.printStackTrace();
}
if (getActivity() != null) {
getActivity().runOnUiThread(() -> {
java21State.setVisibility(View.VISIBLE);
java21Progress.setVisibility(View.GONE);
refreshDrawables();
check();
});
}
}).start();
}
}
@Override

View File

@ -78,7 +78,8 @@ public class JarExecutorHelper {
return 8;
int diffFactorFirst = Math.abs(8 - majorVersion);
int diffFactorSecond = Math.abs(17 - majorVersion);
return diffFactorFirst < diffFactorSecond ? 8 : 17;
int diffFactorThird = Math.abs(21 - majorVersion);
return diffFactorFirst < diffFactorSecond ? 8 : diffFactorSecond < diffFactorThird ? 17 : 21;
}
private static int getJavaVersion(File file) {

View File

@ -119,7 +119,7 @@ public class JarExecutorLauncher extends Launcher {
FCLConfig config = new FCLConfig(
context,
FCLPath.LOG_DIR,
javaVersion == 8 ? FCLPath.JAVA_8_PATH : FCLPath.JAVA_17_PATH,
javaVersion == 8 ? FCLPath.JAVA_8_PATH : javaVersion == 17 ? FCLPath.JAVA_17_PATH : FCLPath.JAVA_21_PATH,
Profiles.getSelectedProfile().getGameDir().getAbsolutePath(),
FCLConfig.Renderer.RENDERER_GL4ES,
finalArgs

View File

@ -137,6 +137,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
javaVersionDataList.add(JavaVersion.JAVA_AUTO.getId());
javaVersionDataList.add(JavaVersion.JAVA_8.getId());
javaVersionDataList.add(JavaVersion.JAVA_17.getId());
javaVersionDataList.add(JavaVersion.JAVA_21.getId());
javaSpinner.setDataList(javaVersionDataList);
ArrayList<FCLConfig.Renderer> rendererDataList = new ArrayList<>();
@ -152,6 +153,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
javaVersionList.add(getContext().getString(R.string.settings_game_java_version_auto));
javaVersionList.add("JRE 8");
javaVersionList.add("JRE 17");
javaVersionList.add("JRE 21");
ArrayAdapter<String> javaAdapter = new ArrayAdapter<>(getContext(), R.layout.item_spinner_auto_tint, javaVersionList);
javaAdapter.setDropDownViewResource(R.layout.item_spinner_dropdown);
javaSpinner.setAdapter(javaAdapter);

View File

@ -220,6 +220,47 @@
</androidx.appcompat.widget.LinearLayoutCompat>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"/>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/splash_runtime_java21"
android:layout_gravity="center"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.tungsten.fcllibrary.component.view.FCLProgressBar
android:visibility="gone"
android:layout_width="24dp"
android:layout_height="24dp"
android:id="@+id/java21_progress"
android:layout_gravity="center"
android:layout_marginStart="10dp"/>
<com.tungsten.fcllibrary.component.view.FCLImageView
app:auto_src_tint="false"
android:backgroundTint="@android:color/darker_gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/java21_state"
android:layout_gravity="center"
android:layout_marginStart="10dp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</ScrollView>

View File

@ -13,6 +13,7 @@
<string name="splash_runtime_cacio17" translatable="false">Caciocavallo 17</string>
<string name="splash_runtime_java8" translatable="false">JRE 8</string>
<string name="splash_runtime_java17" translatable="false">JRE 17</string>
<string name="splash_runtime_java21" translatable="false">JRE 21</string>
<string name="splash_runtime_install">Install / Update</string>
<string name="account">Account</string>

View File

@ -35,8 +35,8 @@ public class ProcessService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String[] command = intent.getExtras().getStringArray("command");
boolean first = intent.getExtras().getBoolean("first");
String jre = first ? "jre8" : "jre17";
int java = intent.getExtras().getInt("java");
String jre = "jre" + java;
FCLConfig config = new FCLConfig(
getApplicationContext(),
Environment.getExternalStorageDirectory().getAbsolutePath() + "/FCL/log",

View File

@ -157,7 +157,7 @@ public class ForgeNewInstallTask extends Task<Version> {
command.addAll(args);
runJVMProcess(processor, command, true);
runJVMProcess(processor, command, 8);
for (Map.Entry<String, String> entry : outputs.entrySet()) {
Path artifact = Paths.get(entry.getKey());
@ -177,7 +177,7 @@ public class ForgeNewInstallTask extends Task<Version> {
}
}
private void runJVMProcess(ForgeNewInstallProfile.Processor processor, List<String> command, boolean first) throws Exception {
private void runJVMProcess(ForgeNewInstallProfile.Processor processor, List<String> command, int java) throws Exception {
LOG.info("Executing external processor " + processor.getJar().toString() + ", command line: " + new CommandBuilder().addAll(command).toString());
int exitCode;
boolean listen = true;
@ -195,15 +195,17 @@ public class ForgeNewInstallTask extends Task<Version> {
Intent service = new Intent(FCLPath.CONTEXT, ProcessService.class);
Bundle bundle = new Bundle();
bundle.putStringArray("command", command.toArray(new String[0]));
bundle.putBoolean("first", first);
bundle.putInt("java", java);
service.putExtras(bundle);
FCLPath.CONTEXT.startService(service);
server.start();
latch.await();
exitCode = Integer.parseInt((String) server.getResult());
if (exitCode != 0) {
if (first) {
runJVMProcess(processor, command, false);
if (java == 8) {
runJVMProcess(processor, command, 17);
} else if (java == 17) {
runJVMProcess(processor, command, 21);
} else {
throw new IOException("Game processor exited abnormally with code " + exitCode);
}

View File

@ -158,7 +158,7 @@ public class NeoForgeOldInstallTask extends Task<Version> {
command.addAll(args);
runJVMProcess(processor, command, true);
runJVMProcess(processor, command, 8);
for (Map.Entry<String, String> entry : outputs.entrySet()) {
Path artifact = Paths.get(entry.getKey());
@ -178,7 +178,7 @@ public class NeoForgeOldInstallTask extends Task<Version> {
}
}
private void runJVMProcess(ForgeNewInstallProfile.Processor processor, List<String> command, boolean first) throws Exception {
private void runJVMProcess(ForgeNewInstallProfile.Processor processor, List<String> command, int java) throws Exception {
LOG.info("Executing external processor " + processor.getJar().toString() + ", command line: " + new CommandBuilder().addAll(command).toString());
int exitCode;
boolean listen = true;
@ -196,15 +196,17 @@ public class NeoForgeOldInstallTask extends Task<Version> {
Intent service = new Intent(FCLPath.CONTEXT, ProcessService.class);
Bundle bundle = new Bundle();
bundle.putStringArray("command", command.toArray(new String[0]));
bundle.putBoolean("first", first);
bundle.putInt("java", java);
service.putExtras(bundle);
FCLPath.CONTEXT.startService(service);
server.start();
latch.await();
exitCode = Integer.parseInt((String) server.getResult());
if (exitCode != 0) {
if (first) {
runJVMProcess(processor, command, false);
if (java == 8) {
runJVMProcess(processor, command, 17);
} else if (java == 17) {
runJVMProcess(processor, command, 21);
} else {
throw new IOException("Game processor exited abnormally with code " + exitCode);
}

View File

@ -160,7 +160,7 @@ public final class OptiFineInstallTask extends Task<Version> {
dest.toString(),
gameRepository.getLibraryFile(version, optiFineLibrary).toString()
};
runJVMProcess(command, true);
runJVMProcess(command, 8);
} else {
FileUtils.copyFile(dest, gameRepository.getLibraryFile(version, optiFineLibrary).toPath());
}
@ -222,7 +222,7 @@ public final class OptiFineInstallTask extends Task<Version> {
dependencies.add(dependencyManager.checkLibraryCompletionAsync(getResult(), true));
}
private void runJVMProcess(String[] command, boolean first) throws Exception {
private void runJVMProcess(String[] command, int java) throws Exception {
int exitCode;
boolean listen = true;
while (listen) {
@ -239,15 +239,17 @@ public final class OptiFineInstallTask extends Task<Version> {
Intent service = new Intent(FCLPath.CONTEXT, ProcessService.class);
Bundle bundle = new Bundle();
bundle.putStringArray("command", command);
bundle.putBoolean("first", first);
bundle.putInt("java", java);
service.putExtras(bundle);
FCLPath.CONTEXT.startService(service);
server.start();
latch.await();
exitCode = Integer.parseInt((String) server.getResult());
if (exitCode != 0) {
if (first) {
runJVMProcess(command, false);
if (java == 8) {
runJVMProcess(command, 17);
} else if (java == 17) {
runJVMProcess(command, 21);
} else {
throw new IOException("OptiFine patcher failed, command: " + new CommandBuilder().addAll(Arrays.asList(command)));
}

View File

@ -5,8 +5,8 @@ import com.tungsten.fclauncher.utils.FCLPath;
public class JavaVersion {
public static final int JAVA_VERSION_8 = 8;
public static final int JAVA_VERSION_17 = 17;
public static final int JAVA_VERSION_21 = 21;
private final int id;
private final boolean auto;
@ -16,6 +16,7 @@ public class JavaVersion {
public static final JavaVersion JAVA_AUTO = new JavaVersion(0, true, JAVA_VERSION_8, "Auto");
public static final JavaVersion JAVA_8 = new JavaVersion(1, false, JAVA_VERSION_8, "1.8");
public static final JavaVersion JAVA_17 = new JavaVersion(2, false, JAVA_VERSION_17, "17");
public static final JavaVersion JAVA_21 = new JavaVersion(3, false, JAVA_VERSION_21, "21");
public JavaVersion(int id, boolean auto, int version, String versionName) {
this.id = id;
@ -42,24 +43,30 @@ public class JavaVersion {
public String getJavaPath(Version version) {
JavaVersion javaVersion = auto ? getSuitableJavaVersion(version) : this;
return javaVersion.getVersion() == JAVA_VERSION_8 ? FCLPath.JAVA_8_PATH : FCLPath.JAVA_17_PATH;
if (javaVersion.getVersion() == JAVA_VERSION_8) {
return FCLPath.JAVA_8_PATH;
} else if (javaVersion.getVersion() == JAVA_VERSION_17) {
return FCLPath.JAVA_17_PATH;
}
return FCLPath.JAVA_21_PATH;
}
public static JavaVersion getJavaFromId(int id) {
if (id == 0) {
return JAVA_AUTO;
}
else if (id == 1) {
} else if (id == 1) {
return JAVA_8;
}
else {
} else if (id == 2) {
return JAVA_17;
}
return JAVA_21;
}
public static JavaVersion getSuitableJavaVersion(Version version) {
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
return JAVA_8;
} else if (version.getJavaVersion().getMajorVersion() == 21) {
return JAVA_21;
}
return JAVA_17;
}
@ -67,6 +74,8 @@ public class JavaVersion {
public static boolean checkJavaVersion(Version version, JavaVersion javaVersion) {
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
return javaVersion.getVersion() == JAVA_VERSION_8;
} else if (version.getJavaVersion().getMajorVersion() == 21) {
return javaVersion.getVersion() == JAVA_VERSION_21;
}
return javaVersion.getVersion() == JAVA_VERSION_17;
}

View File

@ -136,8 +136,8 @@ public class DefaultLauncher extends Launcher {
// FCL specific args
JavaVersion javaVersion = options.getJava().getId() == 0 ? JavaVersion.getSuitableJavaVersion(version) : options.getJava();
if (javaVersion.getVersion() == JavaVersion.JAVA_VERSION_17) {
res.addDefault("-Dext.net.resolvPath=", FCLPath.JAVA_17_PATH + "/resolv.conf");
if (javaVersion.getVersion() == JavaVersion.JAVA_VERSION_17 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_21) {
res.addDefault("-Dext.net.resolvPath=", javaVersion.getJavaPath(version) + "/resolv.conf");
}
res.addDefault("-Djava.io.tmpdir=", FCLPath.CACHE_DIR);
@ -408,7 +408,7 @@ public class DefaultLauncher extends Launcher {
FCLConfig config = new FCLConfig(
context,
FCLPath.LOG_DIR,
options.getJava().getVersion() == 8 ? FCLPath.JAVA_8_PATH : FCLPath.JAVA_17_PATH,
options.getJava().getJavaPath(version),
repository.getRunDirectory(version.getId()).getAbsolutePath(),
renderer,
finalArgs

View File

@ -17,6 +17,7 @@ public class FCLPath {
public static String RUNTIME_DIR;
public static String JAVA_8_PATH;
public static String JAVA_17_PATH;
public static String JAVA_21_PATH;
public static String LWJGL_DIR;
public static String CACIOCAVALLO_8_DIR;
public static String CACIOCAVALLO_17_DIR;
@ -45,6 +46,7 @@ public class FCLPath {
RUNTIME_DIR = context.getDir("runtime", 0).getAbsolutePath();
JAVA_8_PATH = RUNTIME_DIR + "/java/jre8";
JAVA_17_PATH = RUNTIME_DIR + "/java/jre17";
JAVA_21_PATH = RUNTIME_DIR + "/java/jre21";
LWJGL_DIR = RUNTIME_DIR + "/lwjgl";
CACIOCAVALLO_8_DIR = RUNTIME_DIR + "/caciocavallo";
CACIOCAVALLO_17_DIR = RUNTIME_DIR + "/caciocavallo17";
@ -66,6 +68,7 @@ public class FCLPath {
init(RUNTIME_DIR);
init(JAVA_8_PATH);
init(JAVA_17_PATH);
init(JAVA_21_PATH);
init(LWJGL_DIR);
init(CACIOCAVALLO_8_DIR);
init(CACIOCAVALLO_17_DIR);