From 81b5c7e9a474b734a8120f8be571f161b13f8571 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Thu, 30 Apr 2026 22:23:03 +0700 Subject: [PATCH] 4.0.8 - Processor options have been added. --- app/build.gradle | 4 +- .../com/vectras/vm/ExportRomActivity.java | 2 + app/src/main/java/com/vectras/vm/StartVM.java | 5 + .../com/vectras/vm/creator/ListManager.java | 95 +++++++++++++++++++ .../vectras/vm/creator/VMCreatorActivity.java | 30 +++--- .../vectras/vm/creator/VMCreatorSelector.java | 8 ++ .../com/vectras/vm/main/vms/DataMainRoms.java | 2 + .../main/res/layout/activity_vm_creator.xml | 32 +++++++ app/src/main/res/values-vi/strings.xml | 9 ++ app/src/main/res/values/strings.xml | 72 ++++++++++++++ web/data/UpdateConfig.json | 6 +- 11 files changed, 249 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ccd2cf4..6d20a85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 111 - versionName "4.0.7" + versionCode 112 + versionName "4.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/java/com/vectras/vm/ExportRomActivity.java b/app/src/main/java/com/vectras/vm/ExportRomActivity.java index a074321..dd89e75 100644 --- a/app/src/main/java/com/vectras/vm/ExportRomActivity.java +++ b/app/src/main/java/com/vectras/vm/ExportRomActivity.java @@ -127,6 +127,8 @@ public class ExportRomActivity extends AppCompatActivity { vmConfigMap.put("icon", current.itemIcon); } + vmConfigMap.put("cpu", current.cpu); + boolean isUsingDiskInQemuExtraParams = VMManager.isHaveADisk(current.itemExtra); if (FileUtils.isFileExists(current.itemPath)) { diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java index dd290d6..6a29f23 100644 --- a/app/src/main/java/com/vectras/vm/StartVM.java +++ b/app/src/main/java/com/vectras/vm/StartVM.java @@ -43,6 +43,11 @@ public class StartVM { String extraParams = vmData.itemExtra; + String cpu = Objects.requireNonNull(VMCreatorSelector.getCpu(activity, MainSettingsManager.getArch(activity), vmData.cpu).get("value")).toString(); + if (!cpu.isEmpty() && !extraParams.contains("-cpu")) { + extraParams = "-cpu " + cpu + " " + extraParams; + } + String bootFromParams = Objects.requireNonNull(VMCreatorSelector.getBootFrom(activity, vmData.bootFrom).get("value")).toString(); String showBootMenuParams = vmData.isShowBootMenu ? "menu=on" : ""; String bootParams = ""; diff --git a/app/src/main/java/com/vectras/vm/creator/ListManager.java b/app/src/main/java/com/vectras/vm/creator/ListManager.java index ca61285..23e68dd 100644 --- a/app/src/main/java/com/vectras/vm/creator/ListManager.java +++ b/app/src/main/java/com/vectras/vm/creator/ListManager.java @@ -2,6 +2,7 @@ package com.vectras.vm.creator; import android.content.Context; +import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.R; import java.util.ArrayList; @@ -18,6 +19,100 @@ public class ListManager { return list; } + public static ArrayList> cpus(Context context, String arch) { + return switch (arch) { + case MainSettingsManager.ARM64_ARCH -> cpusArm64(context); + case MainSettingsManager.PPC_ARCH -> cpusPpc(context); + default -> cpusX8664(context); + }; + } + + public static ArrayList> cpusX8664(Context context) { + ArrayList> list = new ArrayList<>(); + putToList(list, context.getString(R.string.defaulttext), ""); + putToList(list, context.getString(R.string.qemu64), "qemu64"); + putToList(list, context.getString(R.string.qemu32), "qemu32"); + putToList(list, context.getString(R.string.base_cpu), "base"); + putToList(list, context.getString(R.string.max_cpu), "max"); + //putToList(list, context.getString(R.string.kvm64), "kvm64"); + //putToList(list, context.getString(R.string.kvm32), "kvm32"); + //putToList(list, context.getString(R.string.host_cpu), "host"); + putToList(list, context.getString(R.string.intel_snow_ridge), "Snowridge"); + putToList(list, context.getString(R.string.intel_cooper_lake), "Cooperlake"); + putToList(list, context.getString(R.string.intel_cascade_lake_server), "Cascadelake-Server"); + putToList(list, context.getString(R.string.intel_knights_mill), "KnightsMill"); + putToList(list, context.getString(R.string.intel_denverton), "Denverton"); + putToList(list, context.getString(R.string.intel_skylake_server), "Skylake-Server"); + putToList(list, context.getString(R.string.intel_skylake_client), "Skylake-Client"); + putToList(list, context.getString(R.string.intel_broadwell), "Broadwell"); + putToList(list, context.getString(R.string.intel_haswell), "Haswell"); + putToList(list, context.getString(R.string.intel_ivy_bridge), "IvyBridge"); + putToList(list, context.getString(R.string.intel_sandy_bridge), "SandyBridge"); + putToList(list, context.getString(R.string.intel_westmere), "Westmere"); + putToList(list, context.getString(R.string.intel_nehalem), "Nehalem"); + putToList(list, context.getString(R.string.intel_altom_n270), "n270"); + putToList(list, context.getString(R.string.intel_penryn), "Penryn"); + putToList(list, context.getString(R.string.intel_core_2_duo), "core2duo"); + putToList(list, context.getString(R.string.intel_core_duo), "coreduo"); + putToList(list, context.getString(R.string.intel_conroe), "Conroe"); + putToList(list, context.getString(R.string.intel_pentium_iii), "pentium3"); + putToList(list, context.getString(R.string.intel_pentium_ii), "pentium2"); + putToList(list, context.getString(R.string.intel_pentium), "pentium"); + putToList(list, context.getString(R.string.intel_486), "486"); + putToList(list, context.getString(R.string.amd_epyc_milan), "EPYC-Milan"); + putToList(list, context.getString(R.string.amd_epyc_rome), "EPYC-Rome"); + putToList(list, context.getString(R.string.amd_epyc), "EPYC"); + putToList(list, context.getString(R.string.amd_opteron_g5), "Opteron_G5"); + putToList(list, context.getString(R.string.amd_opteron_g4), "Opteron_G4"); + putToList(list, context.getString(R.string.amd_phenom), "phenom"); + putToList(list, context.getString(R.string.amd_opteron_g3), "Opteron_G3"); + putToList(list, context.getString(R.string.amd_opteron_g2), "Opteron_G2"); + putToList(list, context.getString(R.string.amd_opteron_g1), "Opteron_G1"); + putToList(list, context.getString(R.string.amd_athlon), "athlon"); + putToList(list, context.getString(R.string.hygon_dhyana), "Dhyana"); + return list; + } + + public static ArrayList> cpusArm64(Context context) { + ArrayList> list = new ArrayList<>(); + putToList(list, context.getString(R.string.defaulttext), "max"); + putToList(list, context.getString(R.string.max_cpu), "max"); + //putToList(list, context.getString(R.string.host_cpu), "host"); + putToList(list, context.getString(R.string.cortex_a76), "cortex-a76"); + putToList(list, context.getString(R.string.cortex_a72), "cortex-a72"); + putToList(list, context.getString(R.string.cortex_a57), "cortex-a57"); + putToList(list, context.getString(R.string.cortex_a55), "cortex-a55"); + putToList(list, context.getString(R.string.cortex_a53), "cortex-a53"); + putToList(list, context.getString(R.string.cortex_a35), "cortex-a35"); + putToList(list, context.getString(R.string.cortex_a15), "cortex-a15"); + putToList(list, context.getString(R.string.cortex_a9), "cortex-a9"); + putToList(list, context.getString(R.string.cortex_a8), "cortex-a8"); + putToList(list, context.getString(R.string.cortex_a7), "cortex-a7"); + putToList(list, context.getString(R.string.cortex_m55), "cortex-m55"); + putToList(list, context.getString(R.string.cortex_m33), "cortex-m33"); + putToList(list, context.getString(R.string.cortex_m7), "cortex-m7"); + putToList(list, context.getString(R.string.cortex_m4), "cortex-m4"); + putToList(list, context.getString(R.string.cortex_m3), "cortex-m3"); + putToList(list, context.getString(R.string.cortex_m0), "cortex-m0"); + putToList(list, context.getString(R.string.cortex_r52), "cortex-r52"); + putToList(list, context.getString(R.string.cortex_r5f), "cortex-r5f"); + putToList(list, context.getString(R.string.cortex_r5), "cortex-r5"); + return list; + } + + public static ArrayList> cpusPpc(Context context) { + ArrayList> list = new ArrayList<>(); + putToList(list, context.getString(R.string.defaulttext), "g3"); + putToList(list, context.getString(R.string.cpu_460ex), "460ex"); + putToList(list, context.getString(R.string.e500v2_cpu), "e500v2"); + putToList(list, context.getString(R.string.g4_cpu_turbo), "7457"); + putToList(list, context.getString(R.string.g4_cpu_basic), "g4"); + putToList(list, context.getString(R.string.g3_cpu), "g3"); + putToList(list, context.getString(R.string.g2_cpu_workstation), "604e"); + putToList(list, context.getString(R.string.g2_cpu_low_power), "603e"); + return list; + } + public static void putToList ( ArrayList> listMap, diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java index 1f6bb90..ac19988 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java @@ -77,6 +77,7 @@ public class VMCreatorActivity extends AppCompatActivity { public static DataMainRoms current = new DataMainRoms(); private String thumbnailPath = ""; private String vmID = VMManager.idGenerator(); + private int cpu = 0; private boolean isShowBootMenu = false; private boolean isUseLocalTime = true; private boolean isUseUefi = false; @@ -295,6 +296,11 @@ public class VMCreatorActivity extends AppCompatActivity { if (!MainSettingsManager.getArch(this).equals("X86_64")) binding.cbvUseuefi.setVisibility(View.GONE); + binding.sbvCpu.setOnClickListener(v -> VMCreatorSelector.cpu(this, MainSettingsManager.getArch(this), cpu, ((position, name, value) -> { + cpu = position; + binding.sbvCpu.setSubtitle(name); + }))); + binding.sbvBootfrom.setOnClickListener(v -> VMCreatorSelector.bootFrom(this, bootFrom, ((position, name, value) -> { bootFrom = position; binding.sbvBootfrom.setSubtitle(name); @@ -392,6 +398,8 @@ public class VMCreatorActivity extends AppCompatActivity { }); } + binding.svSharedFolder.setSubTitle(AppConfig.sharedFolder); + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { @@ -627,12 +635,14 @@ public class VMCreatorActivity extends AppCompatActivity { binding.qemu.setText(VmFileManager.textMarkToPath(vmID, current.itemExtra)); } + cpu = current.cpu; + binding.sbvCpu.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpu(this, MainSettingsManager.getArch(this), current.cpu).get("name")).toString()); + bootFrom = current.bootFrom; binding.sbvBootfrom.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getBootFrom(this, current.bootFrom).get("name")).toString()); isShowBootMenu = current.isShowBootMenu; binding.cbvShowbootmenu.setChecked(isShowBootMenu); - binding.svSharedFolder.setSubTitle(AppConfig.sharedFolder); sharedFolder = current.sharedFolder; binding.svSharedFolder.setChecked(sharedFolder); @@ -658,22 +668,18 @@ public class VMCreatorActivity extends AppCompatActivity { if (DeviceUtils.is64bit()) { defQemuParams = switch (MainSettingsManager.getArch(this)) { case "ARM64" -> - "-M virt,virtualization=true -cpu cortex-a76 -accel tcg,thread=multi -net nic,model=e1000 -net user -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; - case "PPC" -> "-M mac99 -cpu g4 -accel tcg,thread=multi -smp 1"; - case "I386" -> - "-M pc -cpu coreduo,+popcnt -accel tcg,thread=multi -smp 4 -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; + "-M virt,virtualization=true -accel tcg,thread=multi -net nic,model=e1000 -net user -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; + case "PPC" -> "-M mac99 -accel tcg,thread=multi -smp 1"; default -> - "-M pc -cpu core2duo,+popcnt -accel tcg,thread=multi -smp 4 -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; + "-M pc -accel tcg,thread=multi -smp 4 -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; }; } else { defQemuParams = switch (MainSettingsManager.getArch(this)) { case "ARM64" -> - "-M virt -cpu cortex-a76 -net nic,model=e1000 -net user -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; - case "PPC" -> "-M mac99 -cpu g4 -smp 1"; - case "I386" -> - "-M pc -cpu coreduo,+popcnt -smp 4 -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; + "-M virt -net nic,model=e1000 -net user -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; + case "PPC" -> "-M mac99 -smp 1"; default -> - "-M pc -cpu core2duo,+popcnt -smp 4 -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; + "-M pc -smp 4 -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; }; } binding.title.setText(getString(R.string.new_vm)); @@ -776,6 +782,7 @@ public class VMCreatorActivity extends AppCompatActivity { HashMap vmConfigMap = new HashMap<>(); vmConfigMap.put("imgName", Objects.requireNonNull(binding.title.getText()).toString()); vmConfigMap.put("imgIcon", thumbnailPath); + vmConfigMap.put("imgPath", Objects.requireNonNull(binding.drive.getText()).toString()); vmConfigMap.put("imgCdrom", Objects.requireNonNull(binding.cdrom.getText()).toString()); vmConfigMap.put("sharedFolder", sharedFolder); @@ -794,6 +801,7 @@ public class VMCreatorActivity extends AppCompatActivity { private DataMainRoms finalVmConfig() { current.itemName = Objects.requireNonNull(binding.title.getText()).toString(); current.itemIcon = thumbnailPath; + current.cpu = cpu; current.itemPath = Objects.requireNonNull(binding.drive.getText()).toString(); current.imgCdrom = Objects.requireNonNull(binding.cdrom.getText()).toString(); current.sharedFolder = sharedFolder; diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java index 32e0cf7..41940cc 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java @@ -29,10 +29,18 @@ public class VMCreatorSelector { void onSelected(int position, String name, String value); } + public static HashMap getCpu(Context context, String arch, int position) { + return ListManager.cpus(context, arch).get(position); + } + public static HashMap getBootFrom(Context context, int position) { return ListManager.bootFrom(context).get(position); } + public static void cpu(Activity activity, String arch, int position, SelectorCallback callback) { + showDialog(activity, ListManager.cpus(activity, arch), position, callback, activity.getString(R.string.processor)); + } + public static void bootFrom(Activity activity, int position, SelectorCallback callback) { showDialog(activity, ListManager.bootFrom(activity), position, callback, activity.getString(R.string.boot_from)); } diff --git a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java index 5f7127a..bc24369 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java +++ b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java @@ -3,6 +3,8 @@ package com.vectras.vm.main.vms; import com.google.gson.annotations.SerializedName; public class DataMainRoms { + public int cpu = 0; + @SerializedName( value = "icon", alternate = { "imgIcon" } diff --git a/app/src/main/res/layout/activity_vm_creator.xml b/app/src/main/res/layout/activity_vm_creator.xml index ef9b6b7..0fc486b 100644 --- a/app/src/main/res/layout/activity_vm_creator.xml +++ b/app/src/main/res/layout/activity_vm_creator.xml @@ -179,6 +179,38 @@ style="?attr/materialCardViewFilledStyle" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginVertical="8dp" + app:cardBackgroundColor="?attr/colorCard"> + + + + + + + + + + + Kết nối Đang tắt… Không thể lưu ở đây, hãy chọn một nơi khác. + Bộ xử lý + Bo mạch chủ Vterm @@ -711,4 +713,11 @@ Bàn phím Khác Đang thực thi, vui lòng đợi… + + + + G4 (Tăng tốc) + G4 (Cơ bản) + G2 (Máy trạm) + G2 (Tiết kiệm điện) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f483868..ae5fa45 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -567,6 +567,8 @@ Connect Shutting down… Cannot save here, please choose another location. + Processor + Board @@ -723,6 +725,76 @@ Keyboard Other Executing command, please wait… + + + Max + Host + QEMU64 + QEMU32 + Base + KVM64 + KVM32 + Intel Snow Ridge + Intel Cooper Lake + Intel Cascade Lake Server + Intel Knights Mill + Intel Denverton + Intel Skylake Server + Intel Skylake Client + Intel Broadwell + Intel Haswell + Intel Ivy Bridge + Intel Sandy Bridge + Intel Westmere + Intel Nehalem + Intel Altom N270 + Intel Penryn + Intel Core 2 Duo + Intel Core Duo + Intel Conroe + Intel Pentium III + Intel Pentium II + Intel Pentium + Intel 486 + AMD EPYC Milan + AMD EPYC Rome + AMD EPYC + AMD Opteron G5 + AMD Opteron G4 + AMD Phenom + AMD Opteron G3 + AMD Opteron G2 + AMD Opteron G1 + AMD Athlon + Hygon Dhyana + + Cortex A76 + Cortex A72 + Cortex A57 + Cortex A55 + Cortex A53 + Cortex A35 + Cortex A15 + Cortex A9 + Cortex A8 + Cortex A7 + Cortex M55 + Cortex M33 + Cortex M7 + Cortex M4 + Cortex M3 + Cortex M0 + Cortex R52 + Cortex R5F + Cortex R5 + + 460EX + e500 + G4 (Turbo) + G4 (Basic) + G3 + G2 (Workstation) + G2 (Low-Power) diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index ee8e650..feb65e0 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -6,10 +6,10 @@ "Message": "

4.0.0

\nBugs fixed.", "cancellable": true, "versionCodeBeta":"111", - "versionNameBeta":"4.0.7", - "versionNameBetas":"4.0.0,4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7", + "versionNameBeta":"4.0.8", + "versionNameBetas":"4.0.0,4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.0.7

Bugs fixed.", + "MessageBeta": "

4.0.8

Bugs fixed.", "cancellableBeta": true }