diff --git a/com.gitee.uengine.runner.spark.deb b/com.gitee.uengine.runner.spark.deb
index d4b293b..00d724a 100755
Binary files a/com.gitee.uengine.runner.spark.deb and b/com.gitee.uengine.runner.spark.deb differ
diff --git a/information.json b/information.json
index 60f83a6..dbdb436 100755
--- a/information.json
+++ b/information.json
@@ -4,7 +4,7 @@
         "https://gitee.com/gfdgd-xi/uengine-runner",
 		"https://github.com/gfdgd-xi/uengine-runner"
     ],
-    "Version": "1.6.2 Alpha",
+    "Version": "1.6.2",
     "System": "Linux(deepin/UOS)",
     "Tips": [
         "更多可见:https://gitee.com/gfdgd-xi/uengine-runner/wikis",
@@ -26,6 +26,7 @@
         "※1、优化了 UEngine 运行器的英语翻译",
         "※2、新增加了可以打开或关闭第三方应用安装的功能(使用此功能后在UEngine里可以使用默认的APK安装程序安装应用,此操作需要使用程序的Adb补丁)",
         "※3、新增加了 UEngine 的 Ubuntu 安装程序",
+        "※4、双包合一,只保留了UOS打包标准,可以从旧标准无缝升级",
         "4、修复了本程序在 Ubuntu 上安装和卸载报错无法继续的问题",
         "V1.6.1:",
         "※1、修复了打包 deb 包在 APK 的包名有大写时无法启动的问题",
diff --git a/main.py b/main.py
index caecd86..e39e58c 100755
--- a/main.py
+++ b/main.py
@@ -2,8 +2,8 @@
 # 使用系统默认的 python3 运行
 ###########################################################################################
 # 作者:gfdgd xi<3025613752@qq.com>
-# 版本:1.6.2 Alpha
-# 更新时间:2022年6月19日(要期末考试了)
+# 版本:1.6.2
+# 更新时间:2022年6月20日(要期末考试了)
 # 感谢:anbox、deepin 和 UOS
 # 基于 Python3 的 tkinter 构建
 # 更新:gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com>、为什么您不喜欢熊出没和阿布呢
@@ -18,7 +18,6 @@ import time
 import json
 import shutil
 import zipfile
-import ctypes
 import traceback
 import threading
 import easygui
@@ -1244,12 +1243,14 @@ def showhelp():
         screen_width = helpwindow.winfo_screenwidth()
         screen_height = helpwindow.winfo_screenheight()
         # calculate position x and y coordinates  假设主窗口大小固定 570x236像素 ,设置窗口位置为屏幕中心。
+
+
         winwith=550
         winhigh=700
         x = (screen_width/2) - (winwith/2)
         y = (screen_height/2) - (winhigh/2)
-        
-        helpwindow.geometry("550x700"+"+{:.0f}+{:.0f}".format(x, y))
+        if not helpwindow.winfo_screenheight() > 1080:
+            helpwindow.geometry(f"{winwith}x{winhigh}"+"+{:.0f}+{:.0f}".format(x, y))
 
         style = ttkthemes.ThemedStyle(helpwindow)
         style.set_theme("breeze")
diff --git a/new-deb-build/DEBIAN/control b/new-deb-build/DEBIAN/control
index e49c22d..ef532cd 100644
--- a/new-deb-build/DEBIAN/control
+++ b/new-deb-build/DEBIAN/control
@@ -2,12 +2,11 @@ Package: com.gitee.uengine.runner.spark
 Replaces: spark-uengine-runner
 Breaks: spark-uengine-runner
 Source: com.gitee.uengine.runner.spark
-Version: 1.6.2Alpha1
+Version: 1.6.2
 Architecture: all
-Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com>, 柚子<https://gitee.com/Limexb>, 为什么您不喜欢熊出没和阿布呢<https://weibo.com/u/7755040136>, 星空露光<https://gitee.com/Cynorkyle>, shenmo
-Depends: deepin-elf-verify (>= 0.0.16.7-1), python3, python3-tk, python3-pip, aapt, uengine, python3-setuptools, deepin-terminal, curl, python3-pil, python3-pil.imagetk, python3-requests, adb, translate-shell, python3-xlib, fonts-noto-cjk, python3-numpy, python3-matplotlib, wget, inotify-tools, aria2
-Section: utils
+Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com>, 柚子<https://gitee.com/Limexb>, 为什么您不喜欢熊出没和阿布呢<https://weibo.com/u/7755040136>, 星空露光<https://gitee.com/Cynorkyle>, shenmo<jifengshenmo@outlook.com>
+Depends: deepin-elf-verify (>= 0.0.16.7-1), python3, python3-tk, python3-pip, aapt, python3-setuptools, deepin-terminal, curl, python3-pil, python3-pil.imagetk, python3-requests, adb, translate-shell, python3-xlib, fonts-noto-cjk, python3-numpy, python3-matplotlib, wget, inotify-tools, aria2, uengine
 Priority: optional
-Conflicts: spark-uengine-runner, spark-uengine-apk-builder
+Conflicts: spark-uengine-apk-builder
 Homepage: [https://gitee.com/gfdgd-xi/uengine-runner, https://github.com/gfdgd-xi/uengine-runner]
 Description: UEngine Runner for deepin and UOS
diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/main.py b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/main.py
deleted file mode 100755
index f942a04..0000000
--- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/main.py
+++ /dev/null
@@ -1,1539 +0,0 @@
-#!/usr/bin/env python3
-# 使用系统默认的 python3 运行
-###########################################################################################
-# 作者:gfdgd xi<3025613752@qq.com>
-# 版本:1.6.2 Alpha
-# 更新时间:2022年6月19日(要期末考试了)
-# 感谢:anbox、deepin 和 UOS
-# 基于 Python3 的 tkinter 构建
-# 更新:gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com>、为什么您不喜欢熊出没和阿布呢
-###########################################################################################
-#################
-# 引入所需的库
-#################
-import os
-import api
-import sys
-import time
-import json
-import shutil
-import zipfile
-import traceback
-import threading
-import easygui
-import ttkthemes
-import webbrowser
-import subprocess
-import matplotlib
-import requests
-import numpy
-import matplotlib.figure
-import matplotlib.pylab
-import matplotlib.font_manager
-import PIL.Image as Image
-import PIL.ImageTk as ImageTk
-import tkinter as tk
-import tkinter.ttk as ttk
-import tkinter.messagebox as messagebox
-import tkinter.filedialog as filedialog
-import tkinter.simpledialog as simpledialog
-from getxmlimg import getsavexml
-
-win = tk.Tk()  # 创建窗口
-
-# 卸载程序
-def UninstallProgram(package: "apk 包名")->"卸载程序":
-    try:
-        global fineUninstallApkHistory 
-        Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package))
-        print(Return)
-        if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), package)):
-            os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), package))
-        if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)):
-            os.remove("{}/{}.desktop".format(get_desktop_path(), package))
-        findApkHistory.append(ComboInstallPath.get())
-        ComboInstallPath['value'] = findApkHistory
-        write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", str(json.dumps(ListToDictionary(findApkHistory))))  # 将历史记录的数组转换为字典并写入
-        messagebox.showinfo(message="操作执行完毕!", title="提示")
-        DisabledAndEnbled(False)
-        return Return
-    except:
-        traceback.print_exc()
-        messagebox.showerror(title="错误", message=traceback.format_exc())
-        DisabledAndEnbled(False)
-
-# 卸载按钮事件
-def ButtonClick8():
-    if ComboInstallPath.get() is "":
-        messagebox.showerror(title="提示", message=langFile[lang]["Main"]["MainWindow"]["Error"]["UninstallError"])
-
-        return
-    DisabledAndEnbled(True)
-    if os.path.exists(ComboInstallPath.get()):
-        path = GetApkPackageName(ComboInstallPath.get())
-    else:
-        path = ComboInstallPath.get()
-    print(path)
-    threading.Thread(target=UninstallProgram, args=[path]).start()
-
-# 浏览窗口
-temppath=""
-def FindApk()->"浏览窗口":
-    path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"])
-    global temppath    
-    temppath = path
-    print("apk path is find:" + path)
-    if path != "" and path != "()":
-        try:
-            ComboInstallPath.set(path)
-            write_txt(get_home() + "/.config/uengine-runner/FindApk.json", json.dumps({"path": os.path.dirname(path)}))  # 写入配置文件
-        except:
-            pass
-
-# 安装按钮事件
-def Button3Install():
-    if ComboInstallPath.get() is "" or not os.path.exists(ComboInstallPath.get()):
-        messagebox.showerror(title="提示", message=langFile[lang]["Main"]["MainWindow"]["Error"]["InstallError"])
-        return
-    DisabledAndEnbled(True)
-    threading.Thread(target=InstallApk, args=(ComboInstallPath.get(),)).start()
-
-# 安装应用
-def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
-    try:
-        if not os.path.exists("/tmp/uengine-runner"):
-            os.makedirs("/tmp/uengine-runner")
-        if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
-            print("Mkdir")
-            os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
-        # 读取设置
-        setting = json.loads(readtxt(get_home() + "/.config/uengine-runner/setting.json"))
-        # 安装应用
-        print("start install apk")
-        global findApkHistory
-        print("start install apk12")
-        iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path))
-        tempstr1 = iconSavePath
-        print("start install apk1")
-        iconSaveDir = os.path.dirname(iconSavePath)
-        if not os.path.exists(iconSaveDir):
-            os.makedirs(iconSaveDir,exist_ok=True)
-        SaveApkIcon(path, iconSavePath)
-        try:
-            if setting["SaveApk"]:
-                shutil.copy(path, "/tmp/uengine-runner/bak.apk")
-        except:
-            if not messagebox.askyesno(title="错误", message="无法备份安装包,是否不备份安装包继续安装?\n提示:新版UEngine安装后会自动删除安装包"):
-                DisabledAndEnbled(False)
-                return
-            setting["SaveApk"] = False
-        print("start install apk2")
-        BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
-                            "{}/{}.desktop".format(get_desktop_path(), GetApkPackageName(path)))
-        print("start install apk3")
-        BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
-                            "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)))
-        commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path))
-        print(commandReturn)
-        try:
-            if setting["SaveApk"]:
-                shutil.copy("/tmp/uengine-runner/bak.apk", path)
-        except:
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["BackApkError"])
-        print("\nprint install complete")
-        if quit:
-            print(commandReturn)
-            return
-        messagebox.showinfo(title="提示", message="操作完成!")
-        findApkHistory.append(ComboInstallPath.get())
-        ComboInstallPath['value'] = findApkHistory
-        write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", str(json.dumps(ListToDictionary(findApkHistory))))  # 将历史记录的数组转换为字典并写入
-    except:
-        traceback.print_exc()
-        messagebox.showerror(title="错误", message=traceback.format_exc())
-    DisabledAndEnbled(False)
-
-# 禁用或启动所有控件
-def DisabledAndEnbled(choose: "启动或者禁用")->"禁用或启动所有控件":
-    userChoose = {True: tk.DISABLED, False: tk.NORMAL}
-    a = userChoose[choose]
-    ComboInstallPath.configure(state=a)
-    #ComboUninstallPath.configure(state=a)
-    BtnFindApk.configure(state=a)
-    BtnInstall.configure(state=a)
-    BtnShowUengineApp.configure(state=a)
-    #BtnUninstallApkBrowser.configure(state=a)
-    BtnUninstall.configure(state=a)
-    Btngeticon.configure(state=a)
-    BtnSaveApk.configure(state=a)
-    BtnApkInformation.configure(state=a)
-    LabApkPath.configure(state=a)
-
-# 需引入 subprocess
-# 运行系统命令并获取返回值
-def GetCommandReturn(cmd: "命令")->"运行系统命令并获取返回值":
-    # cmd 是要获取输出的命令
-    return subprocess.getoutput(cmd)
-
-def GetSystemVersion():
-    systemInformation = readtxt("/etc/os-release")
-    for systemInformation in systemInformation.split('\n'):
-        if "PRETTY_NAME=" in systemInformation:
-            return systemInformation.replace("PRETTY_NAME=", "").replace('"', '')
-
-# 打开所有窗口事件
-def Button5Click():
-    threading.Thread(target=OpenUengineProgramList).start()
-
-# 打开“uengine 所有程序列表”
-def OpenUengineProgramList()->"打开“uengine 所有程序列表”":
-    os.system("uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity")
-
-# 显示“提示”窗口
-def helps()->"显示“提示”窗口":
-    global tips
-    messagebox.showinfo(title="提示", message=tips)
-
-# 显示更新内容窗口
-def UpdateThings()->"显示更新内容窗口":
-    messagebox.showinfo(title="更新内容", message=updateThings)
-
-# 打开程序官网
-def OpenProgramURL()->"打开程序官网":
-    webbrowser.open_new_tab(programUrl)
-
-# 重启本应用程序
-def ReStartProgram()->"重启本应用程序":
-    python = sys.executable
-    os.execl(python, python, * sys.argv)
-
-# 清理历史记录
-def CleanProgramHistory()->"清理历史记录":
-    try:
-        if messagebox.askokcancel(title="警告", message="删除后将无法恢复,你确定吗?\n删除后软件将会自动重启。"):
-            shutil.rmtree(get_home() + "/.config/uengine-runner")
-            ReStartProgram()
-    except:
-        traceback.print_exc()
-        messagebox.showerror(title="错误", message=traceback.format_exc())
-
-# 获取用户主目录
-def get_home()->"获取用户主目录":
-    return os.path.expanduser('~')
-
-# 获取当前语言
-def get_now_lang()->"获取当前语言":
-    return os.getenv('LANG')
-
-# 发送“启动 uengine 所有程序”的 .desktop 文件到桌面
-def SendUengineAndroidListForDesktop()->"发送“启动 uengine 所有程序”的 .desktop 文件到桌面":
-    global desktop
-    global desktopName
-    DisabledAndEnbled(True)
-    try:
-        if os.path.exists("{}/{}".format(get_desktop_path(), desktopName)):
-            if not messagebox.askokcancel(title="提示", message="桌面已经存在快捷方式,你确定要覆盖吗?"):
-                DisabledAndEnbled(False)
-                return
-        shutil.copy(desktop, get_desktop_path())
-        messagebox.showinfo(title="提示", message="发送成功!")
-    except:
-        traceback.print_exc()
-        messagebox.showerror(title="错误", message=traceback.format_exc())
-    DisabledAndEnbled(False)
-
-# 获取用户桌面目录
-def get_desktop_path()->"获取用户桌面目录":
-    for line in open(get_home() + "/.config/user-dirs.dirs"):  # 以行来读取配置文件
-        desktop_index = line.find("XDG_DESKTOP_DIR=\"")  # 寻找是否有对应项,有返回 0,没有返回 -1
-        if desktop_index != -1:  # 如果有对应项
-            break  # 结束循环
-    if desktop_index == -1:  # 如果是提前结束,值一定≠-1,如果是没有提前结束,值一定=-1
-        return -1
-    else:
-        get = line[17:-2]  # 截取桌面目录路径
-        get_index = get.find("$HOME")  # 寻找是否有对应的项,需要替换内容
-        if get != -1:  # 如果有
-            get = get.replace("$HOME", get_home())  # 则把其替换为用户目录(~)
-        return get  # 返回目录
-
-# 发送“启动 uengine 所有程序”的 .desktop 文件到启动器
-def SendUengineAndroidListForLauncher()->"发送“启动 uengine 所有程序”的 .desktop 文件到启动器":
-    DisabledAndEnbled(True)
-    try:
-        if os.path.exists("{}/.local/share/applications/{}".format(get_home(), desktopName)):
-            if not messagebox.askokcancel(title="提示", message="启动器已经存在快捷方式,你确定要覆盖吗?"):
-                DisabledAndEnbled(False)
-                return
-        if not os.path.exists("{}/.local/share/applications/".format(get_home())):
-            os.makedirs("{}/.local/share/applications/".format(get_home()))
-        shutil.copy(desktop, "{}/.local/share/applications/{}".format(get_home(), desktopName))
-        os.system("chmod 755 {}/.local/share/applications/{}".format(get_home(), desktopName))
-        messagebox.showinfo(title="提示", message="发送成功!")
-    except:
-        traceback.print_exc()
-        messagebox.showerror(title="错误", message=traceback.format_exc())
-    DisabledAndEnbled(False)
-
-# 数组转字典
-def ListToDictionary(list: "需要转换的数组")->"数组转字典":
-    dictionary = {}
-    for i in range(len(list)):
-        dictionary[i] = list[i]
-    return dictionary
-
-# 读取文本文档
-def readtxt(path: "路径")->"读取文本文档":
-    f = open(path, "r")  # 设置文件对象
-    str = f.read()  # 获取内容
-    f.close()  # 关闭文本对象
-    return str  # 返回结果
-
-# 写入文本文档
-def write_txt(path: "路径", things: "内容")->"写入文本文档":
-    TxtDir = os.path.dirname(path)
-    print(TxtDir)
-    if not os.path.exists(TxtDir):
-        os.makedirs(TxtDir,exist_ok=True)    
-    file = open(path, 'w', encoding='UTF-8')  # 设置文件对象
-    file.write(things)  # 写入文本
-    file.close()  # 关闭文本对象
-
-# 获取 aapt 的所有信息
-def GetApkInformation(apkFilePath: "apk 所在路径")->"获取 aapt 的所有信息":
-    return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
-
-# 获取 apk Activity
-def GetApkActivityName(apkFilePath: "apk 所在路径")->"获取 apk Activity":
-    info = GetApkInformation(apkFilePath)
-    for line in info.split('\n'):
-        if "launchable-activity" in line:
-            line = line[0: line.index("label='")]
-            line = line.replace("launchable-activity: ", "")
-            line = line.replace("'", "")
-            line = line.replace(" ", "")
-            line = line.replace("name=", "")
-            line = line.replace("label=", "")
-            line = line.replace("icon=", "")
-            return line
-
-# 获取 apk 包名
-def GetApkPackageName(apkFilePath: "apk 所在路径")->"获取 apk 包名":
-    info = GetApkInformation(apkFilePath)
-    for line in info.split('\n'):
-        if "package:" in line:
-            line = line[0: line.index("versionCode='")]
-            line = line.replace("package:", "")
-            line = line.replace("name=", "")
-            line = line.replace("'", "")
-            line = line.replace(" ", "")
-            return line
-
-def InstallRootUengineImage():
-    if not os.path.exists:
-        os.mkdir("/tmp/uengine-runner")
-    write_txt("/tmp/uengine-runner/install.sh", "sudo dpkg -i /tmp/uengine-runner/u*.deb\nsudo apt install -f")
-    threading.Thread(target=os.system, args=["deepin-terminal -C \"wget -P '/tmp/uengine-runner' 'https://hub.fastgit.xyz/gfdgd-xi/uengine-runner/releases/download/U1.2.15/uengine-android-image_1.2.15_amd64.deb' && pkexec bash '/tmp/uengine-runner/install.sh'\""]).start()
-
-def UengineUbuntuInstall():
-    threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/uengine-installer")]).start()
-
-def UbuntuInstallUengine():
-    threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/uengine-installer")]).start()
-
-def BuildRootUengineImage():
-    threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/root-uengine.sh")]).start()
-    
-def ReinstallUengineImage():
-    threading.Thread(target=os.system, args=["deepin-terminal -e ''pkexec apt reinstall uengine-android-image"]).start()
-
-# 生成 uengine 启动文件到桌面
-def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面":
-    if showName == "" or showName == None:
-        showName = "未知应用"
-    things = '''[Desktop Entry]
-Categories=app;
-Encoding=UTF-8
-Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={}
-GenericName={}
-Icon={}
-MimeType=
-Name={}
-StartupWMClass={}
-Terminal=false
-Type=Application
-'''.format(packageName, activityName, showName, iconPath, showName, showName)
-    write_txt(savePath, things)
-
-# 获取软件的中文名称
-def GetApkChineseLabel(apkFilePath)->"获取软件的中文名称":
-    info = GetApkInformation(apkFilePath)
-    for line in info.split('\n'):
-        if "application-label:" in line:
-            line = line.replace("application-label:", "")
-            line = line.replace("'", "")
-            return line
-
-# 保存apk图标
-def SaveApkIcon(apkFilePath, iconSavePath)->"保存 apk 文件的图标":
-    try:
-        if os.path.exists(iconSavePath):
-            os.remove(iconSavePath)
-        info = GetApkInformation(apkFilePath)
-        for line in info.split('\n'):
-            if "application:" in line:
-                xmlpath = line.split(":")[-1].split()[-1].split("=")[-1].replace("'","")  
-                if xmlpath.endswith('.xml'):
-                        xmlsave = getsavexml()
-                        print(xmlpath)
-                        xmlsave.savexml(apkFilePath,xmlpath,iconSavePath)
-                        return
-                else:
-                    zip = zipfile.ZipFile(apkFilePath)
-                    iconData = zip.read(xmlpath)
-                    with open(iconSavePath, 'w+b') as saveIconFile:
-                        saveIconFile.write(iconData)
-                        return
-        print("None Icon! Show defult icon")
-        shutil.copy(programPath + "/defult.png", iconSavePath)
-    except:
-        traceback.print_exc()
-        print("Error, show defult icon")
-        shutil.copy(programPath + "/defult.png", iconSavePath)
-
-def saveicon():
-    global temppath
-    global tempstr1
-    iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(temppath))
-    print(iconSavePath+"iconpaths")
-    SaveApkIcon(temppath, iconSavePath)
-
-def KeyboardToMouse():
-    threading.Thread(target=os.system, args=["pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY {}/uengine-keyboard".format(programPath)]).start()
-
-# 用户自行保存APK
-def SaveIconToOtherPath():
-    apkPath = ComboInstallPath.get()
-    if apkPath == "":
-        messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ChooseApkError"])
-        return
-    path = filedialog.asksaveasfilename(title="保存图标", filetypes=[("PNG 图片", "*.png"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/SaveApkIcon.json"))["path"])
-    if not path == "":
-        try:
-            SaveApkIcon(apkPath, path)
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["SaveApkIconError"])
-            return
-        write_txt(get_home() + "/.config/uengine-runner/SaveApkIcon.json", json.dumps({"path": os.path.dirname(path)}))  # 写入配置文件
-        findApkHistory.append(ComboInstallPath.get())
-        ComboInstallPath['value'] = findApkHistory
-        write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", str(json.dumps(ListToDictionary(findApkHistory))))  # 将历史记录的数组转换为字典并写入
-        messagebox.showinfo(title="提示", message="保存成功!")
-
-# 清空 uengine 数据
-def BackUengineClean()->"清空 uengine 数据":
-    print("Choose")
-    if messagebox.askokcancel(title="警告", message="清空后数据将会完全丢失,确定要继续吗?"):
-        DisabledAndEnbled(True)
-        try:
-            if os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
-                shutil.rmtree("{}/.local/share/applications/uengine/".format(get_home()))
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=traceback.format_exc())
-        InstallWindow.ShowWindows("pkexec rm -rfv /data/uengine")
-        return
-    print("Choose False")
-
-# 启用 uengine 网络桥接
-def UengineBridgeStart()->"启用 uengine 网络桥接":
-    DisabledAndEnbled(True)
-    os.system("pkexec uengine-bridge.sh start")
-    DisabledAndEnbled(False)
-
-# 关闭 uengine 网络桥接
-def UengineBridgeStop()->"关闭 uengine 网络桥接":
-    DisabledAndEnbled(True)
-    os.system("pkexec uengine-bridge.sh stop")
-    DisabledAndEnbled(False)
-
-# 重启 uengine 网络桥接
-def UengineBridgeRestart()->"重启 uengine 网络桥接":
-    DisabledAndEnbled(True)
-    os.system("pkexec uengine-bridge.sh restart")
-    DisabledAndEnbled(False)
-
-# 加载 uengine 网络桥接
-def UengineBridgeReload()->"加载 uengine 网络桥接":
-    DisabledAndEnbled(True)
-    os.system("pkexec uengine-bridge.sh reload")
-    DisabledAndEnbled(False)
-
-# 强制加载 uengine 网络桥接
-def UengineBridgeForceReload()->"强制加载 uengine 网络桥接":
-    DisabledAndEnbled(True)
-    os.system("pkexec uengine-bridge.sh force-reload")
-    DisabledAndEnbled(False)
-
-# 启用 uengine 服务
-def StartUengine()->"启用 uengine 服务":
-    DisabledAndEnbled(True)
-    os.system("systemctl enable uengine-container uengine-session && systemctl start uengine-container uengine-session")
-    DisabledAndEnbled(False)
-
-# 关闭 uengine 服务
-def StopUengine()->"关闭 uengine 服务":
-    DisabledAndEnbled(True)
-    os.system("systemctl disable uengine-container uengine-session")
-    DisabledAndEnbled(False)
-
-# 重启 uengine 服务
-def UengineRestart()->"重启 uengine 服务":
-    DisabledAndEnbled(True)
-    os.system("systemctl restart uengine*")
-    DisabledAndEnbled(False)
-
-def ScrcpyConnectUengine():
-    if os.path.exists("/snap/bin/scrcpy"):
-        threading.Thread(target=os.system, args=["/snap/bin/scrcpy -s '192.168.250.2:5555'"]).start()
-        return
-    if messagebox.askyesno(title="提示", message="你没有安装Scrcpy(指使用Snap安装),\n如果你使用了其他方法安装了Scrcpy,可以输入命令“scrcpy -s '192.168.250.2:5555'”,\n是否现在要使用Snap安装Scrcpy?"):
-        if not os.path.exists("/tmp/uengine-runner"):
-            os.makedirs("/tmp/uengine-runner")
-        write_txt("/tmp/uengine-runner/InstallScrcpy.sh", '''#!/bin/bash
-sudo apt install snapd -y
-sudo snap refresh
-sudo snap install scrcpy''')
-        threading.Thread(target=InstallWindow.ShowWindows, args=["chmod 777 /tmp/uengine-runner/InstallScrcpy.sh -Rv && pkexec /tmp/uengine-runner/InstallScrcpy.sh"]).start()
-        return
-
-# 获取用户桌面目录
-def get_desktop_path()->"获取用户桌面目录":
-    for line in open(get_home() + "/.config/user-dirs.dirs"):  # 以行来读取配置文件
-        desktop_index = line.find("XDG_DESKTOP_DIR=\"")  # 寻找是否有对应项,有返回 0,没有返回 -1
-        if desktop_index != -1:  # 如果有对应项
-            break  # 结束循环
-    if desktop_index == -1:  # 如果是提前结束,值一定≠-1,如果是没有提前结束,值一定=-1
-        return -1
-    else:
-        get = line[17:-2]  # 截取桌面目录路径
-        get_index = get.find("$HOME")  # 寻找是否有对应的项,需要替换内容
-        if get != -1:  # 如果有
-            get = get.replace("$HOME", get_home())  # 则把其替换为用户目录(~)
-        return get  # 返回目录
-
-# 提取已安装程序的apk
-def SaveInstallUengineApp():
-    while True:
-        result = simpledialog.askstring(title="输入apk包名", prompt="请输入要获取的apk包名以便进行下一步操作")
-        if result == "" or result == None:
-            return
-        if os.path.exists("/data/uengine/data/data/app/{}-1".format(result)):
-            break
-        messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["PathError"])
-    path = filedialog.asksaveasfilename(title="保存apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/SaveApk.json"))["path"])
-    if path == "" or path == ():
-        return
-    try:
-        shutil.copy("/data/uengine/data/data/app/{}-1/base.apk".format(result), path)
-        write_txt(get_home() + "/.config/uengine-runner/SaveApk.json", json.dumps({"path": os.path.dirname(path)}))
-        messagebox.showinfo(title="提示", message="提取完成!")
-    except:
-        traceback.print_exc()
-        messagebox.showerror(title="错误", message=traceback.format_exc())
-    
-def UengineCheckCpu():
-    english = GetCommandReturn("uengine check-features")
-    messagebox.showinfo(title="提示", message="{}".format(english))
-
-# 获取用户主目录
-def get_home()->"获取用户主目录":
-    return os.path.expanduser('~')
-
-# 删除所有的 uengine 应用快捷方式
-def CleanAllUengineDesktopLink():
-    if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"):
-        try:
-            shutil.rmtree("{}/.local/share/applications/uengine".format(get_home()))
-            os.makedirs("{}/.local/share/applications/uengine".format(get_home()))
-            messagebox.showinfo(title="提示", message="删除完毕!")
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=traceback.format_exc())
-
-# 打开 uengine 应用打包器
-def OpenUengineDebBuilder():
-    threading.Thread(target=os.system, args=[programPath + "/uengine-apk-builder"]).start()
-
-# 打开 uengine 根目录
-def OpenUengineRootData():
-    threading.Thread(target=os.system, args=["xdg-open /data/uengine/data/data"]).start()
-
-# 打开 uengine 用户数据目录
-def OpenUengineUserData():
-    threading.Thread(target=os.system, args=["xdg-open ~/安卓应用文件"]).start()
-
-# 终端显示 adb 命令行
-def AdbShellShowInTer():
-    os.system("adb connect 192.168.250.2:5555")
-    threading.Thread(target=os.system, args=["deepin-terminal -w ~ -e 'adb -s 192.168.250.2:5555 shell'"]).start()
-
-# 终端显示 adb top
-def AdbCPUAndRAWShowInTer():
-    os.system("adb connect 192.168.250.2:5555")
-    threading.Thread(target=os.system, args=["deepin-terminal -w ~ -e 'adb -s 192.168.250.2:5555 shell top'"]).start()
-
-def UengineSettingShow():
-    threading.Thread(target=os.system, args=["/usr/bin/uengine launch --action=android.intent.action.MAIN --package=com.android.settings --component=com.android.settings.Settings"]).start()
-
-# 杀死 adb 进程
-def AdbKillAdbProgress():
-    os.system("killall adb")
-    messagebox.showinfo(title="提示", message="完成!")
-
-# 关闭 adb 服务
-def AdbStopServer():
-    os.system("adb kill-server")
-    messagebox.showinfo(title="提示", message="完成!")
-
-# 开启 adb 服务
-def AdbStartServer():
-    os.system("adb start-server")
-    messagebox.showinfo(title="提示", message="完成!")
-
-def ReinstallUengine():
-    threading.Thread(target=os.system, args=["deepin-terminal -C 'pkexec apt reinstall uengine uengine-android-image uengine-modules-dkms -y && notify-send -i uengine \"安装完毕!\"'"]).start()
-
-def DelUengineCheck():
-    if not os.path.exists("/usr/share/uengine/uengine-check-runnable.sh"):
-        messagebox.showinfo(title="提示", message="本功能已经被删除,无法重复删除!")
-        return
-    if messagebox.askokcancel(title="警告", message="删除后将无法使用本软件恢复\n如果需要恢复本功能,请重新安装 UEngine!"):
-        threading.Thread(target=InstallWindow.ShowWindows, args=["pkexec rm -v /usr/share/uengine/uengine-check-runnable.sh"]).start()
-
-# 使用 adb 连接 uengine
-def UengineConnectAdb():
-    messagebox.showinfo(title="提示", message=subprocess.getoutput("adb connect 192.168.250.2:5555"))
-
-# 允许用户使用 adb
-def UengineUseAdb():
-    # 因为需要 root,所以需要开二号程序
-    os.system("adb start-server")  # 保证有生成文件
-    os.system("pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY {}/uengine-useadb 0 '{}'".format(programPath, "{}/.android/adbkey.pub".format(get_home())))  # 写入配置
-    if messagebox.askyesno(title="提示", message="是否要连接到 UEngine?"):
-        UengineConnectAdb()
-
-def UengineDoNotUseAdb():
-    # 因为需要 root,所以需要开二号程序
-    if not os.path.exists("/data/uengine/data/data/misc/adb/adb_keys"):
-        messagebox.showinfo(title="提示", message="你的 uengine 在设置前已经禁用 adb 连接,无需重复设置")
-        return
-    threading.Thread(target=os.system, args=["pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY {}/uengine-useadb 1".format(programPath)]).start()
-
-def UengineRunnerBugUpload():
-    threading.Thread(target=os.system, args=[programPath + "/uengine-runner-update-bug"]).start()
-
-def AdbConnectDeviceShow():
-    ShowTextTipsWindow.ShowWindow(subprocess.getoutput("adb devices -l"))
-
-def AdbAndroidInstallAppList():
-    ShowTextTipsWindow.ShowWindow('''系统应用:
-{}
-第三方应用:
-{}
-全部应用以及apk所在路径:
-{}'''.format(subprocess.getoutput("adb -s 192.168.250.2:5555 shell pm list packages -s"),
-    subprocess.getoutput("adb -s 192.168.250.2:5555 shell pm list package -3"),
-    subprocess.getoutput("adb -s 192.168.250.2:5555 shell pm list packages -f")))
-
-def GetApkVersion(apkFilePath):
-    info = GetApkInformation(apkFilePath)
-    for line in info.split('\n'):
-        if "package:" in line:
-            if "compileSdkVersion='" in line:
-                line = line.replace(line[line.index("compileSdkVersion='"): -1], "")
-            if "platform" in line:
-                line = line.replace(line[line.index("platform"): -1], "")
-            line = line.replace(line[0: line.index("versionName='")], "")
-            line = line.replace("versionName='", "")
-            line = line.replace("'", "")
-            line = line.replace(" ", "")
-            return line
-
-def VersionCheck(version1, version2):
-    return version1 == version2
-
-def ShowHelp():
-    webbrowser.open_new_tab(programPath + "/Help/index.html")
-
-def AllowOrDisallowUpdateAndroidApp():
-    if not os.path.exists("/data/uengine/data/data/misc/adb/adb_keys"):
-        if not messagebox.askyesno(title=langFile[lang]["Main"]["MainWindow"]["Answer"]["Title"], message=langFile[lang]["Main"]["MainWindow"]["Answer"]["UseAdbPackageAnswer"]):
-            return
-        os.system("pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY {}/uengine-useadb 0 '{}'".format(programPath,"{}/.android/adbkey.pub".format(get_home())))  # 写入配
-    adb = api.Adb("192.168.250.2:5555")
-    adb.Service.Close()
-    adb.connect()
-    if messagebox.askyesno(title=langFile[lang]["Main"]["MainWindow"]["Answer"]["Title"], message=langFile[lang]["Main"]["MainWindow"]["Answer"]["AllowOrDisallowUpdateAndroidAppAnswer"][int(adb.boolAndroidInstallOtherAppSetting())]):
-        adb.setAndroidInstallOtherAppSetting(not adb.boolAndroidInstallOtherAppSetting())
-        messagebox.showinfo(title=langFile[lang]["Main"]["MainWindow"]["Information"]["Title"], message=langFile[lang]["Main"]["MainWindow"]["Answer"]["CompleteInformation"])
-
-class SettingWindow():
-    saveApkOption = tk.IntVar()
-    def ShowWindow():
-        setting = tk.Toplevel()
-        setting.resizable(0, 0)
-        setting.iconphoto(False, tk.PhotoImage(file=iconPath))
-        setting.title("设置 UEngine 运行器" + version)
-        saveApkFrame = ttk.LabelFrame(setting, text="Apk 安装设置")
-        try:
-            data = json.loads(readtxt(get_home() + "/.config/uengine-runner/setting.json"))
-        except:
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["SettingReadError"])
-            setting.destroy()
-        SettingWindow.saveApkOption = tk.IntVar()
-        SettingWindow.saveApkOption.set(int(data["SaveApk"]))
-        ttk.Radiobutton(saveApkFrame, text="不备份Apk包直接安装", value=0, variable=SettingWindow.saveApkOption).pack(anchor=tk.W)
-        ttk.Radiobutton(saveApkFrame, text="备份Apk包然后在安装后自动拷贝原先目录", value=1, variable=SettingWindow.saveApkOption).pack(anchor=tk.W)
-        controlFrame = ttk.Frame(setting)
-        ttk.Button(controlFrame, text="取消", command=setting.destroy).grid(row=0, column=0)
-        ttk.Button(controlFrame, text="保存", command=SettingWindow.SaveSetting).grid(row=0, column=1)
-        saveApkFrame.pack()
-        controlFrame.pack(anchor=tk.E)
-    def SaveSetting():
-        try:
-            write_txt(get_home() + "/.config/uengine-runner/setting.json", json.dumps({"SaveApk": bool(SettingWindow.saveApkOption.get())}))
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["SettingSaveError"])
-            return
-        messagebox.showinfo(title="提示", message="设置保存完毕!")
-
-class UpdateWindow():
-    data = {}
-    def ShowWindow():
-        update = tk.Toplevel()
-        update.title("检查更新")
-        update.resizable(0, 0)
-        update.iconphoto(False, tk.PhotoImage(file=iconPath))
-        versionLabel = ttk.Label(update, text="当前版本:{}\n最新版本:未知\n更新内容:".format(version))
-        updateText = tk.Text(update)
-        controlFrame = ttk.Frame(update)
-        ok = ttk.Button(controlFrame, text="更新(更新过程中会关闭所有Python应用,包括这个应用)", command=UpdateWindow.Update)
-        cancel = ttk.Button(controlFrame, text="取消", command=update.destroy)
-        try:
-            UpdateWindow.data = json.loads(requests.get("http://120.25.153.144/uengine-runner/update.json").text)
-            versionLabel = ttk.Label(update, text="当前版本:{}\n最新版本:{}\n更新内容:".format(version, UpdateWindow.data["Version"]))
-            if UpdateWindow.data["Version"] == version:
-                updateText.insert("0.0", "此为最新版本,无需更新")
-                ok.configure(state=tk.DISABLED)
-            else:
-                updateText.insert("0.0", UpdateWindow.data["New"].replace("\\n", "\n"))
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ConnectServerError"])
-        updateText.configure(state=tk.DISABLED)
-        versionLabel.pack(anchor=tk.W)
-        updateText.pack()
-        controlFrame.pack(anchor=tk.E)
-        cancel.grid(row=0, column=0)
-        ok.grid(row=0, column=1)
-        update.mainloop()
-    def Update():
-        if not os.path.exists("/tmp/uengine-runner/update"):
-            os.makedirs("/tmp/uengine-runner/update")
-        try:            
-            write_txt("/tmp/uengine-runner/update.sh", """#!/bin/bash
-echo 删除多余的安装包
-rm -rfv /tmp/uengine-runner/update/*
-echo 关闭“UEngine 运行器”以及其它“Python 应用”
-killall python3
-echo 下载安装包
-wget -P /tmp/uengine-runner/update {}
-echo 安装安装包
-dpkg -i /tmp/uengine-runner/update/*.deb
-echo 修复依赖关系
-apt install -f -y
-notify-send -i uengine "更新完毕!"
-zenity --info --text=\"更新完毕!\" --ellipsize
-""".format(UpdateWindow.data["Url"][int(information["Package"] == "com.gitee.uengine.runner.spark")], iconPath))
-        except:
-            traceback.print_exc()
-            easygui.textbox(title="错误", msg="更新出现错误,无法继续更新!", text=traceback.format_exc())
-        os.system("deepin-terminal -e pkexec bash /tmp/uengine-runner/update.sh")
-        
-image = None
-class ApkInformation():
-    def ShowWindows():
-        global fullInformation
-        global path
-        global tab1
-        path = ComboInstallPath.get()
-        package = GetApkPackageName(path)
-        if package == None or package == "":
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ApkFileError"])
-            return
-        message = tk.Toplevel()
-        message.title("“{}“的Apk信息".format(GetApkChineseLabel(path)))
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-        
-        tab = ttk.Notebook(message)
-
-        tab1 = ttk.Frame(message)
-        tab2 = ttk.Frame(message)
-
-        fullInformation = tk.Text(tab2)
-
-        tab.add(tab1, text="简化版")
-        tab.add(tab2, text="完整版")
-
-        fullInformation.pack(expand="yes", fill="both")
-
-        tab.pack(expand="yes", fill="both")
-        
-        threading.Thread(target=ApkInformation.GetInformation).start()
-
-        message.mainloop()
-
-    def GetInformation():
-        # 获取详细信息
-        fullInformation.configure(state=tk.NORMAL)
-        fullInformation.insert("1.0", GetApkInformation(path))
-        fullInformation.configure(state=tk.DISABLED)
-        # 获取图标
-        SaveApkIcon(path, "/tmp/uengine-runner-android-app-icon.png")
-        # 读取图标
-        global image
-        image = Image.open("/tmp/uengine-runner-android-app-icon.png")
-        if image.size[0] + image.size[1] <= 512:
-            ttk.Label(tab1, image=ImageTk.PhotoImage(Image.open("/tmp/uengine-runner-android-app-icon.png"))).pack()
-        else:
-            ttk.Label(tab1, image=ImageTk.PhotoImage(Image.open("/tmp/uengine-runner-android-app-icon.png").resize((256, 256), Image.ANTIALIAS))).pack()
-        image.close()
-        info = '''包名:{}
-中文名:{}
-Activity:{}
-版本:{}'''.format(GetApkPackageName(path), GetApkChineseLabel(path), GetApkActivityName(path), GetApkVersion(path))
-        ttk.Label(tab1, text=info).pack()
-        ttk.Button(tab1, text="查看程序评分情况", command=ApkInformation.ShowMap).pack()
-        ttk.Button(tab1, text="上传程序评分情况", command=ApkInformation.UpdateMark).pack()
-
-    def UpdateMark():
-        #message = tk.Toplevel()
-        #message.iconphoto(False, tk.PhotoImage(file=iconPath))
-        choose = easygui.indexbox(title="选择评分", choices=["含有不良信息", "0分", "1分", "2分", "3分", "4分", "5分", "取消"], msg="""选择应用“{}”的使用评分。建议参考如下规范进行评分:
-含有不良信息(-1分):含有违法违规信息(如果有就不要选择其它选项了)
-0星:完全无法使用,连安装都有问题
-1星:完全无法使用,但是能正常安装
-2星:可以打开,但只能使用一点点功能
-3星:勉强能使用,运行也不大流畅
-4星:大部分功能正常,运行流畅(可能会有点小卡)
-5星:完全正常且非常流畅,没有任何功能和性能问题,就和直接在手机上用一样
-""".format(GetApkChineseLabel(path)))
-        print(choose)
-        if choose == None or choose == 7:
-            return
-        try:
-            messagebox.showinfo(title="提示", message=requests.post("http://120.25.153.144/uengine-runner/app/check/add.php", {"Package": GetApkPackageName(path), "Type": choose}).text)
-        except:
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ConnectServerStarError"])
-
-
-    def ShowMap():
-        package = GetApkPackageName(path)
-        if package == None or package == "":
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ApkFileError"])
-            return
-        try:
-            data = json.loads(requests.get("http://120.25.153.144/uengine-runner/app/check/" + package +"/data.json").text)
-            print(data)
-        except:
-            messagebox.showinfo(title="错误", message="此程序暂时没有评分,欢迎您贡献第一个评分!")
-            return
-        index = numpy.arange(len(data))
-        print(index)
-        chinese = GetApkChineseLabel(path)
-        fig = matplotlib.pylab.figure()
-        fig.canvas.set_window_title("“" + chinese + "”的用户评分(数据只供参考)")
-        fonts = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc')  # 用于支持中文显示,需要依赖fonts-noto-cjk
-        matplotlib.pylab.barh(index, data)
-        matplotlib.pylab.yticks(index, ["不良信息", "0分", "1分", "2分", "3分", "4分", "5分"], fontproperties=fonts)
-        matplotlib.pylab.xlabel("用户评分数", fontproperties=fonts)
-        matplotlib.pylab.ylabel("等级", fontproperties=fonts)
-        matplotlib.pylab.title("“" + chinese + "”的用户评分(数据只供参考)", fontproperties=fonts)
-        matplotlib.pylab.show()
-
-class AdbChangeUengineDisplaySize():
-    def ShowWindows():
-        global displayX
-        global displayY
-        global displaySize
-        message = tk.Toplevel()
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-        messageFrame = ttk.Frame(message)
-
-        displaySize = tk.StringVar()
-        displaySize.set("当前 UEngine 屏幕分辨率:正在获取")
-
-        displaySizeLabel = ttk.Label(messageFrame, textvariable=displaySize)
-
-        input = ttk.Frame(messageFrame)
-        displayX = ttk.Entry(input)
-        displayY = ttk.Entry(input)
-
-        settingBUtton = ttk.Button(messageFrame, text="设置分辨率", command=AdbChangeUengineDisplaySize.SettingDisplaySize)
-
-        message.title("修改 UEngine 分辨率")
-        message.resizable(0, 0)
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-        # get screen width and height
-        screen_width = message.winfo_screenwidth()
-        screen_height = message.winfo_screenheight()
-        # calculate position x and y coordinates  假设主窗口大小固定 570x236像素 ,设置窗口位置为屏幕中心。 
-        winwith=570
-        winhigh=236
-        x = (screen_width/2) - (winwith/2)
-        y = (screen_height/2) - (winhigh/2)
-        message.geometry("+{}+{}".format(int(x), int(y)))
-
-        displayX.grid(row=0, column=0)
-        displayY.grid(row=0, column=1)
-
-        displaySizeLabel.grid(row=0, column=0)
-        input.grid(row=1, column=0)
-        settingBUtton.grid(row=2, column=0)
-
-        messageFrame.pack()
-        threading.Thread(target=AdbChangeUengineDisplaySize.GetUengineDisplaySize).start()
-        message.mainloop()
-
-    def GetUengineDisplaySize():
-        global displaySize
-        displaySize.set("当前 UEngine 屏幕分辨率:\n" + subprocess.getoutput("adb -s '192.168.250.2:5555' shell wm size"))
-        #displaySize.set(subprocess.getoutput("adb -s '192.168.250.2:5555' shell wm size"))
-
-    def SettingDisplaySize():
-        global displayX
-        global displayY
-        try:
-            int(displayX.get())
-            int(displayY.get())
-        except:
-            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["InputDataError"])
-            return
-        os.system("adb -s '192.168.250.2:5555' shell wm size {}x{}".format(displayX.get(), displayY.get()))
-        AdbChangeUengineDisplaySize.GetUengineDisplaySize()
-        messagebox.showinfo(title="提示", message="执行完毕!")
-
-# 运行命令的窗口
-class InstallWindow():
-    # 显示窗口
-    def ShowWindows(command):
-        global message
-        global text
-        global installTipsText
-        global progressbar
-        global runCommand
-        message = tk.Toplevel()
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-        messageFrame = ttk.Frame(message)
-        installTipsText = tk.StringVar()
-        message.title("正在操作……")
-        installTipsText.set("正在操作……")
-        installTips = ttk.Label(messageFrame, textvariable=installTipsText)
-        progressbar = ttk.Progressbar(messageFrame, length=500, mode='indeterminate')
-        text = tk.Text(messageFrame)
-        text.config(background="black", foreground="white")
-        installTips.pack()
-        progressbar.pack(fill="x")
-        text.pack(expand='yes', fill='both')
-        messageFrame.pack(expand='yes', fill='both')
-        print("Run!")
-        threading.Thread(target=InstallWindow.RunCommand, args=[command]).start()
-        message.mainloop()
-    
-    # 运行命令并显示
-    def RunCommand(command):
-        global message
-        global text
-        global progressbar
-        global installTipsText
-        InstallWindow.AddText("$>" + command + "\n")
-        progressbar.start()
-        result = subprocess.getoutput(command)
-        InstallWindow.AddText(result)
-        messagebox.showinfo(title="提示", message="操作完毕!")
-        installTipsText.set("操作完毕!")
-        message.title("操作完毕!")
-        progressbar.stop()
-        progressbar["value"] = 100
-        # 特意添加!
-        DisabledAndEnbled(False)
-        if command == "pkexec rm -rfv /data/uengine":
-            print("Clean!")
-            if messagebox.askyesno(title="提示", message="清空完毕,将会在重启后生效,是否要重启?"):
-                print("reboot")
-                os.system("reboot")
-
-    # 添加文本
-    def AddText(things):
-        global text
-        text.configure(state=tk.NORMAL)
-        text.insert("end", things)
-        text.configure(state=tk.DISABLED)
-
-class ShowTextTipsWindow():
-    def ShowWindow(things):
-        message = tk.Toplevel()
-
-        message.title("提示")
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-
-        text = tk.Text(message)
-        quitButton = ttk.Button(message, text="确定", command=message.destroy)
-
-        text.insert("end", things)
-        text.configure(state=tk.DISABLED)
-
-        text.pack(fill="both", expand="yes")
-        quitButton.pack()
-
-        message.mainloop()
-
-# 添加/删除 uengine 应用快捷方式
-class AddNewUengineDesktopLink():
-    addTips = '''可以输入app的包名和Activity或通过浏览apk文件来获取包名和Activity
-注意:如果是要删除只要输入包名即可'''
-    def ShowWindow():
-        global activityName
-        global packageName
-        message = tk.Toplevel()
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-
-        tipsLabel = ttk.Label(message, text=AddNewUengineDesktopLink.addTips)
-        packageName = ttk.Combobox(message, width=30)
-        activityName = ttk.Combobox(message, width=30)
-        findApk = ttk.Button(message, text="浏览", command=AddNewUengineDesktopLink.FindApk)
-        controlFrame = ttk.Frame(message)
-        testOpen = ttk.Button(controlFrame, text="打开", command=AddNewUengineDesktopLink.TestOpen)
-        saveButton = ttk.Button(controlFrame, text="写入", command=AddNewUengineDesktopLink.SaveDesktopLink)
-        delButton = ttk.Button(controlFrame, text="删除", command=AddNewUengineDesktopLink.DelDesktopLink)
-
-        message.title("添加/删除 UEngine 图标")
-        message.resizable(0, 0)
-        message.iconphoto(False, tk.PhotoImage(file=iconPath))
-        # get screen width and height
-        screen_width = message.winfo_screenwidth()
-        screen_height = message.winfo_screenheight()
-        # calculate position x and y coordinates  假设主窗口大小固定 570x236像素 ,设置窗口位置为屏幕中心。 
-        winwith=570
-        winhigh=236
-        x = (screen_width/2) - (winwith/2)
-        y = (screen_height/2) - (winhigh/2)
-        message.geometry("+{}+{}".format(int(x), int(y)))
-
-        packageName["value"] = findApkNameHistory
-        activityName["value"] = findApkActivityHistory
-        
-        tipsLabel.grid(row=0, column=0, columnspan=3)
-        packageName.grid(row=1, column=0)
-        activityName.grid(row=1, column=1)
-        findApk.grid(row=1, column=2)
-        controlFrame.grid(row=2, column=0, columnspan=3)
-        testOpen.grid(row=0, column=0)
-        saveButton.grid(row=0, column=1)
-        delButton.grid(row=0, column=2)
-
-        message.mainloop()
-
-    # 添加快捷方式
-    def SaveDesktopLink():
-        try:
-            if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
-                if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"):
-                    return
-            if not os.path.exists("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home())):
-                os.makedirs("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home()))
-            global activityName
-            iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get())
-            shutil.copy(programPath + "/defult.png", iconSavePath)
-            BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
-                "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
-            BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
-                "{}/{}.desktop".format(get_desktop_path(), packageName.get()))
-            AddNewUengineDesktopLink.SaveHistory()
-            messagebox.showinfo(title="提示", message="创建完毕!")
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=traceback.format_exc())
-
-
-    # 删除快捷方式
-    def DelDesktopLink():
-        try:
-            global packageName
-            if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
-                messagebox.showerror(title="错误", message="此包名对应的 UEngine 桌面快捷方式不存在!")
-                return
-            if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"):
-                return
-            try:
-                os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
-                AddNewUengineDesktopLink.SaveHistory()
-                messagebox.showinfo(title="提示", message="已删除")
-            except:
-                traceback.print_exc()
-                messagebox.showerror(title="错误", message=traceback.format_exc())
-        except:
-            traceback.print_exc()
-            messagebox.showerror(title="错误", message=traceback.format_exc())
-
-    # 保存历史记录
-    def SaveHistory():
-        findApkNameHistory.append(packageName.get())
-        findApkActivityHistory.append(activityName.get())
-        packageName['value'] = findApkNameHistory
-        activityName['value'] = findApkActivityHistory
-        write_txt(get_home() + "/.config/uengine-runner/FindApkNameHistory.json", str(json.dumps(ListToDictionary(findApkNameHistory))))  # 将历史记录的数组转换为字典并写入 
-        write_txt(get_home() + "/.config/uengine-runner/FindApkActivityHistory.json", str(json.dumps(ListToDictionary(findApkActivityHistory))))  # 将历史记录的数组转换为字典并写入
-
-    # 打开测试
-    def TestOpen():
-        threading.Thread(target=os.system, args=["/usr/bin/uengine launch --package={} --component={}".format(packageName.get(), activityName.get())]).start()
-        AddNewUengineDesktopLink.SaveHistory()
-
-    # 浏览文件
-    def FindApk():
-        path = filedialog.askopenfilename(title="选择apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkName.json"))["path"])
-        if path == "" or path == ():
-            return
-        packageName.set(GetApkPackageName(path))
-        activityName.set(str(GetApkActivityName(path)))
-        write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": os.path.dirname(path)}))  # 写入配置文件
-
-def UseProgram():
-    global useProgram
-    useProgram = '''1、UEngine:{}
-2、python3:{}
-3、tkinter:{}
-4、aapt:{}
-5、dpkg:{}
-6、mkdir:{}
-7、echo
-8、chmod:{}
-9、adb:{}
-10、deepin 终端:{}'''.format(subprocess.getoutput("uengine version"),
-    subprocess.getoutput("python3 --version"),
-    tk.TkVersion,
-    subprocess.getoutput("aapt version"),
-    subprocess.getoutput("dpkg --version"),
-    subprocess.getoutput("mkdir --version"),
-    subprocess.getoutput("chmod --version"),
-    subprocess.getoutput("adb version"),
-    subprocess.getoutput("deepin-terminal -v"))
-
-###########################
-# 程序信息
-###########################
-lang = get_now_lang()
-programPath = os.path.split(os.path.realpath(__file__))[0]  # 返回 string
-information = json.loads(readtxt(programPath + "/information.json"))
-langFile = json.loads(readtxt(programPath + "/Language.json"))
-if not lang in langFile.keys():
-    lang = "en_US.UTF-8"
-programUrl = information["Url"][0]
-version = information["Version"]
-goodRunSystem = information["System"]
-aaptVersion = GetCommandReturn("aapt version")
-SystemVersion = GetSystemVersion()
-about = '''介绍        :一个基于 Python3 的 tkinter 制作的 UEngine 运行器,在新版本Deepin/UOS发布后,可以在应用商店安装部分官方已适配的安卓应用,对爱好者来说,不能自己安装APK软件包始终差点意思,本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包,并能发送安装的APK包启动菜单到桌面或系统菜单。
-
-版本        :{}
-
-适用平台    :{}
-
-Tk 版本     :{}
-
-程序官网    :{}
-
-系统版本    : {}
-
-©2021-{}'''.format(version, goodRunSystem, tk.TkVersion,  programUrl, SystemVersion, time.strftime("%Y"))
-tips = "\n".join(information["Tips"])
-updateThingsString = "\n".join(information["Update"])
-title = "{} {}".format(langFile[lang]["Main"]["MainWindow"]["Title"], version)
-updateTime = information["Time"]
-updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y"))
-iconPath = "{}/runner.png".format(os.path.split(os.path.realpath(__file__))[0])
-desktop = programPath + "/UengineAndroidProgramList.desktop"
-desktopName = "UengineAndroidProgramList.desktop"
-contribute = "\n".join(information["Contribute"])
-useProgram = ""
-threading.Thread(target=UseProgram).start()
-
-###########################
-# 加载配置
-###########################
-if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
-    os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
-if not os.path.exists(get_home() + "/.config/uengine-runner"):  # 如果没有配置文件夹
-    os.makedirs(get_home() + "/.config/uengine-runner")  # 创建配置文件夹
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkHistory.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({}))  # 创建配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindApkNameHistory.json", json.dumps({}))  # 创建配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkActivityHistory.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindApkActivityHistory.json", json.dumps({}))  # 创建配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindUninstallApkHistory.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindUninstallApkHistory.json", json.dumps({}))  # 创建配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkName.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": "~"}))  # 写入(创建)一个配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindApk.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindApk.json", json.dumps({"path": "~"}))  # 写入(创建)一个配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/FindUninstallApk.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/FindUninstallApk.json", json.dumps({"path": "~"}))  # 写入(创建)一个配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/SaveApkIcon.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/SaveApkIcon.json", json.dumps({"path": "~"}))  # 写入(创建)一个配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/SaveApk.json"):  # 如果没有配置文件
-    write_txt(get_home() + "/.config/uengine-runner/SaveApk.json", json.dumps({"path": "~"}))  # 写入(创建)一个配置文件
-if not os.path.exists(get_home() + "/.config/uengine-runner/setting.json"):
-    choose = None
-    choose = easygui.indexbox(msg="""在使用本程序前,请选择安装Apk包的设置以便更好的运行,下列选项的详细介绍:
-
-不备份Apk包直接安装:适用于Deepin(旧版UEngine),安装较快,不受/tmp大小所限,但Deepin23和UOS(新版UEngine)不推荐此选项,因为安装后会自动删除Apk安装包;
-备份Apk包然后在安装后自动拷贝原先目录:适用于Deepin23和UOS(新版UEngine),安装较慢,受/tmp大小所限,安装后不会丢失Apk,Deepin(旧版UEngine)不推荐使用该选项;
-
-
-后期可以在程序主界面的菜单栏的“程序”=>“设置”里进行修改,
-如果不知道正在使用的系统是什么版本可以打开系统设置查看。
-""", title="设置", choices=["不备份Apk包直接安装", "备份Apk包然后在安装后自动拷贝原先目录"])
-    if choose == None:
-        root = tk.Tk()
-        root.withdraw()
-        messagebox.showinfo(title="提示", message="必须选择一个选项!否则无法进入程序!")
-        sys.exit()            
-    write_txt(get_home() + "/.config/uengine-runner/setting.json", json.dumps({"SaveApk": int(choose)}))
-
-
-###########################
-# 设置变量
-###########################
-findApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkHistory.json")).values())
-fineUninstallApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindUninstallApkHistory.json")).values())
-findApkNameHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkNameHistory.json")).values())
-findApkActivityHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkActivityHistory.json")).values())
-
-# add sub window
-#添加窗口开启关闭开关,防止重复开启
-windowflag = "close"
-
-def showhelp():
-     
-    #define  window and frame and button label   
-    # 
-    global windowflag
-    if windowflag == "close":
-        helpwindow=tk.Toplevel()
-        helpwindow.resizable(0, 0)
-        helpwindow.title("帮助")
-        helpwindow.iconphoto(False, tk.PhotoImage(file=iconPath))
-
-        # get screen width and height
-        screen_width = helpwindow.winfo_screenwidth()
-        screen_height = helpwindow.winfo_screenheight()
-        # calculate position x and y coordinates  假设主窗口大小固定 570x236像素 ,设置窗口位置为屏幕中心。
-        winwith=550
-        winhigh=700
-        x = (screen_width/2) - (winwith/2)
-        y = (screen_height/2) - (winhigh/2)
-        
-        helpwindow.geometry("550x700"+"+{:.0f}+{:.0f}".format(x, y))
-
-        style = ttkthemes.ThemedStyle(helpwindow)
-        style.set_theme("breeze")
-        
-        
-
-        Frmroot=ttk.Frame(helpwindow)
-        FrmMenu = ttk.Frame(Frmroot)
-        FrmText = ttk.Frame(Frmroot)
-
-        LabFrmText=ttk.LabelFrame(FrmText,text="帮助",height=800,borderwidth=3)  
-        HelpStr = tk.StringVar() 
-        HelpStr.set(tips)
-        LabText = ttk.Label(LabFrmText, textvariable=HelpStr,width=55)
-        LabText.config(wraplength=350)
-        
-        def on_closing():
-            global windowflag
-            windowflag = "close"
-            print(windowflag)
-            helpwindow.destroy()
-
-
-
-        # define button func        
-        def ChgLog():
-            HelpStr.set(updateThingsString)
-        def ChgAbout():
-            HelpStr.set(about)
-        def ChgDep():
-            if useProgram == "":
-                BtnZujian.configure(state=tk.DISABLED)
-                return
-            HelpStr.set(useProgram)
-        def ChgCon():
-            HelpStr.set(contribute)
-        def ChgTips():
-            HelpStr.set(tips)
-            LabText.config(wraplength=350)
-        def Egg(event):
-            try:
-                lists = json.loads(requests.get("http://120.25.153.144/uengine-runner/VersionList.json").text)
-                data = []
-                for i in lists:
-                    data.append(int(requests.get("http://120.25.153.144/uengine-runner/{}/data.txt".format(i)).text))
-            except:
-                messagebox.showerror(title="错误", message="服务器出错!数据获取失败!")
-                return
-            fig = matplotlib.pylab.figure()
-            fig.canvas.set_window_title("“UEngine 运行器”安装数(数据只供参考)")
-            matplotlib.pylab.plot(lists, data)
-            index = numpy.arange(len(lists))
-            fonts = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc')  # 用于支持中文显示,需要依赖fonts-noto-cjk
-            matplotlib.pylab.xlabel("版本号", fontproperties=fonts)
-            matplotlib.pylab.ylabel("安装数", fontproperties=fonts)
-            
-            matplotlib.pylab.title("“UEngine 运行器”安装数(数据只供参考)", fontproperties=fonts)
-            matplotlib.pylab.show()
-
-        BtnReadme = ttk.Button(FrmMenu, text="使用说明",width=14,command=ChgTips)
-        BtnLog = ttk.Button(FrmMenu, text="更新内容",width=14,command=ChgLog)
-        BtnZujian = ttk.Button(FrmMenu, text="程序依赖的组件",width=14,command=ChgDep)
-        BtnGongxian = ttk.Button(FrmMenu, text="有贡献的开发者",width=14,command=ChgCon)
-        BtnAbout = ttk.Button(FrmMenu, text="关于",width=14,command=ChgAbout)
-        BtnAbout.bind("<Double-Button-1>", Egg)
-
-
-        #layout
-        FrmMenu.grid(row=0,column=0,sticky=tk.NW)
-        BtnReadme.grid(row=0,column=0,sticky=tk.NW,padx=3)
-        BtnLog.grid(row=1,column=0,sticky=tk.NW,padx=3)
-        BtnZujian.grid(row=2,column=0,sticky=tk.NW,padx=3)
-        BtnGongxian.grid(row=3,column=0,sticky=tk.NW,padx=3)
-        BtnAbout.grid(row=4,column=0,sticky=tk.NW,padx=3)
-
-        FrmText.grid(row=0,column=1,sticky=tk.NW)
-        LabFrmText.grid(row=0,column=0,sticky=tk.NW,padx=3,pady=3)
-        LabText.grid(row=0,column=0,sticky=tk.NW)
-      
-        Frmroot.pack()
-        windowflag = "open"
-        print(windowflag)
-        #helpwindow.mainloop()
-        helpwindow.protocol("WM_DELETE_WINDOW", on_closing)
-
-###########################
-# 检查 UEngine 是否安装
-###########################
-if not os.path.exists("/usr/bin/uengine"):
-    # 不渲染窗口
-    style = ttkthemes.ThemedStyle(win)
-    style.set_theme("breeze")
-    win.withdraw()
-    # Deepin/UOS 用户
-    if "deepin" in SystemVersion.lower() or "uos" in SystemVersion.lower():
-        if messagebox.askyesno(title="提示", message="您的电脑没有安装 UEngine,是否安装 UEngine 以便更好的使用\n安装完后重新启动该程序即可"):
-            os.system("deepin-terminal -C \"pkexec apt install uengine\"")
-            sys.exit(0)
-    # 非 Deepin/UOS 用户
-    else:
-        if messagebox.askyesno(title="提示", message="您的电脑没有安装 UEngine,是否安装 UEngine 以便更好的使用\n这里将会使用 shenmo 提供的脚本进行安装\n安装完后重新启动该程序即可"):
-            os.system(f"deepin-terminal -C \"bash '{programPath}/uengine-installer'\"")
-            sys.exit(0)
-    # 重新显示窗口
-    win.wm_deiconify()
-
-###########################
-# 窗口创建
-###########################
-
-
-# 设置窗口
-style = ttkthemes.ThemedStyle(win)
-style.set_theme("breeze")
-window = ttk.Frame(win)
-win.title(title)
-win.resizable(0, 0)
-win.iconphoto(False, tk.PhotoImage(file=iconPath))
-
-# get screen width and height
-screen_width = win.winfo_screenwidth()
-screen_height = win.winfo_screenheight()
-# calculate position x and y coordinates  假设主窗口大小固定 570x236像素 ,设置窗口位置为屏幕中心。 
-winwith=570
-winhigh=236
-x = (screen_width/2) - (winwith/2)
-y = (screen_height/2) - (winhigh/2)
-
-win.geometry(""+"+{:.0f}+{:.0f}".format(x, y))
-
-# 创建控件
-FrmInstall = ttk.Frame(window)
-#FrmUninstall = ttk.Frame(window)
-LabApkPath = ttk.Label(window, text=langFile[lang]["Main"]["MainWindow"]["LabApkPath"])
-ComboInstallPath = ttk.Combobox(window, width=50)
-BtnFindApk = ttk.Button(FrmInstall, text=langFile[lang]["Main"]["MainWindow"]["BtnFindApk"], command=FindApk)
-BtnInstall = ttk.Button(FrmInstall, text=langFile[lang]["Main"]["MainWindow"]["BtnInstall"], command=Button3Install)
-BtnShowUengineApp = ttk.Button(window, text=langFile[lang]["Main"]["MainWindow"]["BtnShowUengineApp"], command=Button5Click)
-BtnUninstall = ttk.Button(FrmInstall, text=langFile[lang]["Main"]["MainWindow"]["BtnUninstall"], command=ButtonClick8)
-Btngeticon = ttk.Button(FrmInstall, text=langFile[lang]["Main"]["MainWindow"]["Btngeticon"], command=SaveIconToOtherPath)
-BtnSaveApk = ttk.Button(FrmInstall, text=langFile[lang]["Main"]["MainWindow"]["BtnSaveApk"], command=SaveInstallUengineApp)
-BtnApkInformation = ttk.Button(FrmInstall, text=langFile[lang]["Main"]["MainWindow"]["BtnApkInformation"], command=ApkInformation.ShowWindows)
-# 设置菜单栏
-menu = tk.Menu(window, background="white")  
-
-programmenu = tk.Menu(menu, tearoff=0, background="white")  # 设置“程序”菜单栏
-adb = tk.Menu(menu, tearoff=0, background="white")
-uengine = tk.Menu(menu, tearoff=0, background="white")
-help = tk.Menu(menu, tearoff=0, background="white")  # 设置“帮助”菜单栏
-
-adbServer = tk.Menu(adb, tearoff=0, background="white")
-
-uengineService = tk.Menu(uengine, tearoff=0, background="white")
-uengineInternet = tk.Menu(uengine, tearoff=0, background="white")
-uengineIcon = tk.Menu(uengine, tearoff=0, background="white")
-uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white")
-uengineData = tk.Menu(uengine, tearoff=0, background="white")
-uengineRoot = tk.Menu(uengine, tearoff=0, background="white")
-
-menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu)
-menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb)
-menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Name"], menu=uengine)
-menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Name"], menu=help)
-
-programmenu.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Menu"][0], command=CleanProgramHistory)
-programmenu.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Menu"][2], command=SettingWindow.ShowWindow)
-programmenu.add_separator()  # 设置分界线
-programmenu.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Menu"][1], command=window.quit)  # 设置“退出程序”
-
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][0], command=UengineConnectAdb)
-adb.add_separator()
-adb.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][1]["Name"], menu=adbServer)
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][2], command=AdbConnectDeviceShow)
-adb.add_separator()
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][3], command=AdbChangeUengineDisplaySize.ShowWindows)
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][4], command=AdbAndroidInstallAppList)
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][5], command=AdbCPUAndRAWShowInTer)
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][6], command=AdbShellShowInTer)
-adb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][7], command=ScrcpyConnectUengine)
-adb.add_separator()
-adb.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][8]["Name"], menu=uengineUseAdb)
-
-adbServer.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][1]["Menu"][0], command=AdbStartServer)
-adbServer.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][1]["Menu"][1], command=AdbStopServer)
-adbServer.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][1]["Menu"][2], command=AdbKillAdbProgress)
-
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][13], command=AllowOrDisallowUpdateAndroidApp)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][1], command=OpenUengineDebBuilder)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][7], command=KeyboardToMouse)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][8], command=UengineCheckCpu)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][12], command=UengineUbuntuInstall)
-uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Name"], menu=uengineService)
-uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Name"], menu=uengineInternet)
-uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][4]["Name"], menu=uengineIcon)
-uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][5]["Name"], menu=uengineUseAdb)
-uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine)
-uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"], menu=uengineRoot)
-uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][14], command=UbuntuInstallUengine)
-
-help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL)  # 设置“程序官网”项
-help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload)  # 设置“传bug”项
-help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][4], command=ShowHelp)  # 设置“更多帮助”项
-help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][3], command=UpdateWindow.ShowWindow)
-help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][1], command=showhelp)  # 设置“关于这个程序”项
-
-uengineService.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][0], command=StartUengine)
-uengineService.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][1], command=StopUengine)
-uengineService.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][2], command=UengineRestart)
-
-uengineInternet.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Menu"][0], command=UengineBridgeStart)
-uengineInternet.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Menu"][1], command=UengineBridgeStop)
-uengineInternet.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Menu"][2], command=UengineBridgeRestart)
-uengineInternet.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Menu"][3], command=UengineBridgeReload)
-uengineInternet.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Menu"][4], command=UengineBridgeForceReload)
-
-uengineIcon.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][4]["Menu"][0], command=SendUengineAndroidListForDesktop)
-uengineIcon.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][4]["Menu"][1], command=SendUengineAndroidListForLauncher)
-uengineIcon.add_separator()
-uengineIcon.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][4]["Menu"][2], command=AddNewUengineDesktopLink.ShowWindow)
-uengineIcon.add_separator()
-uengineIcon.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][4]["Menu"][3], command=CleanAllUengineDesktopLink)
-
-uengineUseAdb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][8]["Menu"][0], command=UengineConnectAdb)
-uengineUseAdb.add_separator()
-uengineUseAdb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][8]["Menu"][1], command=UengineUseAdb)
-uengineUseAdb.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][8]["Menu"][2], command=UengineDoNotUseAdb)
-
-uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][0], command=OpenUengineRootData)
-uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][1], command=OpenUengineUserData)
-uengineData.add_separator()
-uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean)
-
-uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][0], command=InstallRootUengineImage)
-uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][1], command=BuildRootUengineImage)
-uengineRoot.add_separator()
-uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][2], command=ReinstallUengineImage)
-
-menu.configure(activebackground="dodgerblue")
-help.configure(activebackground="dodgerblue")
-adb.configure(activebackground="dodgerblue")
-uengine.configure(activebackground="dodgerblue")
-programmenu.configure(activebackground="dodgerblue")
-uengineService.configure(activebackground="dodgerblue")
-uengineInternet.configure(activebackground="dodgerblue")
-uengineIcon.configure(activebackground="dodgerblue")
-uengineUseAdb.configure(activebackground="dodgerblue")
-uengineData.configure(activebackground="dodgerblue")
-
-# 设置控件
-ComboInstallPath['value'] = findApkHistory
-try:
-    if sys.argv[1] == "-i":
-        ComboInstallPath.set(sys.argv[2])
-        print("Install Path: " + sys.argv[2])
-    elif sys.argv[1] == "-u":
-        #ComboUninstallPath.set(sys.argv[2])
-        ComboInstallPath.set(sys.argv[2])
-        print("Unstall Path: " + sys.argv[2])
-    else:
-        print("Command Format Error")
-except:
-    print("Not Command Or Command Format Error")
-# 显示控件
-win.config(menu=menu)  # 显示菜单栏
-
-
-
-LabApkPath.grid(row=0, column=0,sticky= tk.W,padx=3)
-ComboInstallPath.grid(row=1, column=0,padx=3)
-
-
-FrmInstall.grid(row=0, column=1,padx=3, rowspan=3)
-BtnFindApk.grid(row=0, column=0)
-BtnInstall.grid(row=0, column=1)
-
-BtnUninstall.grid(row=1, column=0)
-
-BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2)
-
-BtnApkInformation.grid(row=2, column=1,sticky= tk.W,padx=3,pady=2)
-Btngeticon.grid(row=1, column=1,sticky= tk.W,padx=3,pady=2)
-BtnSaveApk.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2)
-
-window.pack()
-
-win.mainloop()
diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-launch.sh b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-launch.sh
new file mode 100755
index 0000000..27e1c9c
--- /dev/null
+++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-launch.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+FILE=/usr/bin/uengine
+if [ -f "$FILE" ]; then
+	echo "$FILE 存在,正常打开菜单"
+	/usr/bin/uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
+else
+	echo "$FILE 不存在,没有安装 UEngine,询问是否安装 UEngine"
+	# 读取系统版本
+	version=`sed -n '/^NAME/s/NAME="//Ip' /etc/os-release | sed -n 's/\"//Ip'`
+	declare -l versionLower=$version
+	echo "系统:$version"
+	if [ "$versionLower" = "deepin" ] || [ "$versionLower" = "uos" ]; then
+		echo "此系统为 Deepin/UOS,使用 apt 安装"
+		zenity --question --text="您还未安装 UEngine,是否现在安装?" --no-wrap
+		if [[ $? = 0 ]]; then
+			deepin-terminal -C "pkexec apt install uengine"
+		fi
+	else
+		echo "非 Deepin/UOS 系统,使用 shenmo 提供的脚本安装"
+		zenity --question --text="您还未安装 UEngine,是否现在安装?\n将会使用 shenmo 提供的脚本进行安装" --no-wrap
+		if [[ $? = 0 ]]; then
+			deepin-terminal -C "bash /opt/apps/com.gitee.uengine.runner.spark/files/uengine-installer"
+		fi
+	fi
+fi
diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner
index a258f70..caecd86 100755
--- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner
+++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner
@@ -2,8 +2,8 @@
 # 使用系统默认的 python3 运行
 ###########################################################################################
 # 作者:gfdgd xi<3025613752@qq.com>
