diff --git a/assets/patch.tar.gz b/assets/patch.tar.gz index 22e54d0..7ad014f 100644 Binary files a/assets/patch.tar.gz and b/assets/patch.tar.gz differ diff --git a/extra/cross/install-box b/extra/cross/install-box index cb9eda1..422cc98 100644 --- a/extra/cross/install-box +++ b/extra/cross/install-box @@ -12,26 +12,46 @@ rm -rf $HOME/.local/share/tiny/tmp mkdir $HOME/.local/share/tiny/tmp cd $HOME/.local/share/tiny/tmp -git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box86 -if [ $? -ne 0 ]; then - git clone https://github.com/ptitSeb/box86 - if [ $? -ne 0 ]; then - rm -rf $HOME/.local/share/tiny/tmp - echo '仓库克隆失败...退出安装...' - exit - fi -fi +box86_url="https://github.com/ptitSeb/box86" +box64_url="https://github.com/ptitSeb/box64" -git clone https://mirror.ghproxy.com/https://github.com/ptitSeb/box64 -if [ $? -ne 0 ]; then - git clone https://github.com/ptitSeb/box64 - if [ $? -ne 0 ]; then - rm -rf $HOME/.local/share/tiny/tmp - echo '仓库克隆失败...退出安装...' - exit - fi -fi +mirror_sites=( + "https://github.moeyy.xyz/" + "https://mirror.ghproxy.com/" + "" +) +for mirror in "${mirror_sites[@]}"; do + local url="${mirror}${box86_url}" + echo "尝试从 $url 下载box86..." + git clone "${url}" + if [ $? -eq 0 ]; then + echo "成功下载box86" + break + fi + if [ -z "$mirror" ]; then + rm -rf $HOME/.local/share/tiny/tmp + echo '仓库克隆失败...退出安装...' + exit + fi +done + +for mirror in "${mirror_sites[@]}"; do + local url="${mirror}${box64_url}" + echo "尝试从 $url 下载box64..." + git clone "${url}" + if [ $? -eq 0 ]; then + echo "成功下载box64" + break + fi + if [ -z "$mirror" ]; then + rm -rf $HOME/.local/share/tiny/tmp + echo '仓库克隆失败...退出安装...' + exit + fi +done + +echo "正在编译box86..." cd box86 mkdir build cd build @@ -41,6 +61,7 @@ cd ../.. mv box86/build/box86 ../cross mv box86/x86lib ../cross +echo "正在编译box64..." cd box64 mkdir build cd build diff --git a/extra/cross/install-dxvk b/extra/cross/install-dxvk index f34c874..dc96f6f 100644 --- a/extra/cross/install-dxvk +++ b/extra/cross/install-dxvk @@ -4,25 +4,35 @@ rm -rf $HOME/.local/share/tiny/tmp mkdir $HOME/.local/share/tiny/tmp cd $HOME/.local/share/tiny/tmp -MIRROR_SITE=https://mirror.ghproxy.com RELEASE_PAGE=https://github.com/doitsujin/dxvk/releases LATEST_DXVK_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Version \K[^"]*' | cut -d "<" -f 1 | head -n 1) if [ -z "$LATEST_DXVK_TAG" ] then - LATEST_DXVK_TAG="2.3" + LATEST_DXVK_TAG="2.4" fi LATEST_DXVK_NAME="dxvk-$LATEST_DXVK_TAG.tar.gz" LATEST_DXVK_LINK="https://github.com/doitsujin/dxvk/releases/download/v$LATEST_DXVK_TAG/$LATEST_DXVK_NAME" -wget $MIRROR_SITE/$LATEST_DXVK_LINK -if [ $? -ne 0 ]; then - wget $LATEST_DXVK_LINK - if [ $? -ne 0 ]; then - rm -rf $HOME/.local/share/tiny/tmp - echo '下载失败...退出安装...' - exit - fi -fi +mirror_sites=( + "https://github.moeyy.xyz/" + "https://mirror.ghproxy.com/" + "" +) + +for mirror in "${mirror_sites[@]}"; do + local url="${mirror}$LATEST_DXVK_LINK" + echo "尝试从 $url 下载dxvk..." + wget "${url}" + if [ $? -eq 0 ]; then + echo "成功下载dxvk" + break + fi + if [ -z "$mirror" ]; then + rm -rf $HOME/.local/share/tiny/tmp + echo '下载失败...退出安装...' + exit + fi +done wineboot tar xvf $LATEST_DXVK_NAME diff --git a/extra/cross/install-wine b/extra/cross/install-wine index d7388cb..74d2749 100644 --- a/extra/cross/install-wine +++ b/extra/cross/install-wine @@ -32,7 +32,6 @@ rm -rf $HOME/.local/share/tiny/tmp mkdir $HOME/.local/share/tiny/tmp cd $HOME/.local/share/tiny/tmp -MIRROR_SITE=https://mirror.ghproxy.com RELEASE_PAGE=https://github.com/Kron4ek/Wine-Builds/releases #LATEST_WINE_TAG=proton-$(curl -L $RELEASE_PAGE | grep -oP 'Proton \K[^"]*' | cut -d "<" -f 1 | head -n 1) #proton LATEST_WINE_TAG=$(curl -L $RELEASE_PAGE | grep -oP 'Wine \K[^"]*' | cut -d "<" -f 1 | head -n 1) #vanilla @@ -43,15 +42,26 @@ fi LATEST_WINE_NAME=wine-$LATEST_WINE_TAG-amd64.tar.xz LATEST_WINE_LINK=$RELEASE_PAGE/download/$LATEST_WINE_TAG/$LATEST_WINE_NAME -wget $MIRROR_SITE/$LATEST_WINE_LINK -if [ $? -ne 0 ]; then - wget $LATEST_WINE_LINK - if [ $? -ne 0 ]; then - rm -rf $HOME/.local/share/tiny/tmp - echo '下载失败...退出安装...' - exit - fi -fi +mirror_sites=( + "https://github.moeyy.xyz/" + "https://mirror.ghproxy.com/" + "" +) + +for mirror in "${mirror_sites[@]}"; do + local url="${mirror}$LATEST_WINE_LINK" + echo "尝试从 $url 下载wine..." + wget "${url}" + if [ $? -eq 0 ]; then + echo "成功下载wine" + break + fi + if [ -z "$mirror" ]; then + rm -rf $HOME/.local/share/tiny/tmp + echo '下载失败...退出安装...' + exit + fi +done tar xvf $LATEST_WINE_NAME mv wine-$LATEST_WINE_TAG-amd64 ../cross/wine diff --git a/lib/main.dart b/lib/main.dart index dea410d..be04e4b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -459,14 +459,11 @@ sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)"""); ExpansionPanel( isExpanded: _expandState[5], headerBuilder: ((context, isExpanded) { - return const ListTile(title: Text("virgl加速"), subtitle: Text("实验性功能")); + return const ListTile(title: Text("图形加速"), subtitle: Text("实验性功能")); }), body: Padding(padding: const EdgeInsets.all(12), child: Column(children: [ - const Text("""virgl加速可部分利用设备GPU提升系统图形处理表现,但由于设备差异也可能导致容器系统及软件运行不稳定甚至异常退出。 + const Text("""图形加速可部分利用设备GPU提升系统图形处理表现,但由于设备差异也可能导致容器系统及软件运行不稳定甚至异常退出。 -请先开启测试按钮启动virgl服务器,如果按钮没有自动关闭说明至少启动没问题; - -不过运行情况依然无法保证。 -"""), +Virgl可为使用OpenGL ES的应用提供加速。"""), const SizedBox.square(dimension: 16), TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglCommand") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl服务器参数"), onChanged: (value) async { @@ -474,37 +471,34 @@ sed -i -E "s@^(VNC_RESOLUTION)=.*@\\1=${w}x${h}@" \$(command -v startvnc)"""); }, ), const SizedBox.square(dimension: 8), - SwitchListTile(title: const Text("测试"), subtitle: const Text("启动virgl_test_server"), value: G.isVirglServerStarted, onChanged:(value) { - switch (value) { - case true: { - G.virglServerPty = Pty.start("/system/bin/sh"); - G.virglServerPty.write(const Utf8Encoder().convert("export CONTAINER_DIR=${G.dataPath}/containers/${G.currentContainer}\n${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}\nexit\n")); - G.virglServerPty.exitCode.then((value) { - G.isVirglServerStarted = false; - setState(() {}); - }); - } - break; - case false: { - G.virglServerPty.write(const Utf8Encoder().convert("\x03exit\n")); - } - break; - } - G.isVirglServerStarted = value; - setState(() {}); - },), - const SizedBox.square(dimension: 16), - TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "图形环境变量"), + TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultVirglOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "virgl环境变量"), onChanged: (value) async { await G.prefs.setString("defaultVirglOpt", value); }, ), const SizedBox.square(dimension: 8), - SwitchListTile(title: const Text("启用virgl加速"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("virgl") as bool, onChanged:(value) { + SwitchListTile(title: const Text("启用Virgl加速"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("virgl") as bool, onChanged:(value) { G.prefs.setBool("virgl", value); setState(() {}); },), const SizedBox.square(dimension: 16), + const Divider(height: 2, indent: 8, endIndent: 8), + const SizedBox.square(dimension: 16), + const Text("""搭载Adreno GPU的设备通常可以使用Turnip驱动加速使用Vulkan的软件。 + +(也就是搭载不太新也不太旧的骁龙处理器的设备)"""), + const SizedBox.square(dimension: 8), + TextFormField(maxLines: null, initialValue: Util.getGlobal("defaultTurnipOpt") as String, decoration: const InputDecoration(border: OutlineInputBorder(), labelText: "Turnip环境变量"), + onChanged: (value) async { + await G.prefs.setString("defaultTurnipOpt", value); + }, + ), + const SizedBox.square(dimension: 8), + SwitchListTile(title: const Text("启用Turnip驱动"), subtitle: const Text("下次启动时生效"), value: Util.getGlobal("turnip") as bool, onChanged:(value) async { + G.prefs.setBool("turnip", value); + setState(() {}); + },), + const SizedBox.square(dimension: 16), ],))), ExpansionPanel( isExpanded: _expandState[6], diff --git a/lib/workflow.dart b/lib/workflow.dart index cb75f31..a3cb355 100644 --- a/lib/workflow.dart +++ b/lib/workflow.dart @@ -116,12 +116,14 @@ class Util { case "isBoxEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false); case "isWineEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false); case "virgl" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false); + case "turnip" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false); case "wakelock" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false); case "isHidpiEnabled" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(false); case "useAvnc" : return b ? G.prefs.getBool(key)! : (value){G.prefs.setBool(key, value); return value;}(true); case "defaultFFmpegCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("-hide_banner -an -max_delay 1000000 -r 30 -f android_camera -camera_index 0 -i 0:0 -vf scale=iw/2:-1 -rtsp_transport udp -f rtsp rtsp://127.0.0.1:8554/stream"); case "defaultVirglCommand" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("--socket-path=\$CONTAINER_DIR/tmp/.virgl_test"); case "defaultVirglOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GALLIUM_DRIVER=virpipe"); + case "defaultTurnipOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("VK_ICD_FILENAMES=/home/tiny/.local/share/tiny/extra/freedreno_icd.aarch64.json TU_DEBUG=noconform MESA_VK_WSI_DEBUG=sw"); case "defaultHidpiOpt" : return b ? G.prefs.getString(key)! : (value){G.prefs.setString(key, value); return value;}("GDK_SCALE=2 QT_FONT_DPI=192"); case "containersInfo" : return G.prefs.getStringList(key)!; } @@ -398,6 +400,7 @@ VSCode、输入法 请几个小时后再试一次"""}, {"q":"找不到sys/cdefs.h", "a":"""点击上面无法编译C语言程序的快捷指令"""}, + {"q":"安装box86/box64/wine很慢", "a":"""请尝试使用魔法"""}, ]; //默认快捷指令 @@ -510,8 +513,6 @@ class G { //static int? streamingPid; static String streamingOutput = ""; static late Pty streamServerPty; - static bool isVirglServerStarted = false; - static late Pty virglServerPty; //static int? virglPid; static ValueNotifier pageIndex = ValueNotifier(0); //主界面索引 static ValueNotifier terminalPageChange = ValueNotifier(true); //更改值,用于刷新小键盘 @@ -772,6 +773,9 @@ export CONTAINER_DIR=\$DATA_DIR/containers/${G.currentContainer} ${G.dataPath}/bin/virgl_test_server ${Util.getGlobal("defaultVirglCommand")}"""); extraOpt += "${Util.getGlobal("defaultVirglOpt")} "; } + if (Util.getGlobal("turnip")) { + extraOpt += "${Util.getGlobal("defaultTurnipOpt")} "; + } if (Util.getGlobal("isBoxEnabled")) { G.wasBoxEnabled = true; extraMount += "--x86=/home/tiny/.local/bin/box86 --x64=/home/tiny/.local/bin/box64 ";