Compare commits

...

3 Commits
1.4.2 ... 1.4.3

Author SHA1 Message Date
d105f85510 1.4.3 2021-09-11 16:38:31 +08:00
8057f2a596 初传 2021-09-11 15:51:23 +08:00
74831ea4c2 修改 deb 包 2021-08-30 18:05:13 +08:00
33 changed files with 1025 additions and 1417 deletions

View File

@@ -1,12 +1,21 @@
# uengine 运行器 1.4.0 # uengine 运行器 1.4.3
### 介绍 ### 介绍
        新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。         新版本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 测试平台UOS 家庭版deepin 20.2.2,UOS 专业版 1040
(自己美术功底太差,图标直接用 anbox 的了) (自己美术功底太差,图标直接用 anbox 的了)
### 更新内容 ### 更新内容
#### V1.4.32021-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.22021-08-30快开学了 #### V1.4.22021-08-30快开学了
**※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;** **※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;**
2、菜单栏的项目添加以及外观优化; 2、菜单栏的项目添加以及外观优化;

Binary file not shown.

View File

@@ -1,5 +1,5 @@
Package: spark-uengine-runner Package: spark-uengine-runner
Version: 1.4.2 Version: 1.4.3
Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com> 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] Homepage: [https://gitee.com/gfdgd-xi/uengine-runner, https://github.com/gfdgd-xi/uengine-runner]
Architecture: all Architecture: all

View File

@@ -3,7 +3,7 @@
"https://gitee.com/gfdgd-xi/uengine-runner", "https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner" "https://github.com/gfdgd-xi/uengine-runner"
], ],
"Version": "1.4.2", "Version": "1.4.3",
"System": "Linuxdeepin/UOS", "System": "Linuxdeepin/UOS",
"Tips": [ "Tips": [
"更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis", "更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis",
@@ -26,6 +26,13 @@
"4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁" "4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
], ],
"Update": [ "Update": [
"V1.4.3",
"※1、支持打包器打包的包名带前缀“uengine-dc”",
"※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)",
"※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况",
"4、支持一键使用 Scrcpy 连接 UEngine①先安装 adb 破解补丁②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】)",
"5、支持右键打包 apk",
"",
"V1.4.2", "V1.4.2",
"※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;", "※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;",
"2、菜单栏的项目添加以及外观优化;", "2、菜单栏的项目添加以及外观优化;",

View File

@@ -1,7 +1,7 @@
{ {
"Package": "spark-uengine-runner", "Package": "spark-uengine-runner",
"Update": true, "Update": true,
"Version": "1.4.2", "Version": "1.4.3",
"Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json" "Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json"
} }

View File

@@ -187,6 +187,7 @@ def DisabledAndEnbled(choose):
userChoose = {True: tk.DISABLED, False: tk.NORMAL} userChoose = {True: tk.DISABLED, False: tk.NORMAL}
a = userChoose[choose] a = userChoose[choose]
combobox1.configure(state=a) combobox1.configure(state=a)
check.configure(state=a)
button2.configure(state=a) button2.configure(state=a)
button3.configure(state=a) button3.configure(state=a)
@@ -256,6 +257,7 @@ def GetApkActivityName(apkFilePath):
return line return line
def GetApkPackageName(apkFilePath): def GetApkPackageName(apkFilePath):
# 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数
info = GetApkInformation(apkFilePath) info = GetApkInformation(apkFilePath)
for line in info.split('\n'): for line in info.split('\n'):
if "package:" in line: if "package:" in line:
@@ -264,7 +266,10 @@ def GetApkPackageName(apkFilePath):
line = line.replace("name=", "") line = line.replace("name=", "")
line = line.replace("'", "") line = line.replace("'", "")
line = line.replace(" ", "") line = line.replace(" ", "")
return line # 此较为特殊,因为需要判断用户是否要添加前缀
if qianZhui.get() == True:
return "uengine-dc-{}".format(line).lower()
return line.lower()
def GetApkVersion(apkFilePath): def GetApkVersion(apkFilePath):
info = GetApkInformation(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"): # 如果没有配置文件夹 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"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuild.json"): # 如果没有配置文件 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() win = tk.Tk()
qianZhui = tk.BooleanVar()
window = ttk.Frame(win) 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) frame2 = ttk.Frame(window)
label1 = ttk.Label(window, text="要打包的 apk 路径:") label1 = ttk.Label(window, text="要打包的 apk 路径:")
combobox1 = ttk.Combobox(window, width=100) combobox1 = ttk.Combobox(window, width=100)
button2 = ttk.Button(window, text="浏览", command=FindApk) button2 = ttk.Button(window, text="浏览", command=FindApk)
button3 = ttk.Button(frame2, text="打包", command=BuildDeb) button3 = ttk.Button(frame2, text="打包", command=BuildDeb)
check = ttk.Checkbutton(frame2, variable=qianZhui,text="使用前缀“uengine-dc”")
textbox1 = tk.Text(window, width=100) textbox1 = tk.Text(window, width=100)
menu = tk.Menu(window, background="white") # 设置菜单栏 menu = tk.Menu(window, background="white") # 设置菜单栏
programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏 programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏
menu.add_cascade(label="程序", menu=programmenu) menu.add_cascade(label="程序", menu=programmenu)
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项
# 设置控件 # 设置控件
combobox1['value'] = findApkHistory combobox1['value'] = findApkHistory
textbox1.configure(state=tk.DISABLED) textbox1.configure(state=tk.DISABLED)
textbox1.config(foreground='white', background='black') 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) # 显示菜单栏 win.config(menu=menu) # 显示菜单栏
label1.grid(row=2, column=0) label1.grid(row=2, column=0)
combobox1.grid(row=2, column=1) combobox1.grid(row=2, column=1)
#button1.grid(column=0, row=0)
button2.grid(row=2, column=2) 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) frame2.grid(row=3, columnspa=3)
textbox1.grid(row=4, columnspa=3) textbox1.grid(row=4, columnspa=3)
window.pack() window.pack()

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi<3025613752@qq.com> # 作者gfdgd xi<3025613752@qq.com>
# 版本1.4.0 # 版本1.4.3
# 更新时间2021年8月26日 # 更新时间2021年9月11日开学了
# 感谢anbox、deepin 和 UOS # 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
# 更新actionchen<917981399@qq.com> # 更新actionchen<917981399@qq.com>
@@ -99,7 +99,7 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
try: try:
if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
print("Mkdir") print("Mkdir")
os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
print("start install apk") print("start install apk")
global findApkHistory global findApkHistory
commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path)) 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*") os.system("systemctl restart uengine*")
DisabledAndEnbled(False) DisabledAndEnbled(False)
# 运行命令的窗口 def ScrcpyConnectUengine():
class InstallWindow(): if os.path.exists("/snap/bin/scrcpy"):
# 显示窗口 threading.Thread(target=os.system, args=["/snap/bin/scrcpy -s '192.168.250.2:5555'"]).start()
def ShowWindows(command): return
global message if messagebox.askyesno(title="提示", message="你没有安装Scrcpy指使用Snap安装\n如果你使用了其他方法安装了Scrcpy可以输入命令“scrcpy -s '192.168.250.2:5555'”,\n是否现在要使用Snap安装Scrcpy"):
global text if not os.path.exists("/tmp/uengine-runner"):
global installTipsText os.makedirs("/tmp/uengine-runner")
global progressbar write_txt("/tmp/uengine-runner/InstallScrcpy.sh", '''#!/bin/bash
message = tk.Toplevel() sudo apt install snapd -y
message.iconphoto(False, tk.PhotoImage(file=iconPath)) sudo snap refresh
messageFrame = ttk.Frame(message) sudo snap install scrcpy''')
installTipsText = tk.StringVar() threading.Thread(target=InstallWindow.ShowWindows, args=["chmod 777 /tmp/uengine-runner/InstallScrcpy.sh -Rv && pkexec /tmp/uengine-runner/InstallScrcpy.sh"]).start()
message.title("正在操作……") return
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()->"获取用户桌面目录": def get_desktop_path()->"获取用户桌面目录":
@@ -554,7 +512,7 @@ def CleanAllUengineDesktopLink():
if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"): if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"):
try: try:
shutil.rmtree("{}/.local/share/applications/uengine".format(get_home())) 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="删除完毕!") messagebox.showinfo(title="提示", message="删除完毕!")
except: except:
traceback.print_exc() 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 package -3"),
subprocess.getoutput("adb -s 192.168.250.2:5555 shell pm list packages -f"))) 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(): class ShowTextTipsWindow():
def ShowWindow(things): def ShowWindow(things):
message = tk.Toplevel() message = tk.Toplevel()
@@ -749,6 +825,27 @@ class AddNewUengineDesktopLink():
activityName.set(GetApkActivityName(path)) activityName.set(GetApkActivityName(path))
write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": os.path.dirname(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" desktop = programPath + "/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"]) contribute = "\n".join(information["Contribute"])
useProgram = '''1、UEngine{} useProgram = ""
2、python3{} threading.Thread(target=UseProgram).start()
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())): 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"): # 如果没有配置文件夹 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"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件
@@ -885,6 +965,9 @@ def showhelp():
def ChgAbout(): def ChgAbout():
HelpStr.set(about) HelpStr.set(about)
def ChgDep(): def ChgDep():
if useProgram == "":
BtnZujian.configure(state=tk.DISABLED)
return
HelpStr.set(useProgram) HelpStr.set(useProgram)
def ChgCon(): def ChgCon():
HelpStr.set(contribute) HelpStr.set(contribute)
@@ -987,9 +1070,11 @@ adb.add_separator()
adb.add_cascade(label="adb 服务", menu=adbServer) adb.add_cascade(label="adb 服务", menu=adbServer)
adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow) adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow)
adb.add_separator() 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=AdbAndroidInstallAppList)
adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer) adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer)
adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer) adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer)
adb.add_command(label="使用 Scrcpy 连接 UEngine只支持使用snap安装的Scrcpy", command=ScrcpyConnectUengine)
adb.add_separator() adb.add_separator()
adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb)

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi # 作者gfdgd xi
# 版本1.4.2 # 版本1.4.3
# 更新时间2021年8月30 # 更新时间2021年9月11
# 感谢anbox、deepin 和 统信 # 感谢anbox、deepin 和 统信
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
########################################################################################### ###########################################################################################
@@ -11,6 +11,7 @@
# 引入所需的库 # 引入所需的库
################# #################
import os import os
import threading
import time import time
import json import json
import ttkthemes 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" desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"]) 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{} 2、python3{}
3、tkinter{} 3、tkinter{}
4、aapt{} 4、aapt{}
@@ -71,10 +81,6 @@ useProgram = '''1、UEngine{}
subprocess.getoutput("adb version"), subprocess.getoutput("adb version"),
subprocess.getoutput("deepin-terminal -v")) subprocess.getoutput("deepin-terminal -v"))
# add sub window
#添加窗口开启关闭开关,防止重复开启
windowflag = "close"
def showhelp(): def showhelp():
#define window and frame and button label #define window and frame and button label
@@ -127,6 +133,9 @@ def showhelp():
def ChgAbout(): def ChgAbout():
HelpStr.set(about) HelpStr.set(about)
def ChgDep(): def ChgDep():
if useProgram == "":
BtnZujian.configure(state=tk.DISABLED)
return
HelpStr.set(useProgram) HelpStr.set(useProgram)
def ChgCon(): def ChgCon():
HelpStr.set(contribute) HelpStr.set(contribute)