-# 版本:1.6.1
-# 更新时间:2022年5月21日(要开学了)
+# 版本:1.6.2 Alpha
+# 更新时间:2022年6月19日(要期末考试了)
 # 感谢:anbox、deepin 和 UOS
 # 基于 Python3 的 tkinter 构建
 # 更新:gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com>、为什么您不喜欢熊出没和阿布呢
@@ -12,11 +12,13 @@
 # 引入所需的库
 #################
 import os
+import api
 import sys
 import time
 import json
 import shutil
 import zipfile
+import ctypes
 import traceback
 import threading
 import easygui
@@ -64,7 +66,8 @@ def UninstallProgram(package: "apk 包名")->"卸载程序":
 # 卸载按钮事件
 def ButtonClick8():
     if ComboInstallPath.get() is "":
-        messagebox.showerror(title="提示", message="信息没有填写完整,无法继续卸载 APK")
+        messagebox.showerror(title="提示", message=langFile[lang]["Main"]["MainWindow"]["Error"]["UninstallError"])
+
         return
     DisabledAndEnbled(True)
     if os.path.exists(ComboInstallPath.get()):
@@ -91,7 +94,7 @@ def FindApk()->"浏览窗口":
 # 安装按钮事件
 def Button3Install():
     if ComboInstallPath.get() is "" or not os.path.exists(ComboInstallPath.get()):
