diff --git a/README.md b/README.md index 33e4b0f..6056d7e 100755 --- a/README.md +++ b/README.md @@ -1,12 +1,21 @@ -# uengine 运行器 1.4.0 +# uengine 运行器 1.4.3 ### 介绍         新版本Deepin/UOS发布后,可以在应用商店安装部分官方已适配的安卓应用,对爱好者来说,不能自己安装APK软件包始终差点意思,本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包,并能发送安装的APK包启动菜单到桌面或系统菜单。 -![1.4.2](https://storage.deepin.org/thread/202108301750554993_截图_选择区域_20210830134502.png) +![1.4.3](https://storage.deepin.org/thread/202109111635389828_截图_选择区域_20210911163449.png) (测试平台:UOS 家庭版,deepin 20.2.2,UOS 专业版 1040) (自己美术功底太差,图标直接用 anbox 的了) ### 更新内容 +#### V1.4.3(2021-09-11,开学第一版): +此版本在受伤宅家期间写的![表情](https://bbs.deepin.org/assets/image/raccoon/[sad].gif) +**※1、支持打包器打包的包名带前缀“uengine-dc”** +**※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)** +**※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况** +4、支持一键使用 Scrcpy 连接 UEngine(①先安装 adb 破解补丁;②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】) +5、支持右键打包 apk +![1.4.3](https://storage.deepin.org/thread/202109111635389828_截图_选择区域_20210911163449.png) + #### V1.4.2(2021-08-30,快开学了): **※1、添加adb破解补丁(用于可以让adb连接UEngine)并支持adb的部分操作;** 2、菜单栏的项目添加以及外观优化; diff --git a/build/DEBIAN/control b/build/DEBIAN/control index 87dea6d..326c2a0 100644 --- a/build/DEBIAN/control +++ b/build/DEBIAN/control @@ -1,5 +1,5 @@ Package: spark-uengine-runner -Version: 1.4.2 +Version: 1.4.3 Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com> Homepage: [https://gitee.com/gfdgd-xi/uengine-runner, https://github.com/gfdgd-xi/uengine-runner] Architecture: all diff --git a/build/opt/apps/uengine-runner/information.json b/build/opt/apps/uengine-runner/information.json index 29fd2b9..4cde9f5 100755 --- a/build/opt/apps/uengine-runner/information.json +++ b/build/opt/apps/uengine-runner/information.json @@ -3,7 +3,7 @@ "https://gitee.com/gfdgd-xi/uengine-runner", "https://github.com/gfdgd-xi/uengine-runner" ], - "Version": "1.4.2", + "Version": "1.4.3", "System": "Linux(deepin/UOS)", "Tips": [ "更多可见:https://gitee.com/gfdgd-xi/uengine-runner/wikis", @@ -26,6 +26,13 @@ "4、如果想要使用adb连接UEngine或其他手机,请使用 1.2.0 以前的版本。(如需连接UEngine请安装adb补丁)" ], "Update": [ + "V1.4.3:", + "※1、支持打包器打包的包名带前缀“uengine-dc”", + "※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)", + "※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况", + "4、支持一键使用 Scrcpy 连接 UEngine(①先安装 adb 破解补丁;②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】)", + "5、支持右键打包 apk", + "", "V1.4.2:", "※1、添加adb破解补丁(用于可以让adb连接UEngine)并支持adb的部分操作;", "2、菜单栏的项目添加以及外观优化;", diff --git a/build/opt/apps/uengine-runner/setting.json b/build/opt/apps/uengine-runner/setting.json index eb69668..6d79538 100755 --- a/build/opt/apps/uengine-runner/setting.json +++ b/build/opt/apps/uengine-runner/setting.json @@ -1,7 +1,7 @@ { "Package": "spark-uengine-runner", "Update": true, - "Version": "1.4.2", + "Version": "1.4.3", "Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json" } \ No newline at end of file diff --git a/build/opt/apps/uengine-runner/uengine-apk-builder b/build/opt/apps/uengine-runner/uengine-apk-builder index fbaf1ba..417362b 100755 --- a/build/opt/apps/uengine-runner/uengine-apk-builder +++ b/build/opt/apps/uengine-runner/uengine-apk-builder @@ -187,6 +187,7 @@ def DisabledAndEnbled(choose): userChoose = {True: tk.DISABLED, False: tk.NORMAL} a = userChoose[choose] combobox1.configure(state=a) + check.configure(state=a) button2.configure(state=a) button3.configure(state=a) @@ -256,6 +257,7 @@ def GetApkActivityName(apkFilePath): return line def GetApkPackageName(apkFilePath): + # 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数 info = GetApkInformation(apkFilePath) for line in info.split('\n'): if "package:" in line: @@ -264,7 +266,10 @@ def GetApkPackageName(apkFilePath): line = line.replace("name=", "") line = line.replace("'", "") line = line.replace(" ", "") - return line + # 此较为特殊,因为需要判断用户是否要添加前缀 + if qianZhui.get() == True: + return "uengine-dc-{}".format(line).lower() + return line.lower() def GetApkVersion(apkFilePath): info = GetApkInformation(apkFilePath) @@ -381,7 +386,7 @@ iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) # 加载配置 ########################### if not os.path.exists(get_home() + "/.config/uengine-runner"): # 如果没有配置文件夹 - os.mkdir(get_home() + "/.config/uengine-runner") # 创建配置文件夹 + os.makedirs(get_home() + "/.config/uengine-runner") # 创建配置文件夹 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json"): # 如果没有配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuild.json"): # 如果没有配置文件 @@ -396,34 +401,43 @@ findApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/F # 窗口创建 ########################### win = tk.Tk() + +qianZhui = tk.BooleanVar() + window = ttk.Frame(win) -style = ttkthemes.ThemedStyle(win) -style.set_theme("breeze") -win.attributes('-alpha', 0.5) -win.title(title) -win.resizable(0, 0) -win.iconphoto(False, tk.PhotoImage(file=iconPath)) frame2 = ttk.Frame(window) label1 = ttk.Label(window, text="要打包的 apk 路径:") combobox1 = ttk.Combobox(window, width=100) button2 = ttk.Button(window, text="浏览", command=FindApk) button3 = ttk.Button(frame2, text="打包", command=BuildDeb) +check = ttk.Checkbutton(frame2, variable=qianZhui,text="使用前缀“uengine-dc”") textbox1 = tk.Text(window, width=100) menu = tk.Menu(window, background="white") # 设置菜单栏 programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏 + menu.add_cascade(label="程序", menu=programmenu) programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 # 设置控件 combobox1['value'] = findApkHistory textbox1.configure(state=tk.DISABLED) textbox1.config(foreground='white', background='black') +# 如果有参数 +if len(sys.argv) > 1: + combobox1.set(sys.argv[1]) +# 设置窗口 +style = ttkthemes.ThemedStyle(win) +style.set_theme("breeze") +win.attributes('-alpha', 0.5) +win.title(title) +win.resizable(0, 0) +win.iconphoto(False, tk.PhotoImage(file=iconPath)) # win.config(menu=menu) # 显示菜单栏 label1.grid(row=2, column=0) combobox1.grid(row=2, column=1) -#button1.grid(column=0, row=0) button2.grid(row=2, column=2) -button3.grid(row=0, column=0) +button3.grid(row=0, column=1) +check.grid(row=0, column=0) frame2.grid(row=3, columnspa=3) textbox1.grid(row=4, columnspa=3) window.pack() diff --git a/build/opt/apps/uengine-runner/uengine-runner b/build/opt/apps/uengine-runner/uengine-runner index 4245609..cbc0bb8 100755 --- a/build/opt/apps/uengine-runner/uengine-runner +++ b/build/opt/apps/uengine-runner/uengine-runner @@ -2,8 +2,8 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi<3025613752@qq.com> -# 版本:1.4.0 -# 更新时间:2021年8月26日 +# 版本:1.4.3 +# 更新时间:2021年9月11日(开学了) # 感谢:anbox、deepin 和 UOS # 基于 Python3 的 tkinter 构建 # 更新:actionchen<917981399@qq.com> @@ -99,7 +99,7 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False): try: if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): print("Mkdir") - os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) + os.makedirs("{}/.local/share/applications/uengine/".format(get_home())) print("start install apk") global findApkHistory commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path)) @@ -454,61 +454,19 @@ def UengineRestart()->"重启 uengine 服务": os.system("systemctl restart uengine*") DisabledAndEnbled(False) -# 运行命令的窗口 -class InstallWindow(): - # 显示窗口 - def ShowWindows(command): - global message - global text - global installTipsText - global progressbar - 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) - 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) - +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()->"获取用户桌面目录": @@ -554,7 +512,7 @@ def CleanAllUengineDesktopLink(): if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"): try: shutil.rmtree("{}/.local/share/applications/uengine".format(get_home())) - os.mkdir("{}/.local/share/applications/uengine".format(get_home())) + os.makedirs("{}/.local/share/applications/uengine".format(get_home())) messagebox.showinfo(title="提示", message="删除完毕!") except: traceback.print_exc() @@ -632,6 +590,124 @@ def AdbAndroidInstallAppList(): 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"))) +class AdbChangeUengineDisplaySize(): + def ShowWindows(): + global displayX + global displayY + global displaySize + message = tk.Toplevel() + 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="你输入的数值不正确!") + 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() @@ -749,6 +825,27 @@ class AddNewUengineDesktopLink(): activityName.set(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")) + ########################### # 程序信息 ########################### @@ -776,33 +873,16 @@ iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) desktop = programPath + "/UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop" contribute = "\n".join(information["Contribute"]) -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")) - +useProgram = "" +threading.Thread(target=UseProgram).start() ########################### # 加载配置 ########################### if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): - os.mkdir("{}/.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.mkdir(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"): # 如果没有配置文件 @@ -885,6 +965,9 @@ def showhelp(): def ChgAbout(): HelpStr.set(about) def ChgDep(): + if useProgram == "": + BtnZujian.configure(state=tk.DISABLED) + return HelpStr.set(useProgram) def ChgCon(): HelpStr.set(contribute) @@ -987,9 +1070,11 @@ adb.add_separator() adb.add_cascade(label="adb 服务", menu=adbServer) adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow) adb.add_separator() +adb.add_command(label="adb 修改 UEngine 分辨率", command=AdbChangeUengineDisplaySize.ShowWindows) adb.add_command(label="adb 查看 UEngine 应用列表", command=AdbAndroidInstallAppList) adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer) adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer) +adb.add_command(label="使用 Scrcpy 连接 UEngine(只支持使用snap安装的Scrcpy)", command=ScrcpyConnectUengine) adb.add_separator() adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) diff --git a/build/opt/apps/uengine-runner/uengine-runner-about b/build/opt/apps/uengine-runner/uengine-runner-about index c4330e7..440f333 100755 --- a/build/opt/apps/uengine-runner/uengine-runner-about +++ b/build/opt/apps/uengine-runner/uengine-runner-about @@ -2,8 +2,8 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi -# 版本:1.4.2 -# 更新时间:2021年8月30日 +# 版本:1.4.3 +# 更新时间:2021年9月11日 # 感谢:anbox、deepin 和 统信 # 基于 Python3 的 tkinter 构建 ########################################################################################### @@ -11,6 +11,7 @@ # 引入所需的库 ################# import os +import threading import time import json import ttkthemes @@ -52,7 +53,16 @@ iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop" contribute = "\n".join(information["Contribute"]) -useProgram = '''1、UEngine:{} +useProgram = "" +threading.Thread(target=useProgram).start() + +# add sub window +#添加窗口开启关闭开关,防止重复开启 +windowflag = "close" + +def UseProgram(): + global useProgram + useProgram = '''1、UEngine:{} 2、python3:{} 3、tkinter:{} 4、aapt:{} @@ -71,10 +81,6 @@ useProgram = '''1、UEngine:{} subprocess.getoutput("adb version"), subprocess.getoutput("deepin-terminal -v")) -# add sub window -#添加窗口开启关闭开关,防止重复开启 -windowflag = "close" - def showhelp(): #define window and frame and button label @@ -127,6 +133,9 @@ def showhelp(): def ChgAbout(): HelpStr.set(about) def ChgDep(): + if useProgram == "": + BtnZujian.configure(state=tk.DISABLED) + return HelpStr.set(useProgram) def ChgCon(): HelpStr.set(contribute) diff --git a/build/usr/share/applications/spark-uengine-apk-build.desktop b/build/usr/share/applications/spark-uengine-apk-build.desktop new file mode 100755 index 0000000..4681581 --- /dev/null +++ b/build/usr/share/applications/spark-uengine-apk-build.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Categories=System; +Terminal=false +Exec=/usr/bin/uengine-apk-builder %F +Icon=/opt/apps/uengine-runner/icon.png +Name=Build Apk To Deb(UEngine Runner) +Comment=Build Apk To Deb(UEngine Runner) +Comment[zh]=打包 deb(UEngine 运行器) +Name[zh]=打包 deb(UEngine 运行器) +StartupNotify=true +Hidden=false +NoDisplay=true +MimeType=application/vnd.android.package-archive \ No newline at end of file diff --git a/build/usr/share/applications/uengine-apk-builder.desktop b/build/usr/share/applications/uengine-apk-builder.desktop new file mode 100755 index 0000000..662a41c --- /dev/null +++ b/build/usr/share/applications/uengine-apk-builder.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Categories=System; +Terminal=false +Exec=/usr/bin/uengine-apk-builder %F +Icon=/opt/apps/uengine-runner/icon.png +Name=uengine Apk Builder +Comment=UEngine Apk Builder +Comment[zh]=UEngine 应用打包器 +Name[zh]=UEngine 应用打包器 +StartupNotify=true \ No newline at end of file diff --git a/build/usr/share/polkit-1/actions/com.deepin.pkexec.installscrcpy.policy b/build/usr/share/polkit-1/actions/com.deepin.pkexec.installscrcpy.policy new file mode 100644 index 0000000..c8abc1b --- /dev/null +++ b/build/usr/share/polkit-1/actions/com.deepin.pkexec.installscrcpy.policy @@ -0,0 +1,21 @@ + + + + gfdgd xi + https://gitee.com/gfdgd-xi/uengine-runner/ + + Authentication is required to Install Scrcpy + 安装 Scrcpy 需要输入密码 + preferences-system + + no + no + auth_admin_keep + + /tmp/uengine-runner/InstallScrcpy.sh + true + + + \ No newline at end of file diff --git a/com.gitee.uengine.runner.spark.deb b/com.gitee.uengine.runner.spark.deb index 1a808d1..806036c 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 6bad552..4cde9f5 100755 --- a/information.json +++ b/information.json @@ -26,6 +26,13 @@ "4、如果想要使用adb连接UEngine或其他手机,请使用 1.2.0 以前的版本。(如需连接UEngine请安装adb补丁)" ], "Update": [ + "V1.4.3:", + "※1、支持打包器打包的包名带前缀“uengine-dc”", + "※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)", + "※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况", + "4、支持一键使用 Scrcpy 连接 UEngine(①先安装 adb 破解补丁;②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】)", + "5、支持右键打包 apk", + "", "V1.4.2:", "※1、添加adb破解补丁(用于可以让adb连接UEngine)并支持adb的部分操作;", "2、菜单栏的项目添加以及外观优化;", diff --git a/new-deb-build/DEBIAN/control b/new-deb-build/DEBIAN/control index 9b4a50d..37aa5e1 100644 --- a/new-deb-build/DEBIAN/control +++ b/new-deb-build/DEBIAN/control @@ -1,6 +1,6 @@ Package: com.gitee.uengine.runner.spark Source: com.gitee.uengine.runner.spark -Version: 1.4.2 +Version: 1.4.3 Architecture: all Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com> Depends: deepin-elf-verify (>= 0.0.16.7-1), python3, python3-tk, python3-pip, aapt, adb, python3-pil, python3-setuptools, uengine, deepin-terminal diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/entries/applications/spark-uengine-apk-build.desktop b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/entries/applications/spark-uengine-apk-build.desktop new file mode 100755 index 0000000..3477368 --- /dev/null +++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/entries/applications/spark-uengine-apk-build.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Categories=System; +Terminal=false +Exec=/usr/bin/uengine-apk-builder %F +Icon=/opt/apps/com.gitee.uengine.runner.spark/files/icon.png +Name=Build Apk To Deb(UEngine Runner) +Comment=Build Apk To Deb(UEngine Runner) +Comment[zh]=打包 deb(UEngine 运行器) +Name[zh]=打包 deb(UEngine 运行器) +StartupNotify=true +Hidden=false +NoDisplay=true +MimeType=application/vnd.android.package-archive \ No newline at end of file diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/entries/applications/uengine-apk-builder.desktop b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/entries/applications/uengine-apk-builder.desktop new file mode 100755 index 0000000..3a0536d --- /dev/null +++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/entries/applications/uengine-apk-builder.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Categories=System; +Terminal=false +Exec=/usr/bin/uengine-apk-builder %F +Icon=/opt/apps/com.gitee.uengine.runner.spark/files/icon.png +Name=uengine Apk Builder +Comment=UEngine Apk Builder +Comment[zh]=UEngine 应用打包器 +Name[zh]=UEngine 应用打包器 +StartupNotify=true \ No newline at end of file diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/information.json b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/information.json index 29fd2b9..4cde9f5 100755 --- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/information.json +++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/information.json @@ -3,7 +3,7 @@ "https://gitee.com/gfdgd-xi/uengine-runner", "https://github.com/gfdgd-xi/uengine-runner" ], - "Version": "1.4.2", + "Version": "1.4.3", "System": "Linux(deepin/UOS)", "Tips": [ "更多可见:https://gitee.com/gfdgd-xi/uengine-runner/wikis", @@ -26,6 +26,13 @@ "4、如果想要使用adb连接UEngine或其他手机,请使用 1.2.0 以前的版本。(如需连接UEngine请安装adb补丁)" ], "Update": [ + "V1.4.3:", + "※1、支持打包器打包的包名带前缀“uengine-dc”", + "※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)", + "※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况", + "4、支持一键使用 Scrcpy 连接 UEngine(①先安装 adb 破解补丁;②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】)", + "5、支持右键打包 apk", + "", "V1.4.2:", "※1、添加adb破解补丁(用于可以让adb连接UEngine)并支持adb的部分操作;", "2、菜单栏的项目添加以及外观优化;", 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 4245609..0000000 --- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/main.py +++ /dev/null @@ -1,1091 +0,0 @@ -#!/usr/bin/env python3 -# 使用系统默认的 python3 运行 -########################################################################################### -# 作者:gfdgd xi<3025613752@qq.com> -# 版本:1.4.0 -# 更新时间:2021年8月26日 -# 感谢:anbox、deepin 和 UOS -# 基于 Python3 的 tkinter 构建 -# 更新:actionchen<917981399@qq.com> -########################################################################################### -################# -# 引入所需的库 -################# -import os -import sys -import time -import json -import shutil -import zipfile -import traceback -import threading -import ttkthemes -import webbrowser -import subprocess -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 - - -# 卸载程序 -def UninstallProgram(package: "apk 包名")->"卸载程序": - try: - global fineUninstallApkHistory - Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package)) - if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)): - os.remove("{}/.local/share/applications/{}.desktop".format(get_home(), package)) - if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)): - os.remove("{}/{}.desktop".format(get_desktop_path(), package)) - fineUninstallApkHistory.append(ComboUninstallPath.get()) - ComboUninstallPath['value'] = fineUninstallApkHistory - write_txt(get_home() + "/.config/uengine-runner/FindUninstallApkHistory.json", str(json.dumps(ListToDictionary(fineUninstallApkHistory)))) # 将历史记录的数组转换为字典并写入 - return Return - except: - traceback.print_exc() - messagebox.showerror(title="错误", message=traceback.format_exc()) - -# 卸载文本框的浏览按钮事件 -def BtnFindUninstallApkClk(): - path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindUninstallApk.json"))["path"]) - if path != "" and path != "()": - try: - ComboUninstallPath.set(path) - write_txt(get_home() + "/.config/uengine-runner/FindUninstallApk.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件 - except: - pass - -# 卸载按钮事件 -def ButtonClick8(): - if ComboUninstallPath.get() is "": - messagebox.showerror(title="提示", message="信息没有填写完整,无法继续卸载 APK") - return - DisabledAndEnbled(True) - if os.path.exists(ComboUninstallPath.get()): - path = GetApkPackageName(ComboUninstallPath.get()) - else: - path = ComboUninstallPath.get() - UninstallProgram(path) - messagebox.showinfo(message="操作执行完毕!", title="提示") - DisabledAndEnbled(False) - -# 浏览窗口 -# temp strs -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 "": - messagebox.showerror(title="提示", message="信息没有填写完整,无法继续安装 APK") - return - DisabledAndEnbled(True) - threading.Thread(target=InstallApk, args=(ComboInstallPath.get(),)).start() - -# 安装应用 -def InstallApk(path: "apk 路径", quit: "是否静默安装" = False): - try: - if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): - print("Mkdir") - os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) - print("start install apk") - global findApkHistory - commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path)) - print(commandReturn) - 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) - 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))) - 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) - -# 需引入 subprocess -# 运行系统命令并获取返回值 -def GetCommandReturn(cmd: "命令")->"运行系统命令并获取返回值": - # cmd 是要获取输出的命令 - return subprocess.getoutput(cmd) - -# 打开所有窗口事件 -def Button5Click(): - threading.Thread(target=OpenUengineProgramList).start() - -# 打开“uengine 所有程序列表” -def OpenUengineProgramList()->"打开“uengine 所有程序列表”": - os.system("/usr/bin/uengine-launch.sh --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity") - -# 显示“关于这个程序”窗口 -def about_this_program()->"显示“关于这个程序”窗口": - global about - global title - global iconPath - mess = tk.Toplevel() - message = ttk.Frame(mess) - mess.resizable(0, 0) - mess.title("关于 {}".format(title)) - #mess.iconphoto(False, tk.PhotoImage(file=iconPath)) - img = ImageTk.PhotoImage(Image.open(iconPath)) - LabApkPath = ttk.Label(message, image=img) - label2 = ttk.Label(message, text=about) - button1 = ttk.Button(message, text="确定", command=mess.withdraw) - LabApkPath.pack() - label2.pack() - button1.pack(side="bottom") - message.pack() - mess.mainloop() - -# 显示“提示”窗口 -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('~') - -# 发送“启动 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 - -# 生成 uengine 启动文件到桌面 -def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面": - things = '''[Desktop Entry] -Categories=app; -Encoding=UTF-8 -Exec=/usr/bin/uengine-launch.sh --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: - 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) - else: - zip = zipfile.ZipFile(apkFilePath) - iconData = zip.read(xmlpath) - with open(iconSavePath, 'w+b') as saveIconFile: - saveIconFile.write(iconData) - 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="你没有选择 apk 文件") - 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="本程序不支持保存该 apk 的图标") - 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) - -# 运行命令的窗口 -class InstallWindow(): - # 显示窗口 - def ShowWindows(command): - global message - global text - global installTipsText - global progressbar - 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) - 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) - - -# 获取用户桌面目录 -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="路径不存在,请重试!") - 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 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.mkdir("{}/.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.sh --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="完成!") - -# 使用 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 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"))) - -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() - - 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(): - if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())): - if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"): - return - 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="创建完毕!") - - # 删除快捷方式 - def DelDesktopLink(): - 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()) - - # 保存历史记录 - 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.sh --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(GetApkActivityName(path)) - write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件 - -########################### -# 程序信息 -########################### -programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string -information = json.loads(readtxt(programPath + "/information.json")) -programUrl = information["Url"][0] -version = information["Version"] -goodRunSystem = information["System"] -aaptVersion = GetCommandReturn("aapt version") -about = '''介绍 :一个基于 Python3 的 tkinter 制作的 UEngine 运行器,在新版本Deepin/UOS发布后,可以在应用商店安装部分官方已适配的安卓应用,对爱好者来说,不能自己安装APK软件包始终差点意思,本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包,并能发送安装的APK包启动菜单到桌面或系统菜单。 - -版本 :{} - -适用平台 :{} - -程序官网 :{} - -©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, time.strftime("%Y")) -tips = "\n".join(information["Tips"]) -updateThingsString = "\n".join(information["Update"]) -title = "UEngine 运行器 {}".format(version) -updateTime = information["Time"] -updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) -iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) -desktop = programPath + "/UengineAndroidProgramList.desktop" -desktopName = "UengineAndroidProgramList.desktop" -contribute = "\n".join(information["Contribute"]) -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")) - - -########################### -# 加载配置 -########################### -if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): - os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) -if not os.path.exists(get_home() + "/.config/uengine-runner"): # 如果没有配置文件夹 - os.mkdir(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": "~"})) # 写入(创建)一个配置文件 - -########################### -# 设置变量 -########################### -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(): - HelpStr.set(useProgram) - def ChgCon(): - HelpStr.set(contribute) - def ChgTips(): - HelpStr.set(tips) - LabText.config(wraplength=350) - - 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) - - - #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) - - -########################### -# 窗口创建 -########################### -win = tk.Tk() # 创建窗口 - -# 设置窗口 -style = ttkthemes.ThemedStyle(win) -style.set_theme("breeze") -window = ttk.Frame(win) -win.attributes('-alpha', 0.5) -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="安装APK:") -LabUninstallPath = ttk.Label(window, text="卸载APK:") -ComboInstallPath = ttk.Combobox(window, width=50) -ComboUninstallPath = ttk.Combobox(window, width=50) -BtnFindApk = ttk.Button(FrmInstall, text="浏览", command=FindApk) -BtnInstall = ttk.Button(FrmInstall, text="安装", command=Button3Install) -BtnShowUengineApp = ttk.Button(window, text="打开 UEngine 应用列表", command=Button5Click) -BtnUninstallApkBrowser = ttk.Button(FrmUninstall, text="浏览", command=BtnFindUninstallApkClk) -BtnUninstall = ttk.Button(FrmUninstall, text="卸载", command=ButtonClick8) -Btngeticon = ttk.Button(FrmInstall, text="保存图标", command=SaveIconToOtherPath) -BtnSaveApk = ttk.Button(FrmInstall, text="保存apk", command=SaveInstallUengineApp) -# 设置菜单栏 -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") - -menu.add_cascade(label="程序", menu=programmenu) -menu.add_cascade(label="adb", menu=adb) -menu.add_cascade(label="UEngine", menu=uengine) -menu.add_cascade(label="关于", menu=help) - -programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory) -programmenu.add_separator() # 设置分界线 -programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序” - -adb.add_command(label="adb 连接 UEngine", command=UengineConnectAdb) -adb.add_separator() -adb.add_cascade(label="adb 服务", menu=adbServer) -adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow) -adb.add_separator() -adb.add_command(label="adb 查看 UEngine 应用列表", command=AdbAndroidInstallAppList) -adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer) -adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer) -adb.add_separator() -adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) - -adbServer.add_command(label="开启 adb 服务", command=AdbStartServer) -adbServer.add_command(label="关闭 adb 服务", command=AdbStopServer) -adbServer.add_command(label="杀死 adb 进程", command=AdbKillAdbProgress) - -uengine.add_command(label="UEngine 系统设置", command=UengineSettingShow) -uengine.add_command(label="UEngine 应用打包", command=OpenUengineDebBuilder) -#uengine.add_command(label="UEngine 键盘映射", command=KeyboardToMouse) -uengine.add_cascade(label="UEngine 服务", menu=uengineService) -uengine.add_cascade(label="UEngine 网络桥接", menu=uengineInternet) -uengine.add_cascade(label="UEngine 快捷方式", menu=uengineIcon) -uengine.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) -uengine.add_cascade(label="UEngine 数据", menu=uengineData) - -help.add_command(label="程序官网", command=OpenProgramURL) # 设置“程序官网”项 -help.add_command(label="帮助", command=showhelp) # 设置“关于这个程序”项 - -uengineService.add_command(label="启用 UEngine 服务(需要 root)", command=StartUengine) -uengineService.add_command(label="关闭 UEngine 服务(需要 root)", command=StopUengine) -uengineService.add_command(label="重启 UEngine 服务(需要 root)", command=UengineRestart) - -uengineInternet.add_command(label="启用 UEngine 网络桥接(需要 root)", command=UengineBridgeStart) -uengineInternet.add_command(label="关闭 UEngine 网络桥接(需要 root)", command=UengineBridgeStop) -uengineInternet.add_command(label="重启 UEngine 网络桥接(需要 root)", command=UengineBridgeRestart) -uengineInternet.add_command(label="加载 UEngine 网络桥接(需要 root)", command=UengineBridgeReload) -uengineInternet.add_command(label="强制加载 UEngine 网络桥接(需要 root)", command=UengineBridgeForceReload) - -uengineIcon.add_command(label="发送 UEngine 应用列表到桌面", command=SendUengineAndroidListForDesktop) -uengineIcon.add_command(label="发送 UEngine 应用列表到启动器", command=SendUengineAndroidListForLauncher) -uengineIcon.add_separator() -uengineIcon.add_command(label="添加/删除指定的 UEngine 快捷方式", command=AddNewUengineDesktopLink.ShowWindow) -uengineIcon.add_separator() -uengineIcon.add_command(label="清空所有 UEngine 快捷方式", command=CleanAllUengineDesktopLink) - -uengineUseAdb.add_command(label="adb 连接 UEngine", command=UengineConnectAdb) -uengineUseAdb.add_separator() -uengineUseAdb.add_command(label="允许此设备使用 adb 连接本 UEngine(需要 root)", command=UengineUseAdb) -uengineUseAdb.add_command(label="禁止任何设备使用 adb 连接本 UEngine(需要 root)", command=UengineDoNotUseAdb) - -uengineData.add_command(label="打开 UEngine 根目录", command=OpenUengineRootData) -uengineData.add_command(label="打开 UEngine 用户数据目录", command=OpenUengineUserData) -uengineData.add_separator() -uengineData.add_command(label="清空 UEngine 数据(需要 root)", command=BackUengineClean) - -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") - -# 设置控件 -ComboUninstallPath['value'] = fineUninstallApkHistory -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]) - 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=1, column=0,sticky= tk.W,padx=3) -ComboInstallPath.grid(row=2, column=0,padx=3) - - -FrmInstall.grid(row=2, column=1,padx=3, rowspan=2) -BtnFindApk.grid(row=0, column=0) -BtnInstall.grid(row=0, column=1) - -LabUninstallPath.grid(row=4, column=0,sticky= tk.W,padx=3) -ComboUninstallPath.grid(row=5, column=0,padx=3) - -FrmUninstall.grid(row=5, column=1,padx=3) -BtnUninstallApkBrowser.grid(row=0, column=0) -BtnUninstall.grid(row=0, column=1) - -BtnShowUengineApp.grid(row=6, column=0,sticky= tk.W,padx=3,pady=2) - -Btngeticon.grid(row=1, column=0,sticky= tk.W,padx=3,pady=2) -BtnSaveApk.grid(row=1, column=1,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/setting.json b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/setting.json index 947fc53..df22307 100755 --- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/setting.json +++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/setting.json @@ -1,6 +1,6 @@ { "Package": "com.gitee.uengine.runner.spark", "Update": true, - "Version": "1.4.2", + "Version": "1.4.3", "Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json" } \ No newline at end of file diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-apk-builder b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-apk-builder index fbaf1ba..417362b 100755 --- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-apk-builder +++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-apk-builder @@ -187,6 +187,7 @@ def DisabledAndEnbled(choose): userChoose = {True: tk.DISABLED, False: tk.NORMAL} a = userChoose[choose] combobox1.configure(state=a) + check.configure(state=a) button2.configure(state=a) button3.configure(state=a) @@ -256,6 +257,7 @@ def GetApkActivityName(apkFilePath): return line def GetApkPackageName(apkFilePath): + # 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数 info = GetApkInformation(apkFilePath) for line in info.split('\n'): if "package:" in line: @@ -264,7 +266,10 @@ def GetApkPackageName(apkFilePath): line = line.replace("name=", "") line = line.replace("'", "") line = line.replace(" ", "") - return line + # 此较为特殊,因为需要判断用户是否要添加前缀 + if qianZhui.get() == True: + return "uengine-dc-{}".format(line).lower() + return line.lower() def GetApkVersion(apkFilePath): info = GetApkInformation(apkFilePath) @@ -381,7 +386,7 @@ iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) # 加载配置 ########################### if not os.path.exists(get_home() + "/.config/uengine-runner"): # 如果没有配置文件夹 - os.mkdir(get_home() + "/.config/uengine-runner") # 创建配置文件夹 + os.makedirs(get_home() + "/.config/uengine-runner") # 创建配置文件夹 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json"): # 如果没有配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuild.json"): # 如果没有配置文件 @@ -396,34 +401,43 @@ findApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/F # 窗口创建 ########################### win = tk.Tk() + +qianZhui = tk.BooleanVar() + window = ttk.Frame(win) -style = ttkthemes.ThemedStyle(win) -style.set_theme("breeze") -win.attributes('-alpha', 0.5) -win.title(title) -win.resizable(0, 0) -win.iconphoto(False, tk.PhotoImage(file=iconPath)) frame2 = ttk.Frame(window) label1 = ttk.Label(window, text="要打包的 apk 路径:") combobox1 = ttk.Combobox(window, width=100) button2 = ttk.Button(window, text="浏览", command=FindApk) button3 = ttk.Button(frame2, text="打包", command=BuildDeb) +check = ttk.Checkbutton(frame2, variable=qianZhui,text="使用前缀“uengine-dc”") textbox1 = tk.Text(window, width=100) menu = tk.Menu(window, background="white") # 设置菜单栏 programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏 + menu.add_cascade(label="程序", menu=programmenu) programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 # 设置控件 combobox1['value'] = findApkHistory textbox1.configure(state=tk.DISABLED) textbox1.config(foreground='white', background='black') +# 如果有参数 +if len(sys.argv) > 1: + combobox1.set(sys.argv[1]) +# 设置窗口 +style = ttkthemes.ThemedStyle(win) +style.set_theme("breeze") +win.attributes('-alpha', 0.5) +win.title(title) +win.resizable(0, 0) +win.iconphoto(False, tk.PhotoImage(file=iconPath)) # win.config(menu=menu) # 显示菜单栏 label1.grid(row=2, column=0) combobox1.grid(row=2, column=1) -#button1.grid(column=0, row=0) button2.grid(row=2, column=2) -button3.grid(row=0, column=0) +button3.grid(row=0, column=1) +check.grid(row=0, column=0) frame2.grid(row=3, columnspa=3) textbox1.grid(row=4, columnspa=3) window.pack() 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 5f490f5..cbc0bb8 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.4.0 -# 更新时间:2021年8月26日 +# 版本:1.4.3 +# 更新时间:2021年9月11日(开学了) # 感谢:anbox、deepin 和 UOS # 基于 Python3 的 tkinter 构建 # 更新:actionchen<917981399@qq.com> @@ -11,7 +11,6 @@ ################# # 引入所需的库 ################# -from genericpath import exists import os import sys import time @@ -29,7 +28,7 @@ import tkinter.messagebox as messagebox import tkinter.filedialog as filedialog import tkinter.simpledialog as simpledialog from getxmlimg import getsavexml -from tkinter.constants import TOP + # 卸载程序 def UninstallProgram(package: "apk 包名")->"卸载程序": @@ -100,7 +99,7 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False): try: if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): print("Mkdir") - os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) + os.makedirs("{}/.local/share/applications/uengine/".format(get_home())) print("start install apk") global findApkHistory commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path)) @@ -455,61 +454,19 @@ def UengineRestart()->"重启 uengine 服务": os.system("systemctl restart uengine*") DisabledAndEnbled(False) -# 运行命令的窗口 -class InstallWindow(): - # 显示窗口 - def ShowWindows(command): - global message - global text - global installTipsText - global progressbar - 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) - 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) - +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()->"获取用户桌面目录": @@ -552,10 +509,10 @@ def get_home()->"获取用户主目录": # 删除所有的 uengine 应用快捷方式 def CleanAllUengineDesktopLink(): - if messagebox.askokcancel(title="提示", message="你确定要删除所有的 uengine 应用快捷方式吗?"): + if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"): try: shutil.rmtree("{}/.local/share/applications/uengine".format(get_home())) - os.mkdir("{}/.local/share/applications/uengine".format(get_home())) + os.makedirs("{}/.local/share/applications/uengine".format(get_home())) messagebox.showinfo(title="提示", message="删除完毕!") except: traceback.print_exc() @@ -573,6 +530,202 @@ def OpenUengineRootData(): 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.sh --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="完成!") + +# 使用 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 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"))) + +class AdbChangeUengineDisplaySize(): + def ShowWindows(): + global displayX + global displayY + global displaySize + message = tk.Toplevel() + 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="你输入的数值不正确!") + 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 @@ -591,8 +744,9 @@ class AddNewUengineDesktopLink(): saveButton = ttk.Button(controlFrame, text="写入", command=AddNewUengineDesktopLink.SaveDesktopLink) delButton = ttk.Button(controlFrame, text="删除", command=AddNewUengineDesktopLink.DelDesktopLink) - message.title("添加/删除 uengine 图标") + 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() @@ -636,7 +790,7 @@ class AddNewUengineDesktopLink(): def DelDesktopLink(): global packageName if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())): - messagebox.showerror(title="错误", message="此包名对应的uengine桌面快捷方式不存在!") + messagebox.showerror(title="错误", message="此包名对应的 UEngine 桌面快捷方式不存在!") return if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"): return @@ -671,6 +825,27 @@ class AddNewUengineDesktopLink(): activityName.set(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")) + ########################### # 程序信息 ########################### @@ -680,38 +855,34 @@ programUrl = information["Url"][0] version = information["Version"] goodRunSystem = information["System"] aaptVersion = GetCommandReturn("aapt version") -about = ''' 一个基于 Python3 的 tkinter 制作的 uengine APK 运行器 +about = '''介绍 :一个基于 Python3 的 tkinter 制作的 UEngine 运行器,在新版本Deepin/UOS发布后,可以在应用商店安装部分官方已适配的安卓应用,对爱好者来说,不能自己安装APK软件包始终差点意思,本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包,并能发送安装的APK包启动菜单到桌面或系统菜单。 版本 :{} 适用平台 :{} -tkinter版本:{} - -aapt 版本 :{} - 程序官网 :{} -©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, aaptVersion,programUrl, time.strftime("%Y")) +©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, time.strftime("%Y")) tips = "\n".join(information["Tips"]) updateThingsString = "\n".join(information["Update"]) -title = "uengine 运行器 {}".format(version) +title = "UEngine 运行器 {}".format(version) updateTime = information["Time"] updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) desktop = programPath + "/UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop" contribute = "\n".join(information["Contribute"]) -useProgram = "\n".join(information["Use"]) - +useProgram = "" +threading.Thread(target=UseProgram).start() ########################### # 加载配置 ########################### if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): - os.mkdir("{}/.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.mkdir(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"): # 如果没有配置文件 @@ -752,7 +923,7 @@ def showhelp(): 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() @@ -794,6 +965,9 @@ def showhelp(): def ChgAbout(): HelpStr.set(about) def ChgDep(): + if useProgram == "": + BtnZujian.configure(state=tk.DISABLED) + return HelpStr.set(useProgram) def ChgCon(): HelpStr.set(contribute) @@ -861,7 +1035,7 @@ ComboInstallPath = ttk.Combobox(window, width=50) ComboUninstallPath = ttk.Combobox(window, width=50) BtnFindApk = ttk.Button(FrmInstall, text="浏览", command=FindApk) BtnInstall = ttk.Button(FrmInstall, text="安装", command=Button3Install) -BtnShowUengineApp = ttk.Button(window, text="打开 uengine 应用列表", command=Button5Click) +BtnShowUengineApp = ttk.Button(window, text="打开 UEngine 应用列表", command=Button5Click) BtnUninstallApkBrowser = ttk.Button(FrmUninstall, text="浏览", command=BtnFindUninstallApkClk) BtnUninstall = ttk.Button(FrmUninstall, text="卸载", command=ButtonClick8) Btngeticon = ttk.Button(FrmInstall, text="保存图标", command=SaveIconToOtherPath) @@ -870,61 +1044,93 @@ BtnSaveApk = ttk.Button(FrmInstall, text="保存apk", command=SaveInstallUengine 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") # 设置“帮助”菜单栏 -uengineService = tk.Menu(uengine) -uengineInternet = tk.Menu(uengine) -uengineIcon = tk.Menu(uengine) -uengineData = tk.Menu(uengine) +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") menu.add_cascade(label="程序", menu=programmenu) -menu.add_cascade(label="uengine", menu=uengine) +menu.add_cascade(label="adb", menu=adb) +menu.add_cascade(label="UEngine", menu=uengine) menu.add_cascade(label="关于", menu=help) programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory) programmenu.add_separator() # 设置分界线 programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序” -uengine.add_command(label="uengine 应用打包", command=OpenUengineDebBuilder) -uengine.add_command(label="uengine 键盘映射", command=KeyboardToMouse) -uengine.add_cascade(label="uengine 服务", menu=uengineService) -uengine.add_cascade(label="uengine 网络桥接", menu=uengineInternet) -uengine.add_cascade(label="uengine 快捷方式", menu=uengineIcon) -uengine.add_cascade(label="uengine 数据", menu=uengineData) +adb.add_command(label="adb 连接 UEngine", command=UengineConnectAdb) +adb.add_separator() +adb.add_cascade(label="adb 服务", menu=adbServer) +adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow) +adb.add_separator() +adb.add_command(label="adb 修改 UEngine 分辨率", command=AdbChangeUengineDisplaySize.ShowWindows) +adb.add_command(label="adb 查看 UEngine 应用列表", command=AdbAndroidInstallAppList) +adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer) +adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer) +adb.add_command(label="使用 Scrcpy 连接 UEngine(只支持使用snap安装的Scrcpy)", command=ScrcpyConnectUengine) +adb.add_separator() +adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) + +adbServer.add_command(label="开启 adb 服务", command=AdbStartServer) +adbServer.add_command(label="关闭 adb 服务", command=AdbStopServer) +adbServer.add_command(label="杀死 adb 进程", command=AdbKillAdbProgress) + +uengine.add_command(label="UEngine 系统设置", command=UengineSettingShow) +uengine.add_command(label="UEngine 应用打包", command=OpenUengineDebBuilder) +#uengine.add_command(label="UEngine 键盘映射", command=KeyboardToMouse) +uengine.add_cascade(label="UEngine 服务", menu=uengineService) +uengine.add_cascade(label="UEngine 网络桥接", menu=uengineInternet) +uengine.add_cascade(label="UEngine 快捷方式", menu=uengineIcon) +uengine.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) +uengine.add_cascade(label="UEngine 数据", menu=uengineData) help.add_command(label="程序官网", command=OpenProgramURL) # 设置“程序官网”项 help.add_command(label="帮助", command=showhelp) # 设置“关于这个程序”项 -uengineService.add_command(label="启用 uengine 服务", command=StartUengine) -uengineService.add_command(label="关闭 uengine 服务", command=StopUengine) -uengineService.add_command(label="重启 uengine 服务", command=UengineRestart) +uengineService.add_command(label="启用 UEngine 服务(需要 root)", command=StartUengine) +uengineService.add_command(label="关闭 UEngine 服务(需要 root)", command=StopUengine) +uengineService.add_command(label="重启 UEngine 服务(需要 root)", command=UengineRestart) -uengineInternet.add_command(label="启用 uengine 网络桥接", command=UengineBridgeStart) -uengineInternet.add_command(label="关闭 uengine 网络桥接", command=UengineBridgeStop) -uengineInternet.add_command(label="重启 uengine 网络桥接", command=UengineBridgeRestart) -uengineInternet.add_command(label="加载 uengine 网络桥接", command=UengineBridgeReload) -uengineInternet.add_command(label="强制加载 uengine 网络桥接", command=UengineBridgeForceReload) +uengineInternet.add_command(label="启用 UEngine 网络桥接(需要 root)", command=UengineBridgeStart) +uengineInternet.add_command(label="关闭 UEngine 网络桥接(需要 root)", command=UengineBridgeStop) +uengineInternet.add_command(label="重启 UEngine 网络桥接(需要 root)", command=UengineBridgeRestart) +uengineInternet.add_command(label="加载 UEngine 网络桥接(需要 root)", command=UengineBridgeReload) +uengineInternet.add_command(label="强制加载 UEngine 网络桥接(需要 root)", command=UengineBridgeForceReload) -uengineIcon.add_command(label="发送 uengine 应用列表到桌面", command=SendUengineAndroidListForDesktop) -uengineIcon.add_command(label="发送 uengine 应用列表到启动器", command=SendUengineAndroidListForLauncher) +uengineIcon.add_command(label="发送 UEngine 应用列表到桌面", command=SendUengineAndroidListForDesktop) +uengineIcon.add_command(label="发送 UEngine 应用列表到启动器", command=SendUengineAndroidListForLauncher) uengineIcon.add_separator() -uengineIcon.add_command(label="添加/删除指定的 uengine 快捷方式", command=AddNewUengineDesktopLink.ShowWindow) +uengineIcon.add_command(label="添加/删除指定的 UEngine 快捷方式", command=AddNewUengineDesktopLink.ShowWindow) uengineIcon.add_separator() -uengineIcon.add_command(label="清空所有 uengine 快捷方式", command=CleanAllUengineDesktopLink) +uengineIcon.add_command(label="清空所有 UEngine 快捷方式", command=CleanAllUengineDesktopLink) -uengineData.add_command(label="打开 uengine 根目录", command=OpenUengineRootData) -uengineData.add_command(label="打开 uengine 用户数据目录", command=OpenUengineUserData) +uengineUseAdb.add_command(label="adb 连接 UEngine", command=UengineConnectAdb) +uengineUseAdb.add_separator() +uengineUseAdb.add_command(label="允许此设备使用 adb 连接本 UEngine(需要 root)", command=UengineUseAdb) +uengineUseAdb.add_command(label="禁止任何设备使用 adb 连接本 UEngine(需要 root)", command=UengineDoNotUseAdb) + +uengineData.add_command(label="打开 UEngine 根目录", command=OpenUengineRootData) +uengineData.add_command(label="打开 UEngine 用户数据目录", command=OpenUengineUserData) uengineData.add_separator() -uengineData.add_command(label="清空 uengine 数据", command=BackUengineClean) +uengineData.add_command(label="清空 UEngine 数据(需要 root)", command=BackUengineClean) 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") # 设置控件 ComboUninstallPath['value'] = fineUninstallApkHistory diff --git a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-about b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-about index c4330e7..440f333 100755 --- a/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-about +++ b/new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-about @@ -2,8 +2,8 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi -# 版本:1.4.2 -# 更新时间:2021年8月30日 +# 版本:1.4.3 +# 更新时间:2021年9月11日 # 感谢:anbox、deepin 和 统信 # 基于 Python3 的 tkinter 构建 ########################################################################################### @@ -11,6 +11,7 @@ # 引入所需的库 ################# import os +import threading import time import json import ttkthemes @@ -52,7 +53,16 @@ iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop" contribute = "\n".join(information["Contribute"]) -useProgram = '''1、UEngine:{} +useProgram = "" +threading.Thread(target=useProgram).start() + +# add sub window +#添加窗口开启关闭开关,防止重复开启 +windowflag = "close" + +def UseProgram(): + global useProgram + useProgram = '''1、UEngine:{} 2、python3:{} 3、tkinter:{} 4、aapt:{} @@ -71,10 +81,6 @@ useProgram = '''1、UEngine:{} subprocess.getoutput("adb version"), subprocess.getoutput("deepin-terminal -v")) -# add sub window -#添加窗口开启关闭开关,防止重复开启 -windowflag = "close" - def showhelp(): #define window and frame and button label @@ -127,6 +133,9 @@ def showhelp(): def ChgAbout(): HelpStr.set(about) def ChgDep(): + if useProgram == "": + BtnZujian.configure(state=tk.DISABLED) + return HelpStr.set(useProgram) def ChgCon(): HelpStr.set(contribute) diff --git a/new-deb-build/usr/share/polkit-1/actions/com.deepin.pkexec.installscrcpy.policy b/new-deb-build/usr/share/polkit-1/actions/com.deepin.pkexec.installscrcpy.policy new file mode 100644 index 0000000..c8abc1b --- /dev/null +++ b/new-deb-build/usr/share/polkit-1/actions/com.deepin.pkexec.installscrcpy.policy @@ -0,0 +1,21 @@ + + + + gfdgd xi + https://gitee.com/gfdgd-xi/uengine-runner/ + + Authentication is required to Install Scrcpy + 安装 Scrcpy 需要输入密码 + preferences-system + + no + no + auth_admin_keep + + /tmp/uengine-runner/InstallScrcpy.sh + true + + + \ No newline at end of file diff --git a/spark-uengine-runner.deb b/spark-uengine-runner.deb index 53e4581..b5515f2 100755 Binary files a/spark-uengine-runner.deb and b/spark-uengine-runner.deb differ diff --git a/uengine-apk-builder b/uengine-apk-builder index 9949d94..417362b 100755 --- a/uengine-apk-builder +++ b/uengine-apk-builder @@ -421,6 +421,9 @@ programmenu.add_command(label="退出程序", command=window.quit) # 设置“ combobox1['value'] = findApkHistory textbox1.configure(state=tk.DISABLED) textbox1.config(foreground='white', background='black') +# 如果有参数 +if len(sys.argv) > 1: + combobox1.set(sys.argv[1]) # 设置窗口 style = ttkthemes.ThemedStyle(win) style.set_theme("breeze")