View File

@@ -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]=打包 debUEngine 运行器)
Name[zh]=打包 debUEngine 运行器)
StartupNotify=true
Hidden=false
NoDisplay=true
MimeType=application/vnd.android.package-archive

View File

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

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>gfdgd xi</vendor>
<vendor_url>https://gitee.com/gfdgd-xi/uengine-runner/</vendor_url>
<action id="com.deepin.pkexec.installscrcpy">
<message>Authentication is required to Install Scrcpy</message>
<message xml:lang="zh_CN">安装 Scrcpy 需要输入密码</message>
<icon_name>preferences-system</icon_name>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/tmp/uengine-runner/InstallScrcpy.sh</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

Binary file not shown.

View File

@@ -3,7 +3,7 @@
"https://gitee.com/gfdgd-xi/uengine-runner", "https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner" "https://github.com/gfdgd-xi/uengine-runner"
], ],
"Version": "1.4.2", "Version": "1.4.3",
"System": "Linuxdeepin/UOS", "System": "Linuxdeepin/UOS",
"Tips": [ "Tips": [
"更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis", "更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis",
@@ -26,6 +26,13 @@
"4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁" "4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
], ],
"Update": [ "Update": [
"V1.4.3",
"※1、支持打包器打包的包名带前缀“uengine-dc”",
"※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)",
"※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况",
"4、支持一键使用 Scrcpy 连接 UEngine①先安装 adb 破解补丁②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】)",
"5、支持右键打包 apk",
"",
"V1.4.2", "V1.4.2",
"※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;", "※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;",
"2、菜单栏的项目添加以及外观优化;", "2、菜单栏的项目添加以及外观优化;",

245
main.py
View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi<3025613752@qq.com> # 作者gfdgd xi<3025613752@qq.com>
# 版本1.4.0 # 版本1.4.3
# 更新时间2021年8月26日 # 更新时间2021年9月11日开学了
# 感谢anbox、deepin 和 UOS # 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
# 更新actionchen<917981399@qq.com> # 更新actionchen<917981399@qq.com>
@@ -99,7 +99,7 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
try: try:
if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
print("Mkdir") print("Mkdir")
os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
print("start install apk") print("start install apk")
global findApkHistory global findApkHistory
commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path)) 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*") os.system("systemctl restart uengine*")
DisabledAndEnbled(False) DisabledAndEnbled(False)
# 运行命令的窗口 def ScrcpyConnectUengine():
class InstallWindow(): if os.path.exists("/snap/bin/scrcpy"):
# 显示窗口 threading.Thread(target=os.system, args=["/snap/bin/scrcpy -s '192.168.250.2:5555'"]).start()
def ShowWindows(command): return
global message if messagebox.askyesno(title="提示", message="你没有安装Scrcpy指使用Snap安装\n如果你使用了其他方法安装了Scrcpy可以输入命令“scrcpy -s '192.168.250.2:5555'”,\n是否现在要使用Snap安装Scrcpy"):
global text if not os.path.exists("/tmp/uengine-runner"):
global installTipsText os.makedirs("/tmp/uengine-runner")
global progressbar write_txt("/tmp/uengine-runner/InstallScrcpy.sh", '''#!/bin/bash
message = tk.Toplevel() sudo apt install snapd -y
message.iconphoto(False, tk.PhotoImage(file=iconPath)) sudo snap refresh
messageFrame = ttk.Frame(message) sudo snap install scrcpy''')
installTipsText = tk.StringVar() threading.Thread(target=InstallWindow.ShowWindows, args=["chmod 777 /tmp/uengine-runner/InstallScrcpy.sh -Rv && pkexec /tmp/uengine-runner/InstallScrcpy.sh"]).start()
message.title("正在操作……") return
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()->"获取用户桌面目录": def get_desktop_path()->"获取用户桌面目录":
@@ -554,7 +512,7 @@ def CleanAllUengineDesktopLink():
if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"): if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"):
try: try:
shutil.rmtree("{}/.local/share/applications/uengine".format(get_home())) 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="删除完毕!") messagebox.showinfo(title="提示", message="删除完毕!")
except: except:
traceback.print_exc() 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 package -3"),
subprocess.getoutput("adb -s 192.168.250.2:5555 shell pm list packages -f"))) 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(): class ShowTextTipsWindow():
def ShowWindow(things): def ShowWindow(things):
message = tk.Toplevel() message = tk.Toplevel()
@@ -749,6 +825,27 @@ class AddNewUengineDesktopLink():
activityName.set(GetApkActivityName(path)) activityName.set(GetApkActivityName(path))
write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": os.path.dirname(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" desktop = programPath + "/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"]) contribute = "\n".join(information["Contribute"])
useProgram = '''1、UEngine{} useProgram = ""
2、python3{} threading.Thread(target=UseProgram).start()
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())): 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"): # 如果没有配置文件夹 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"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件
@@ -885,6 +965,9 @@ def showhelp():
def ChgAbout(): def ChgAbout():
HelpStr.set(about) HelpStr.set(about)
def ChgDep(): def ChgDep():
if useProgram == "":
BtnZujian.configure(state=tk.DISABLED)
return
HelpStr.set(useProgram) HelpStr.set(useProgram)
def ChgCon(): def ChgCon():
HelpStr.set(contribute) HelpStr.set(contribute)
@@ -987,9 +1070,11 @@ adb.add_separator()
adb.add_cascade(label="adb 服务", menu=adbServer) adb.add_cascade(label="adb 服务", menu=adbServer)
adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow) adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow)
adb.add_separator() 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=AdbAndroidInstallAppList)
adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer) adb.add_command(label="adb 查看 UEngine 资源使用情况", command=AdbCPUAndRAWShowInTer)
adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer) adb.add_command(label="打开 adb 连接 UEngine 的终端", command=AdbShellShowInTer)
adb.add_command(label="使用 Scrcpy 连接 UEngine只支持使用snap安装的Scrcpy", command=ScrcpyConnectUengine)
adb.add_separator() adb.add_separator()
adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb) adb.add_cascade(label="UEngine 使用 adb", menu=uengineUseAdb)

View File

@@ -1,6 +1,6 @@
Package: com.gitee.uengine.runner.spark Package: com.gitee.uengine.runner.spark
Source: com.gitee.uengine.runner.spark Source: com.gitee.uengine.runner.spark
Version: 1.4.2 Version: 1.4.3
Architecture: all Architecture: all
Maintainer: gfdgd xi <3025613752@qq.com>, actionchen<917981399@qq.com> 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 Depends: deepin-elf-verify (>= 0.0.16.7-1), python3, python3-tk, python3-pip, aapt, adb, python3-pil, python3-setuptools, uengine, deepin-terminal

View File

@@ -6,4 +6,5 @@ rm -fv /usr/bin/uengine-app-uninstall
rm -fv /usr/bin/uengine-app-install rm -fv /usr/bin/uengine-app-install
rm -fv /usr/bin/uengine-clean rm -fv /usr/bin/uengine-clean
rm -fv /usr/bin/uengine-runner-about rm -fv /usr/bin/uengine-runner-about
rm -fv /usr/bin/uengine-keyboard rm -fv /usr/bin/uengine-keyboard
rm -fv /usr/bin/uengine-useadb

View File

@@ -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]=打包 debUEngine 运行器)
Name[zh]=打包 debUEngine 运行器)
StartupNotify=true
Hidden=false
NoDisplay=true
MimeType=application/vnd.android.package-archive

View File

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

View File

@@ -3,7 +3,7 @@
"https://gitee.com/gfdgd-xi/uengine-runner", "https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner" "https://github.com/gfdgd-xi/uengine-runner"
], ],
"Version": "1.4.2", "Version": "1.4.3",
"System": "Linuxdeepin/UOS", "System": "Linuxdeepin/UOS",
"Tips": [ "Tips": [
"更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis", "更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis",
@@ -26,6 +26,13 @@
"4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁" "4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
], ],
"Update": [ "Update": [
"V1.4.3",
"※1、支持打包器打包的包名带前缀“uengine-dc”",
"※2、修复了两种情况可能导致程序卡住/出错无法继续运行的情况(配置文件夹不齐全和获取版本信息卡住两种情况)",
"※3、修改了 UEngine 打包器打包的应用包名可能有大写的情况",
"4、支持一键使用 Scrcpy 连接 UEngine①先安装 adb 破解补丁②请确保是使用snap安装的 Scrcpy【目前只支持 snap 安装的 Scrcpy 进行连接】)",
"5、支持右键打包 apk",
"",
"V1.4.2", "V1.4.2",
"※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;", "※1、添加adb破解补丁用于可以让adb连接UEngine并支持adb的部分操作;",
"2、菜单栏的项目添加以及外观优化;", "2、菜单栏的项目添加以及外观优化;",

View File

@@ -1,6 +1,6 @@
{ {
"Package": "com.gitee.uengine.runner.spark", "Package": "com.gitee.uengine.runner.spark",
"Update": true, "Update": true,
"Version": "1.4.2", "Version": "1.4.3",
"Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json" "Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json"
} }

View File

@@ -187,6 +187,7 @@ def DisabledAndEnbled(choose):
userChoose = {True: tk.DISABLED, False: tk.NORMAL} userChoose = {True: tk.DISABLED, False: tk.NORMAL}
a = userChoose[choose] a = userChoose[choose]
combobox1.configure(state=a) combobox1.configure(state=a)
check.configure(state=a)
button2.configure(state=a) button2.configure(state=a)
button3.configure(state=a) button3.configure(state=a)
@@ -256,6 +257,7 @@ def GetApkActivityName(apkFilePath):
return line return line
def GetApkPackageName(apkFilePath): def GetApkPackageName(apkFilePath):
# 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数
info = GetApkInformation(apkFilePath) info = GetApkInformation(apkFilePath)
for line in info.split('\n'): for line in info.split('\n'):
if "package:" in line: if "package:" in line:
@@ -264,7 +266,10 @@ def GetApkPackageName(apkFilePath):
line = line.replace("name=", "") line = line.replace("name=", "")
line = line.replace("'", "") line = line.replace("'", "")
line = line.replace(" ", "") line = line.replace(" ", "")
return line # 此较为特殊,因为需要判断用户是否要添加前缀
if qianZhui.get() == True:
return "uengine-dc-{}".format(line).lower()
return line.lower()
def GetApkVersion(apkFilePath): def GetApkVersion(apkFilePath):
info = GetApkInformation(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"): # 如果没有配置文件夹 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"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuild.json"): # 如果没有配置文件 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() win = tk.Tk()
qianZhui = tk.BooleanVar()
window = ttk.Frame(win) 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) frame2 = ttk.Frame(window)
label1 = ttk.Label(window, text="要打包的 apk 路径:") label1 = ttk.Label(window, text="要打包的 apk 路径:")
combobox1 = ttk.Combobox(window, width=100) combobox1 = ttk.Combobox(window, width=100)
button2 = ttk.Button(window, text="浏览", command=FindApk) button2 = ttk.Button(window, text="浏览", command=FindApk)
button3 = ttk.Button(frame2, text="打包", command=BuildDeb) button3 = ttk.Button(frame2, text="打包", command=BuildDeb)
check = ttk.Checkbutton(frame2, variable=qianZhui,text="使用前缀“uengine-dc”")
textbox1 = tk.Text(window, width=100) textbox1 = tk.Text(window, width=100)
menu = tk.Menu(window, background="white") # 设置菜单栏 menu = tk.Menu(window, background="white") # 设置菜单栏
programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏 programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏
menu.add_cascade(label="程序", menu=programmenu) menu.add_cascade(label="程序", menu=programmenu)
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项
# 设置控件 # 设置控件
combobox1['value'] = findApkHistory combobox1['value'] = findApkHistory
textbox1.configure(state=tk.DISABLED) textbox1.configure(state=tk.DISABLED)
textbox1.config(foreground='white', background='black') 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) # 显示菜单栏 win.config(menu=menu) # 显示菜单栏
label1.grid(row=2, column=0) label1.grid(row=2, column=0)
combobox1.grid(row=2, column=1) combobox1.grid(row=2, column=1)
#button1.grid(column=0, row=0)
button2.grid(row=2, column=2) 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) frame2.grid(row=3, columnspa=3)
textbox1.grid(row=4, columnspa=3) textbox1.grid(row=4, columnspa=3)
window.pack() window.pack()

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi<3025613752@qq.com> # 作者gfdgd xi<3025613752@qq.com>
# 版本1.4.0 # 版本1.4.3
# 更新时间2021年8月26日 # 更新时间2021年9月11日开学了
# 感谢anbox、deepin 和 UOS # 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
# 更新actionchen<917981399@qq.com> # 更新actionchen<917981399@qq.com>
@@ -11,7 +11,6 @@
################# #################
# 引入所需的库 # 引入所需的库
################# #################
from genericpath import exists
import os import os
import sys import sys
import time import time
@@ -29,7 +28,7 @@ import tkinter.messagebox as messagebox
import tkinter.filedialog as filedialog import tkinter.filedialog as filedialog
import tkinter.simpledialog as simpledialog import tkinter.simpledialog as simpledialog
from getxmlimg import getsavexml from getxmlimg import getsavexml
from tkinter.constants import TOP
# 卸载程序 # 卸载程序
def UninstallProgram(package: "apk 包名")->"卸载程序": def UninstallProgram(package: "apk 包名")->"卸载程序":
@@ -100,7 +99,7 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
try: try:
if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())): if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
print("Mkdir") print("Mkdir")
os.mkdir("{}/.local/share/applications/uengine/".format(get_home())) os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
print("start install apk") print("start install apk")
global findApkHistory global findApkHistory
commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path)) 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*") os.system("systemctl restart uengine*")
DisabledAndEnbled(False) DisabledAndEnbled(False)
# 运行命令的窗口 def ScrcpyConnectUengine():
class InstallWindow(): if os.path.exists("/snap/bin/scrcpy"):
# 显示窗口 threading.Thread(target=os.system, args=["/snap/bin/scrcpy -s '192.168.250.2:5555'"]).start()
def ShowWindows(command): return
global message if messagebox.askyesno(title="提示", message="你没有安装Scrcpy指使用Snap安装\n如果你使用了其他方法安装了Scrcpy可以输入命令“scrcpy -s '192.168.250.2:5555'”,\n是否现在要使用Snap安装Scrcpy"):
global text if not os.path.exists("/tmp/uengine-runner"):
global installTipsText os.makedirs("/tmp/uengine-runner")
global progressbar write_txt("/tmp/uengine-runner/InstallScrcpy.sh", '''#!/bin/bash
message = tk.Toplevel() sudo apt install snapd -y
message.iconphoto(False, tk.PhotoImage(file=iconPath)) sudo snap refresh
messageFrame = ttk.Frame(message) sudo snap install scrcpy''')
installTipsText = tk.StringVar() threading.Thread(target=InstallWindow.ShowWindows, args=["chmod 777 /tmp/uengine-runner/InstallScrcpy.sh -Rv && pkexec /tmp/uengine-runner/InstallScrcpy.sh"]).start()
message.title("正在操作……") return
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()->"获取用户桌面目录": def get_desktop_path()->"获取用户桌面目录":
@@ -552,10 +509,10 @@ def get_home()->"获取用户主目录":
# 删除所有的 uengine 应用快捷方式 # 删除所有的 uengine 应用快捷方式
def CleanAllUengineDesktopLink(): def CleanAllUengineDesktopLink():
if messagebox.askokcancel(title="提示", message="你确定要删除所有的 uengine 应用快捷方式吗?"): if messagebox.askokcancel(title="提示", message="你确定要删除所有的 UEngine 应用快捷方式吗?"):
try: try:
shutil.rmtree("{}/.local/share/applications/uengine".format(get_home())) 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="删除完毕!") messagebox.showinfo(title="提示", message="删除完毕!")
except: except:
traceback.print_exc() traceback.print_exc()
@@ -573,6 +530,202 @@ def OpenUengineRootData():
def OpenUengineUserData(): def OpenUengineUserData():
threading.Thread(target=os.system, args=["xdg-open ~/安卓应用文件"]).start() 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 应用快捷方式 # 添加/删除 uengine 应用快捷方式
class AddNewUengineDesktopLink(): class AddNewUengineDesktopLink():
addTips = '''可以输入app的包名和Activity或通过浏览apk文件来获取包名和Activity addTips = '''可以输入app的包名和Activity或通过浏览apk文件来获取包名和Activity
@@ -591,8 +744,9 @@ class AddNewUengineDesktopLink():
saveButton = ttk.Button(controlFrame, text="写入", command=AddNewUengineDesktopLink.SaveDesktopLink) saveButton = ttk.Button(controlFrame, text="写入", command=AddNewUengineDesktopLink.SaveDesktopLink)
delButton = ttk.Button(controlFrame, text="删除", command=AddNewUengineDesktopLink.DelDesktopLink) delButton = ttk.Button(controlFrame, text="删除", command=AddNewUengineDesktopLink.DelDesktopLink)
message.title("添加/删除 uengine 图标") message.title("添加/删除 UEngine 图标")
message.resizable(0, 0) message.resizable(0, 0)
message.iconphoto(False, tk.PhotoImage(file=iconPath))
# get screen width and height # get screen width and height
screen_width = message.winfo_screenwidth() screen_width = message.winfo_screenwidth()
screen_height = message.winfo_screenheight() screen_height = message.winfo_screenheight()
@@ -636,7 +790,7 @@ class AddNewUengineDesktopLink():
def DelDesktopLink(): def DelDesktopLink():
global packageName global packageName
if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())): 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 return
if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"): if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"):
return return
@@ -671,6 +825,27 @@ class AddNewUengineDesktopLink():
activityName.set(GetApkActivityName(path)) activityName.set(GetApkActivityName(path))
write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": os.path.dirname(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"] version = information["Version"]
goodRunSystem = information["System"] goodRunSystem = information["System"]
aaptVersion = GetCommandReturn("aapt version") 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"]) tips = "\n".join(information["Tips"])
updateThingsString = "\n".join(information["Update"]) updateThingsString = "\n".join(information["Update"])
title = "uengine 运行器 {}".format(version) title = "UEngine 运行器 {}".format(version)
updateTime = information["Time"] updateTime = information["Time"]
updateThings = "{} 更新内容:\n{}\n更新时间{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) updateThings = "{} 更新内容:\n{}\n更新时间{}".format(version, updateThingsString, updateTime, time.strftime("%Y"))
iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0]) iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0])
desktop = programPath + "/UengineAndroidProgramList.desktop" desktop = programPath + "/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"]) 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())): 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"): # 如果没有配置文件夹 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"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件
@@ -752,7 +923,7 @@ def showhelp():
helpwindow=tk.Toplevel() helpwindow=tk.Toplevel()
helpwindow.resizable(0, 0) helpwindow.resizable(0, 0)
helpwindow.title("帮助") helpwindow.title("帮助")
helpwindow.iconphoto(False, tk.PhotoImage(file=iconPath))
# get screen width and height # get screen width and height
screen_width = helpwindow.winfo_screenwidth() screen_width = helpwindow.winfo_screenwidth()
@@ -794,6 +965,9 @@ def showhelp():
def ChgAbout(): def ChgAbout():
HelpStr.set(about) HelpStr.set(about)
def ChgDep(): def ChgDep():
if useProgram == "":
BtnZujian.configure(state=tk.DISABLED)
return
HelpStr.set(useProgram) HelpStr.set(useProgram)
def ChgCon(): def ChgCon():
HelpStr.set(contribute) HelpStr.set(contribute)
@@ -861,7 +1035,7 @@ ComboInstallPath = ttk.Combobox(window, width=50)
ComboUninstallPath = ttk.Combobox(window, width=50) ComboUninstallPath = ttk.Combobox(window, width=50)
BtnFindApk = ttk.Button(FrmInstall, text="浏览", command=FindApk) BtnFindApk = ttk.Button(FrmInstall, text="浏览", command=FindApk)
BtnInstall = ttk.Button(FrmInstall, text="安装", command=Button3Install) 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) BtnUninstallApkBrowser = ttk.Button(FrmUninstall, text="浏览", command=BtnFindUninstallApkClk)
BtnUninstall = ttk.Button(FrmUninstall, text="卸载", command=ButtonClick8) BtnUninstall = ttk.Button(FrmUninstall, text="卸载", command=ButtonClick8)
Btngeticon = ttk.Button(FrmInstall, text="保存图标", command=SaveIconToOtherPath) 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") menu = tk.Menu(window, background="white")
programmenu = tk.Menu(menu, tearoff=0, 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") uengine = tk.Menu(menu, tearoff=0, background="white")
help = tk.Menu(menu, tearoff=0, background="white") # 设置“帮助”菜单栏 help = tk.Menu(menu, tearoff=0, background="white") # 设置“帮助”菜单栏
uengineService = tk.Menu(uengine) adbServer = tk.Menu(adb, tearoff=0, background="white")
uengineInternet = tk.Menu(uengine)
uengineIcon = tk.Menu(uengine) uengineService = tk.Menu(uengine, tearoff=0, background="white")
uengineData = tk.Menu(uengine) 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="程序", 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) menu.add_cascade(label="关于", menu=help)
programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory) programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory)
programmenu.add_separator() # 设置分界线 programmenu.add_separator() # 设置分界线
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序” programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”
uengine.add_command(label="uengine 应用打包", command=OpenUengineDebBuilder) adb.add_command(label="adb 连接 UEngine", command=UengineConnectAdb)
uengine.add_command(label="uengine 键盘映射", command=KeyboardToMouse) adb.add_separator()
uengine.add_cascade(label="uengine 服务", menu=uengineService) adb.add_cascade(label="adb 服务", menu=adbServer)
uengine.add_cascade(label="uengine 网络桥接", menu=uengineInternet) adb.add_command(label="显示 adb 连接的设备", command=AdbConnectDeviceShow)
uengine.add_cascade(label="uengine 快捷方式", menu=uengineIcon) adb.add_separator()
uengine.add_cascade(label="uengine 数据", menu=uengineData) 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=OpenProgramURL) # 设置“程序官网”项
help.add_command(label="帮助", command=showhelp) # 设置“关于这个程序”项 help.add_command(label="帮助", command=showhelp) # 设置“关于这个程序”项
uengineService.add_command(label="启用 uengine 服务", command=StartUengine) uengineService.add_command(label="启用 UEngine 服务(需要 root", command=StartUengine)
uengineService.add_command(label="关闭 uengine 服务", command=StopUengine) uengineService.add_command(label="关闭 UEngine 服务(需要 root", command=StopUengine)
uengineService.add_command(label="重启 uengine 服务", command=UengineRestart) uengineService.add_command(label="重启 UEngine 服务(需要 root", command=UengineRestart)
uengineInternet.add_command(label="启用 uengine 网络桥接", command=UengineBridgeStart) uengineInternet.add_command(label="启用 UEngine 网络桥接(需要 root", command=UengineBridgeStart)
uengineInternet.add_command(label="关闭 uengine 网络桥接", command=UengineBridgeStop) uengineInternet.add_command(label="关闭 UEngine 网络桥接(需要 root", command=UengineBridgeStop)
uengineInternet.add_command(label="重启 uengine 网络桥接", command=UengineBridgeRestart) uengineInternet.add_command(label="重启 UEngine 网络桥接(需要 root", command=UengineBridgeRestart)
uengineInternet.add_command(label="加载 uengine 网络桥接", command=UengineBridgeReload) uengineInternet.add_command(label="加载 UEngine 网络桥接(需要 root", command=UengineBridgeReload)
uengineInternet.add_command(label="强制加载 uengine 网络桥接", command=UengineBridgeForceReload) uengineInternet.add_command(label="强制加载 UEngine 网络桥接(需要 root", command=UengineBridgeForceReload)
uengineIcon.add_command(label="发送 uengine 应用列表到桌面", command=SendUengineAndroidListForDesktop) uengineIcon.add_command(label="发送 UEngine 应用列表到桌面", command=SendUengineAndroidListForDesktop)
uengineIcon.add_command(label="发送 uengine 应用列表到启动器", command=SendUengineAndroidListForLauncher) uengineIcon.add_command(label="发送 UEngine 应用列表到启动器", command=SendUengineAndroidListForLauncher)
uengineIcon.add_separator() uengineIcon.add_separator()
uengineIcon.add_command(label="添加/删除指定的 uengine 快捷方式", command=AddNewUengineDesktopLink.ShowWindow) uengineIcon.add_command(label="添加/删除指定的 UEngine 快捷方式", command=AddNewUengineDesktopLink.ShowWindow)
uengineIcon.add_separator() uengineIcon.add_separator()
uengineIcon.add_command(label="清空所有 uengine 快捷方式", command=CleanAllUengineDesktopLink) uengineIcon.add_command(label="清空所有 UEngine 快捷方式", command=CleanAllUengineDesktopLink)
uengineData.add_command(label="打开 uengine 根目录", command=OpenUengineRootData) uengineUseAdb.add_command(label="adb 连接 UEngine", command=UengineConnectAdb)
uengineData.add_command(label="打开 uengine 用户数据目录", command=OpenUengineUserData) 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_separator()
uengineData.add_command(label="清空 uengine 数据", command=BackUengineClean) uengineData.add_command(label="清空 UEngine 数据(需要 root", command=BackUengineClean)
menu.configure(activebackground="dodgerblue") menu.configure(activebackground="dodgerblue")
help.configure(activebackground="dodgerblue") help.configure(activebackground="dodgerblue")
adb.configure(activebackground="dodgerblue")
uengine.configure(activebackground="dodgerblue") uengine.configure(activebackground="dodgerblue")
programmenu.configure(activebackground="dodgerblue") programmenu.configure(activebackground="dodgerblue")
uengineService.configure(activebackground="dodgerblue") uengineService.configure(activebackground="dodgerblue")
uengineInternet.configure(activebackground="dodgerblue") uengineInternet.configure(activebackground="dodgerblue")
uengineIcon.configure(activebackground="dodgerblue") uengineIcon.configure(activebackground="dodgerblue")
uengineUseAdb.configure(activebackground="dodgerblue")
uengineData.configure(activebackground="dodgerblue")
# 设置控件 # 设置控件
ComboUninstallPath['value'] = fineUninstallApkHistory ComboUninstallPath['value'] = fineUninstallApkHistory

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi # 作者gfdgd xi
# 版本1.4.2 # 版本1.4.3
# 更新时间2021年8月30 # 更新时间2021年9月11
# 感谢anbox、deepin 和 统信 # 感谢anbox、deepin 和 统信
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
########################################################################################### ###########################################################################################
@@ -11,6 +11,7 @@
# 引入所需的库 # 引入所需的库
################# #################
import os import os
import threading
import time import time
import json import json
import ttkthemes 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" desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"]) 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{} 2、python3{}
3、tkinter{} 3、tkinter{}
4、aapt{} 4、aapt{}
@@ -71,10 +81,6 @@ useProgram = '''1、UEngine{}
subprocess.getoutput("adb version"), subprocess.getoutput("adb version"),
subprocess.getoutput("deepin-terminal -v")) subprocess.getoutput("deepin-terminal -v"))
# add sub window
#添加窗口开启关闭开关,防止重复开启
windowflag = "close"
def showhelp(): def showhelp():
#define window and frame and button label #define window and frame and button label
@@ -127,6 +133,9 @@ def showhelp():
def ChgAbout(): def ChgAbout():
HelpStr.set(about) HelpStr.set(about)
def ChgDep(): def ChgDep():
if useProgram == "":
BtnZujian.configure(state=tk.DISABLED)
return
HelpStr.set(useProgram) HelpStr.set(useProgram)
def ChgCon(): def ChgCon():
HelpStr.set(contribute) HelpStr.set(contribute)

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>gfdgd xi</vendor>
<vendor_url>https://gitee.com/gfdgd-xi/uengine-runner/</vendor_url>
<action id="com.deepin.pkexec.installscrcpy">
<message>Authentication is required to Install Scrcpy</message>
<message xml:lang="zh_CN">安装 Scrcpy 需要输入密码</message>
<icon_name>preferences-system</icon_name>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/tmp/uengine-runner/InstallScrcpy.sh</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>gfdgd xi</vendor>
<vendor_url>https://gitee.com/gfdgd-xi/uengine-runner/</vendor_url>
<action id="com.deepin.pkexec.installscrcpy">
<message>Authentication is required to Install Scrcpy</message>
<message xml:lang="zh_CN">安装 Scrcpy 需要输入密码</message>
<icon_name>preferences-system</icon_name>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/tmp/uengine-runner/InstallScrcpy.sh</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