-        messagebox.showerror(title="提示", message="信息没有填写完整或错误,无法继续安装 APK")
+        messagebox.showerror(title="提示", message=langFile[lang]["Main"]["MainWindow"]["Error"]["InstallError"])
         return
     DisabledAndEnbled(True)
     threading.Thread(target=InstallApk, args=(ComboInstallPath.get(),)).start()
@@ -137,7 +140,7 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
             if setting["SaveApk"]:
                 shutil.copy("/tmp/uengine-runner/bak.apk", path)
         except:
-            messagebox.showerror(title="错误", message="无法还原安装包\n提示:新版UEngine安装后会自动删除安装包,备份的Apk在/tmp/uengine-runner/bak.apk,电脑重启后就会丢失!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["BackApkError"])
         print("\nprint install complete")
         if quit:
             print(commandReturn)
@@ -333,6 +336,12 @@ def InstallRootUengineImage():
     write_txt("/tmp/uengine-runner/install.sh", "sudo dpkg -i /tmp/uengine-runner/u*.deb\nsudo apt install -f")
     threading.Thread(target=os.system, args=["deepin-terminal -C \"wget -P '/tmp/uengine-runner' 'https://hub.fastgit.xyz/gfdgd-xi/uengine-runner/releases/download/U1.2.15/uengine-android-image_1.2.15_amd64.deb' && pkexec bash '/tmp/uengine-runner/install.sh'\""]).start()
 
+def UengineUbuntuInstall():
+    threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/uengine-installer")]).start()
+
+def UbuntuInstallUengine():
+    threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/uengine-installer")]).start()
+
 def BuildRootUengineImage():
     threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/root-uengine.sh")]).start()
     
@@ -407,7 +416,7 @@ def KeyboardToMouse():
 def SaveIconToOtherPath():
     apkPath = ComboInstallPath.get()
     if apkPath == "":
-        messagebox.showerror(title="错误", message="你没有选择 apk 文件")
+        messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ChooseApkError"])
         return
     path = filedialog.asksaveasfilename(title="保存图标", filetypes=[("PNG 图片", "*.png"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/SaveApkIcon.json"))["path"])
     if not path == "":
@@ -415,7 +424,7 @@ def SaveIconToOtherPath():
             SaveApkIcon(apkPath, path)
         except:
             traceback.print_exc()
-            messagebox.showerror(title="错误", message="本程序不支持保存该 apk 的图标")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["SaveApkIconError"])
             return
         write_txt(get_home() + "/.config/uengine-runner/SaveApkIcon.json", json.dumps({"path": os.path.dirname(path)}))  # 写入配置文件
         findApkHistory.append(ComboInstallPath.get())
@@ -523,7 +532,7 @@ def SaveInstallUengineApp():
             return
         if os.path.exists("/data/uengine/data/data/app/{}-1".format(result)):
             break
-        messagebox.showerror(title="错误", message="路径不存在,请重试!")
+        messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["PathError"])
     path = filedialog.asksaveasfilename(title="保存apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/SaveApk.json"))["path"])
     if path == "" or path == ():
         return
