- Processor options have been added.
This commit is contained in:
An Bui 2026-04-30 22:23:03 +07:00
parent daf660a7d2
commit 81b5c7e9a4
11 changed files with 249 additions and 16 deletions

View file

@ -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

View file

@ -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)) {

View file

@ -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 = "";

View file

@ -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<HashMap<String, Object>> 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<HashMap<String, Object>> cpusX8664(Context context) {
ArrayList<HashMap<String, Object>> 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<HashMap<String, Object>> cpusArm64(Context context) {
ArrayList<HashMap<String, Object>> 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<HashMap<String, Object>> cpusPpc(Context context) {
ArrayList<HashMap<String, Object>> 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<HashMap<String, Object>> listMap,

View file

@ -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<String, Object> 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;

View file

@ -29,10 +29,18 @@ public class VMCreatorSelector {
void onSelected(int position, String name, String value);
}
public static HashMap<String, Object> getCpu(Context context, String arch, int position) {
return ListManager.cpus(context, arch).get(position);
}
public static HashMap<String, Object> 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));
}

View file

@ -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" }

View file

@ -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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="16dp">
<TextView
style="@style/MaterialAlertDialog.Material3Expressive.Title.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingBottom="8dp"
android:text="@string/board" />
<com.vectras.vm.view.SelectBoxView
android:id="@+id/sbv_cpu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/processor"
app:subtitle="@string/defaulttext" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewFilledStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
app:cardBackgroundColor="?attr/colorCard">
<LinearLayout

View file

@ -556,6 +556,8 @@
<string name="connect">Kết nối</string>
<string name="shutting_down">Đang tắt…</string>
<string name="cannot_save_here_please_choose_another_location">Không thể lưu ở đây, hãy chọn một nơi khác.</string>
<string name="processor">Bộ xử lý</string>
<string name="board">Bo mạch chủ</string>
<!--======================TERMUX STRINGS====================-->
<string name="application_name" translatable="false">Vterm</string>
@ -711,4 +713,11 @@
<string name="settings_tag_keyboard">Bàn phím</string>
<string name="settings_tag_other">Khác</string>
<string name="executing_command_please_wait">Đang thực thi, vui lòng đợi…</string>
<!-- CPUs -->
<string name="g4_cpu_turbo">G4 (Tăng tốc)</string>
<string name="g4_cpu_basic">G4 (Cơ bản)</string>
<string name="g2_cpu_workstation">G2 (Máy trạm)</string>
<string name="g2_cpu_low_power">G2 (Tiết kiệm điện)</string>
</resources>

View file

@ -567,6 +567,8 @@
<string name="connect">Connect</string>
<string name="shutting_down">Shutting down…</string>
<string name="cannot_save_here_please_choose_another_location">Cannot save here, please choose another location.</string>
<string name="processor">Processor</string>
<string name="board">Board</string>
<!--======================TERMUX STRINGS====================-->
@ -723,6 +725,76 @@
<string name="settings_tag_keyboard">Keyboard</string>
<string name="settings_tag_other">Other</string>
<string name="executing_command_please_wait">Executing command, please wait…</string>
<!-- CPUs -->
<string name="max_cpu" translatable="false">Max</string>
<string name="host_cpu" translatable="false">Host</string>
<string name="qemu64" translatable="false">QEMU64</string>
<string name="qemu32" translatable="false">QEMU32</string>
<string name="base_cpu" translatable="false">Base</string>
<string name="kvm64" translatable="false">KVM64</string>
<string name="kvm32" translatable="false">KVM32</string>
<string name="intel_snow_ridge" translatable="false">Intel Snow Ridge</string>
<string name="intel_cooper_lake" translatable="false">Intel Cooper Lake</string>
<string name="intel_cascade_lake_server" translatable="false">Intel Cascade Lake Server</string>
<string name="intel_knights_mill" translatable="false">Intel Knights Mill</string>
<string name="intel_denverton" translatable="false">Intel Denverton</string>
<string name="intel_skylake_server" translatable="false">Intel Skylake Server</string>
<string name="intel_skylake_client" translatable="false">Intel Skylake Client</string>
<string name="intel_broadwell" translatable="false">Intel Broadwell</string>
<string name="intel_haswell" translatable="false">Intel Haswell</string>
<string name="intel_ivy_bridge" translatable="false">Intel Ivy Bridge</string>
<string name="intel_sandy_bridge" translatable="false">Intel Sandy Bridge</string>
<string name="intel_westmere" translatable="false">Intel Westmere</string>
<string name="intel_nehalem" translatable="false">Intel Nehalem</string>
<string name="intel_altom_n270" translatable="false">Intel Altom N270</string>
<string name="intel_penryn" translatable="false">Intel Penryn</string>
<string name="intel_core_2_duo" translatable="false">Intel Core 2 Duo</string>
<string name="intel_core_duo" translatable="false">Intel Core Duo</string>
<string name="intel_conroe" translatable="false">Intel Conroe</string>
<string name="intel_pentium_iii" translatable="false">Intel Pentium III</string>
<string name="intel_pentium_ii" translatable="false">Intel Pentium II</string>
<string name="intel_pentium" translatable="false">Intel Pentium</string>
<string name="intel_486" translatable="false">Intel 486</string>
<string name="amd_epyc_milan" translatable="false">AMD EPYC Milan</string>
<string name="amd_epyc_rome" translatable="false">AMD EPYC Rome</string>
<string name="amd_epyc" translatable="false">AMD EPYC</string>
<string name="amd_opteron_g5" translatable="false">AMD Opteron G5</string>
<string name="amd_opteron_g4" translatable="false">AMD Opteron G4</string>
<string name="amd_phenom" translatable="false">AMD Phenom</string>
<string name="amd_opteron_g3" translatable="false">AMD Opteron G3</string>
<string name="amd_opteron_g2" translatable="false">AMD Opteron G2</string>
<string name="amd_opteron_g1" translatable="false">AMD Opteron G1</string>
<string name="amd_athlon" translatable="false">AMD Athlon</string>
<string name="hygon_dhyana" translatable="false">Hygon Dhyana</string>
<string name="cortex_a76" translatable="false">Cortex A76</string>
<string name="cortex_a72" translatable="false">Cortex A72</string>
<string name="cortex_a57" translatable="false">Cortex A57</string>
<string name="cortex_a55" translatable="false">Cortex A55</string>
<string name="cortex_a53" translatable="false">Cortex A53</string>
<string name="cortex_a35" translatable="false">Cortex A35</string>
<string name="cortex_a15" translatable="false">Cortex A15</string>
<string name="cortex_a9" translatable="false">Cortex A9</string>
<string name="cortex_a8" translatable="false">Cortex A8</string>
<string name="cortex_a7" translatable="false">Cortex A7</string>
<string name="cortex_m55" translatable="false">Cortex M55</string>
<string name="cortex_m33" translatable="false">Cortex M33</string>
<string name="cortex_m7" translatable="false">Cortex M7</string>
<string name="cortex_m4" translatable="false">Cortex M4</string>
<string name="cortex_m3" translatable="false">Cortex M3</string>
<string name="cortex_m0" translatable="false">Cortex M0</string>
<string name="cortex_r52" translatable="false">Cortex R52</string>
<string name="cortex_r5f" translatable="false">Cortex R5F</string>
<string name="cortex_r5" translatable="false">Cortex R5</string>
<string name="cpu_460ex" translatable="false">460EX</string>
<string name="e500v2_cpu" translatable="false">e500</string>
<string name="g4_cpu_turbo">G4 (Turbo)</string>
<string name="g4_cpu_basic">G4 (Basic)</string>
<string name="g3_cpu" translatable="false">G3</string>
<string name="g2_cpu_workstation">G2 (Workstation)</string>
<string name="g2_cpu_low_power">G2 (Low-Power)</string>
<!-- Feature: User Profile -->
<!-- Feature: Settings -->

View file

@ -6,10 +6,10 @@
"Message": "<h2>4.0.0</h2>\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": "<h2>4.0.7</h2>Bugs fixed.",
"MessageBeta": "<h2>4.0.8</h2>Bugs fixed.",
"cancellableBeta": true
}