58
pkexec/icon/kbox.svg Normal file
View File

@@ -0,0 +1,58 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" viewBox="0 0 512 512">
<defs>
<filter id="安卓容器-512px-a" width="122.6%" height="123.3%" x="-11.3%" y="-11.6%" filterUnits="objectBoundingBox">
<feOffset dy="8" in="SourceAlpha" result="shadowOffsetOuter1"/>
<feGaussianBlur in="shadowOffsetOuter1" result="shadowBlurOuter1" stdDeviation="10"/>
<feColorMatrix in="shadowBlurOuter1" result="shadowMatrixOuter1" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<linearGradient id="安卓容器-512px-b" x1="50%" x2="50%" y1="0%" y2="100%">
<stop offset="0%" stop-color="#CFFB82"/>
<stop offset="100%" stop-color="#539109"/>
</linearGradient>
<linearGradient id="安卓容器-512px-c" x1="50%" x2="50%" y1="0%" y2="190.452%">
<stop offset="0%" stop-color="#FFF"/>
<stop offset="100%" stop-color="#FFF" stop-opacity=".255"/>
</linearGradient>
<linearGradient id="安卓容器-512px-d" x1="50%" x2="50%" y1="11.664%" y2="100%">
<stop offset="0%" stop-color="#ECCB89"/>
<stop offset="15.474%" stop-color="#CC9A4E"/>
<stop offset="23.345%" stop-color="#E2BB78"/>
<stop offset="29.459%" stop-color="#E5BE7D"/>
<stop offset="100%" stop-color="#D1965D"/>
</linearGradient>
<path id="安卓容器-512px-e" d="M72,148 L406,148 C426.434536,148 443,164.565464 443,185 L443,427 C443,447.434536 426.434536,464 406,464 L72,464 C51.5654643,464 35,447.434536 35,427 L35,185 C35,164.565464 51.5654643,148 72,148 Z"/>
<linearGradient id="安卓容器-512px-f" x1="50%" x2="50%" y1="0%" y2="126.091%">
<stop offset="0%" stop-color="#FD9"/>
<stop offset="100%" stop-color="#D1A25E"/>
</linearGradient>
<path id="安卓容器-512px-g" d="M45.2703171,146 L432.729683,146 C438.398863,146 443.508433,149.418972 445.671038,154.659463 L474.009349,223.329731 C475.484098,226.903388 473.782597,230.995929 470.20894,232.470677 C469.362065,232.820159 468.454823,233 467.538672,233 L10.4613285,233 C6.59533521,233 3.46132846,229.865993 3.46132846,226 C3.46132846,225.083848 3.64116944,224.176606 3.99065113,223.329731 L32.3289625,154.659463 C34.4915674,149.418972 39.6011368,146 45.2703171,146 Z"/>
<filter id="安卓容器-512px-h" width="99.6%" height="105.7%" x=".2%" y="-2.9%" filterUnits="objectBoundingBox">
<feOffset dx="-2" dy="-3" in="SourceAlpha" result="shadowOffsetInner1"/>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" k2="-1" k3="1" operator="arithmetic" result="shadowInnerInner1"/>
<feColorMatrix in="shadowInnerInner1" result="shadowMatrixInner1" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.08 0"/>
<feGaussianBlur in="SourceAlpha" result="shadowBlurInner2" stdDeviation="1"/>
<feOffset dy="3" in="shadowBlurInner2" result="shadowOffsetInner2"/>
<feComposite in="shadowOffsetInner2" in2="SourceAlpha" k2="-1" k3="1" operator="arithmetic" result="shadowInnerInner2"/>
<feColorMatrix in="shadowInnerInner2" result="shadowMatrixInner2" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.241313374 0"/>
<feMerge>
<feMergeNode in="shadowMatrixInner1"/>
<feMergeNode in="shadowMatrixInner2"/>
</feMerge>
</filter>
</defs>
<g fill="none" fill-rule="evenodd" filter="url(#安卓容器-512px-a)" transform="translate(17 23)">
<g transform="translate(98)">
<path fill="url(#安卓容器-512px-b)" d="M0,169 L282,169 C282,121.487244 262.463855,78.877939 223.561446,50.9789895 L254.479518,20.2056028 C259.575904,14.2876438 259.575904,8.87693847 254.479518,3.8044022 C249.383133,-1.26813407 243.777108,-1.26813407 238.001205,3.8044022 L202.836145,38.8049025 C183.639759,28.6598299 163.084337,23.5872936 141,23.5872936 C118.236145,23.5872936 97.3409639,28.6598299 78.1445783,38.973987 L42.9795181,3.8044022 C37.8831325,-1.26813407 32.2771084,-1.26813407 26.5012048,3.8044022 C20.5554217,8.87693847 20.5554217,14.4567284 26.5012048,20.2056028 L57.4192771,50.9789895 C19.026506,78.0325163 0,120.641821 0,169 Z"/>
<path fill="url(#安卓容器-512px-c)" d="M205,88 C214.444444,88 222,95.5555556 222,105 C222,114.444444 214.444444,122 205,122 C195.555556,122 188,114.444444 188,105 C188,95.5555556 195.555556,88 205,88 Z M77,88 C86.4444444,88 94,95.5555556 94,105 C94,114.444444 86.4444444,122 77,122 C67.5555556,122 60,114.444444 60,105 C60,95.5555556 67.5555556,88 77,88 Z"/>
</g>
<use fill="url(#安卓容器-512px-d)" fill-rule="nonzero" xlink:href="#安卓容器-512px-e"/>
<g fill-rule="nonzero">
<use fill="url(#安卓容器-512px-f)" xlink:href="#安卓容器-512px-g"/>
<use fill="#000" filter="url(#安卓容器-512px-h)" xlink:href="#安卓容器-512px-g"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,6 +1,6 @@
{ {
"Package": "com.gitee.uengine.runner.spark", "Package": "com.gitee.uengine.runner.spark",
"Update": true, "Update": true,
"Version": "1.4.2", "Version": "1.4.3",
"Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json" "Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json"
} }