@@ -659,6 +668,18 @@ def VersionCheck(version1, version2):
 def ShowHelp():
     webbrowser.open_new_tab(programPath + "/Help/index.html")
 
+def AllowOrDisallowUpdateAndroidApp():
+    if not os.path.exists("/data/uengine/data/data/misc/adb/adb_keys"):
+        if not messagebox.askyesno(title=langFile[lang]["Main"]["MainWindow"]["Answer"]["Title"], message=langFile[lang]["Main"]["MainWindow"]["Answer"]["UseAdbPackageAnswer"]):
+            return
+        os.system("pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY {}/uengine-useadb 0 '{}'".format(programPath,"{}/.android/adbkey.pub".format(get_home())))  # 写入配
+    adb = api.Adb("192.168.250.2:5555")
+    adb.Service.Close()
+    adb.connect()
+    if messagebox.askyesno(title=langFile[lang]["Main"]["MainWindow"]["Answer"]["Title"], message=langFile[lang]["Main"]["MainWindow"]["Answer"]["AllowOrDisallowUpdateAndroidAppAnswer"][int(adb.boolAndroidInstallOtherAppSetting())]):
+        adb.setAndroidInstallOtherAppSetting(not adb.boolAndroidInstallOtherAppSetting())
+        messagebox.showinfo(title=langFile[lang]["Main"]["MainWindow"]["Information"]["Title"], message=langFile[lang]["Main"]["MainWindow"]["Answer"]["CompleteInformation"])
+
 class SettingWindow():
     saveApkOption = tk.IntVar()
     def ShowWindow():
