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")