View File

@@ -1,7 +1,7 @@
{ {
"Package": "spark-uengine-runner", "Package": "spark-uengine-runner",
"Update": true, "Update": true,
"Version": "1.4.2", "Version": "1.4.3",
"Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json" "Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json"
} }

Binary file not shown.

View File

@@ -187,6 +187,7 @@ def DisabledAndEnbled(choose):
userChoose = {True: tk.DISABLED, False: tk.NORMAL} userChoose = {True: tk.DISABLED, False: tk.NORMAL}
a = userChoose[choose] a = userChoose[choose]
combobox1.configure(state=a) combobox1.configure(state=a)
check.configure(state=a)
button2.configure(state=a) button2.configure(state=a)
button3.configure(state=a) button3.configure(state=a)
@@ -256,6 +257,7 @@ def GetApkActivityName(apkFilePath):
return line return line
def GetApkPackageName(apkFilePath): def GetApkPackageName(apkFilePath):
# 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数
info = GetApkInformation(apkFilePath) info = GetApkInformation(apkFilePath)
for line in info.split('\n'): for line in info.split('\n'):
if "package:" in line: if "package:" in line:
@@ -264,7 +266,10 @@ def GetApkPackageName(apkFilePath):
line = line.replace("name=", "") line = line.replace("name=", "")
line = line.replace("'", "") line = line.replace("'", "")
line = line.replace(" ", "") line = line.replace(" ", "")
return line # 此较为特殊,因为需要判断用户是否要添加前缀
if qianZhui.get() == True:
return "uengine-dc-{}".format(line).lower()
return line.lower()
def GetApkVersion(apkFilePath): def GetApkVersion(apkFilePath):
info = GetApkInformation(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"): # 如果没有配置文件夹 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"): # 如果没有配置文件 if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件 write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuild.json"): # 如果没有配置文件 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() win = tk.Tk()
qianZhui = tk.BooleanVar()
window = ttk.Frame(win) 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) frame2 = ttk.Frame(window)
label1 = ttk.Label(window, text="要打包的 apk 路径:") label1 = ttk.Label(window, text="要打包的 apk 路径:")
combobox1 = ttk.Combobox(window, width=100) combobox1 = ttk.Combobox(window, width=100)
button2 = ttk.Button(window, text="浏览", command=FindApk) button2 = ttk.Button(window, text="浏览", command=FindApk)
button3 = ttk.Button(frame2, text="打包", command=BuildDeb) button3 = ttk.Button(frame2, text="打包", command=BuildDeb)
check = ttk.Checkbutton(frame2, variable=qianZhui,text="使用前缀“uengine-dc”")
textbox1 = tk.Text(window, width=100) textbox1 = tk.Text(window, width=100)
menu = tk.Menu(window, background="white") # 设置菜单栏 menu = tk.Menu(window, background="white") # 设置菜单栏
programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏 programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏
menu.add_cascade(label="程序", menu=programmenu) menu.add_cascade(label="程序", menu=programmenu)
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项
# 设置控件 # 设置控件
combobox1['value'] = findApkHistory combobox1['value'] = findApkHistory
textbox1.configure(state=tk.DISABLED) textbox1.configure(state=tk.DISABLED)
textbox1.config(foreground='white', background='black') 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) # 显示菜单栏 win.config(menu=menu) # 显示菜单栏
label1.grid(row=2, column=0) label1.grid(row=2, column=0)
combobox1.grid(row=2, column=1) combobox1.grid(row=2, column=1)
#button1.grid(column=0, row=0)
button2.grid(row=2, column=2) 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) frame2.grid(row=3, columnspa=3)
textbox1.grid(row=4, columnspa=3) textbox1.grid(row=4, columnspa=3)
window.pack() window.pack()

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi # 作者gfdgd xi
# 版本1.4.2 # 版本1.4.3
# 更新时间2021年8月30 # 更新时间2021年9月11
# 感谢anbox、deepin 和 统信 # 感谢anbox、deepin 和 统信
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
########################################################################################### ###########################################################################################
@@ -11,6 +11,7 @@
# 引入所需的库 # 引入所需的库
################# #################
import os import os
import threading
import time import time
import json import json
import ttkthemes 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" desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop" desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"]) 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{} 2、python3{}
3、tkinter{} 3、tkinter{}
4、aapt{} 4、aapt{}
@@ -71,10 +81,6 @@ useProgram = '''1、UEngine{}
subprocess.getoutput("adb version"), subprocess.getoutput("adb version"),
subprocess.getoutput("deepin-terminal -v")) subprocess.getoutput("deepin-terminal -v"))
# add sub window
#添加窗口开启关闭开关,防止重复开启
windowflag = "close"
def showhelp(): def showhelp():
#define window and frame and button label #define window and frame and button label
@@ -127,6 +133,9 @@ def showhelp():
def ChgAbout(): def ChgAbout():
HelpStr.set(about) HelpStr.set(about)
def ChgDep(): def ChgDep():
if useProgram == "":
BtnZujian.configure(state=tk.DISABLED)
return
HelpStr.set(useProgram) HelpStr.set(useProgram)
def ChgCon(): def ChgCon():
HelpStr.set(contribute) HelpStr.set(contribute)