@@ -670,7 +691,7 @@ class SettingWindow():
         try:
             data = json.loads(readtxt(get_home() + "/.config/uengine-runner/setting.json"))
         except:
-            messagebox.showerror(title="错误", message="读取设置错误!无法打开设置窗口!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["SettingReadError"])
             setting.destroy()
         SettingWindow.saveApkOption = tk.IntVar()
         SettingWindow.saveApkOption.set(int(data["SaveApk"]))
@@ -686,7 +707,7 @@ class SettingWindow():
             write_txt(get_home() + "/.config/uengine-runner/setting.json", json.dumps({"SaveApk": bool(SettingWindow.saveApkOption.get())}))
         except:
             traceback.print_exc()
-            messagebox.showerror(title="错误", message="保存设置错误!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["SettingSaveError"])
             return
         messagebox.showinfo(title="提示", message="设置保存完毕!")
 
@@ -712,8 +733,7 @@ class UpdateWindow():
                 updateText.insert("0.0", UpdateWindow.data["New"].replace("\\n", "\n"))
         except:
             traceback.print_exc()
-            messagebox.showerror(title="错误", message="无法连接服务器!")
-
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ConnectServerError"])
         updateText.configure(state=tk.DISABLED)
         versionLabel.pack(anchor=tk.W)
         updateText.pack()
@@ -753,7 +773,7 @@ class ApkInformation():
         path = ComboInstallPath.get()
         package = GetApkPackageName(path)
         if package == None or package == "":
-            messagebox.showerror(title="错误", message="该应用安装包异常,无法查询相关数据!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ApkFileError"])
             return
         message = tk.Toplevel()
         message.title("“{}“的Apk信息".format(GetApkChineseLabel(path)))
@@ -818,12 +838,13 @@ Activity:{}
         try:
             messagebox.showinfo(title="提示", message=requests.post("http://120.25.153.144/uengine-runner/app/check/add.php", {"Package": GetApkPackageName(path), "Type": choose}).text)
         except:
-            messagebox.showerror(title="错误", message="无法连接服务器!无法进行评分!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ConnectServerStarError"])
+
 
     def ShowMap():
         package = GetApkPackageName(path)
         if package == None or package == "":
-            messagebox.showerror(title="错误", message="该应用安装包异常,无法查询相关数据!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["ApkFileError"])
             return
         try:
             data = json.loads(requests.get("http://120.25.153.144/uengine-runner/app/check/" + package +"/data.json").text)
@@ -844,7 +865,6 @@ Activity:{}
         matplotlib.pylab.title("“" + chinese + "”的用户评分(数据只供参考)", fontproperties=fonts)
         matplotlib.pylab.show()
 
-
 class AdbChangeUengineDisplaySize():
     def ShowWindows():
         global displayX
@@ -901,7 +921,7 @@ class AdbChangeUengineDisplaySize():
             int(displayX.get())
             int(displayY.get())
         except:
-            messagebox.showerror(title="错误", message="你输入的数值不正确!")
+            messagebox.showerror(title="错误", message=langFile[lang]["Main"]["MainWindow"]["Error"]["InputDataError"])
             return
         os.system("adb -s '192.168.250.2:5555' shell wm size {}x{}".format(displayX.get(), displayY.get()))
         AdbChangeUengineDisplaySize.GetUengineDisplaySize()
@@ -1245,7 +1265,7 @@ def showhelp():
         HelpStr.set(tips)
         LabText = ttk.Label(LabFrmText, textvariable=HelpStr,width=55)
         LabText.config(wraplength=350)
-        
+
         def on_closing():
             global windowflag
             windowflag = "close"
@@ -1315,6 +1335,26 @@ def showhelp():
         #helpwindow.mainloop()
         helpwindow.protocol("WM_DELETE_WINDOW", on_closing)
 
+###########################
+# 检查 UEngine 是否安装
+###########################
+if not os.path.exists("/usr/bin/uengine"):
+    # 不渲染窗口
+    style = ttkthemes.ThemedStyle(win)
+    style.set_theme("breeze")
+    win.withdraw()
+    # Deepin/UOS 用户
+    if "deepin" in SystemVersion.lower() or "uos" in SystemVersion.lower():
+        if messagebox.askyesno(title="提示", message="您的电脑没有安装 UEngine,是否安装 UEngine 以便更好的使用\n安装完后重新启动该程序即可"):
+            os.system("deepin-terminal -C \"pkexec apt install uengine\"")
+            sys.exit(0)
+    # 非 Deepin/UOS 用户
+    else:
+        if messagebox.askyesno(title="提示", message="您的电脑没有安装 UEngine,是否安装 UEngine 以便更好的使用\n这里将会使用 shenmo 提供的脚本进行安装\n安装完后重新启动该程序即可"):
+            os.system(f"deepin-terminal -C \"bash '{programPath}/uengine-installer'\"")
+            sys.exit(0)
+    # 重新显示窗口
+    win.wm_deiconify()
 
 ###########################
 # 窗口创建
@@ -1396,9 +1436,11 @@ adbServer.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Men
 adbServer.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][1]["Menu"][1], command=AdbStopServer)
 adbServer.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Menu"][1]["Menu"][2], command=AdbKillAdbProgress)
 
+uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][13], command=AllowOrDisallowUpdateAndroidApp)
 uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][1], command=OpenUengineDebBuilder)
 uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][7], command=KeyboardToMouse)
 uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][8], command=UengineCheckCpu)
+uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][12], command=UengineUbuntuInstall)
 uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Name"], menu=uengineService)
 uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][3]["Name"], menu=uengineInternet)
 uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][4]["Name"], menu=uengineIcon)
@@ -1407,6 +1449,7 @@ uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"
 uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck)
 uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine)
 uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"], menu=uengineRoot)
+uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][14], command=UbuntuInstallUengine)
 
 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL)  # 设置“程序官网”项
 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload)  # 设置“传bug”项
diff --git a/old-deb-build/DEBIAN/control b/old-deb-build/DEBIAN/control
new file mode 100644
index 0000000..a5fa03c
--- /dev/null
+++ b/old-deb-build/DEBIAN/control
@@ -0,0 +1,10 @@
+Package: spark-uengine-runner
+Depends: com.gitee.uengine.runner.spark, ${misc:Depends}
+Architecture: all
+Priority: optional
+Section: oldlibs
+Version: 1.6.2
+Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com>, 柚子<https://gitee.com/Limexb>, 为什么您不喜欢熊出没和阿布呢<https://weibo.com/u/7755040136>, 星空露光<https://gitee.com/Cynorkyle>, shenmo<jifengshenmo@outlook.com>
+Conflicts: spark-uengine-apk-builder
+Homepage: [https://gitee.com/gfdgd-xi/uengine-runner, https://github.com/gfdgd-xi/uengine-runner]
+Description: UEngine Runner for deepin and UOS
\ No newline at end of file