Compare commits

...

8 Commits

Author SHA1 Message Date
09857468f7 1.5.3完成 2021-12-12 12:33:21 +08:00
2abc67e426 初步完成1.5.3 2021-12-12 11:28:22 +08:00
c4ab276ab5 更新 README 2021-11-28 20:47:52 +08:00
016c397529 1.5.2 2021-11-28 16:11:01 +08:00
4f0fafbf17 一点点东西 2021-10-26 20:19:42 +08:00
ad5f08ca38 改个README.md 2021-10-05 18:31:25 +08:00
618a8c4941 Merge branch 'ChangeTestUpload' into main 2021-10-05 18:29:02 +08:00
9ef3c45ff6 Change 2021-10-05 18:26:32 +08:00
53 changed files with 1612 additions and 555 deletions

129
Android X86/main.py Normal file
View File

@@ -0,0 +1,129 @@
import os
import sys
import threading
#import ttkthemes
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.messagebox as messagebox
class AddVirtualMachine():
def ShowWindow():
messgae = tk.Toplevel()
chooseImageString = tk.StringVar()
chooseImageString.set("请选择……")
nameTips = tk.Label(messgae, text="虚拟机名称")
nameEntry = tk.Entry(messgae, width=50)
memoryTips = tk.Label(messgae, text="虚拟机内存分配")
memoryDefultValue = tk.Checkbutton(messgae, text="默认值")
memoryValue = tk.Scale(messgae, from_=1, orient=tk.HORIZONTAL)
chooseImageTips = tk.Label(messgae, text="选择虚拟机镜像:")
chooseImage = tk.OptionMenu(messgae, chooseImageString, [""])
quicklyFasterSpeed = tk.Checkbutton(messgae, text="启动 kvm 加速")
tipsThings = tk.Label(messgae, text="虚拟机备注:")
tipsThingsTips = tk.Text(messgae, height=5, width=50)
controlFrame = tk.Frame(messgae)
cancal = tk.Button(controlFrame ,text="取消")
ok = tk.Button(controlFrame, text="确定")
messgae.title("添加 Android X86 虚拟机")
messgae.resizable(0, 0)
memoryValue.set(33)
cancal.grid(row=0, column=0)
ok.grid(row=0, column=1)
nameTips.grid(row=0, column=0)
nameEntry.grid(row=0, column=1, columnspan=3)
memoryTips.grid(row=1, column=0)
memoryDefultValue.grid(row=1, column=1)
memoryValue.grid(row=1, column=2)
chooseImageTips.grid(row=2, column=0)
chooseImage.grid(row=2, column=1)
quicklyFasterSpeed.grid(row=2, column=2)
tipsThings.grid(row=3, column=0)
tipsThingsTips.grid(row=3, column=1, columnspan=3, rowspan=2, sticky=tk.W)
controlFrame.grid(row=5, column=3, sticky=tk.E)
#controlFrame.grid(row=5, column=2)
messgae.mainloop()
class DelVirtualMachine():
def Tips():
if messagebox.askokcancel(title="提示", message="你确定要删除此虚拟机吗?\n删除后将无法恢复!"):
messagebox.showinfo(title="提示", message="删除完毕!")
class AddVirtualImage():
def ShowWindow():
message = tk.Toplevel()
urlImageDownloadTips = tk.Label(message, text="可下载镜像:")
urlImageDownloadList = ttk.Treeview(message)
addImage = tk.Button(message, text="")
delImage = tk.Button(message, text="")
ImageTips = tk.Label(message, text="已下载镜像:")
ImageList = ttk.Treeview(message)
ok = tk.Button(message, text="确定")
message.title("下载新的镜像")
message.resizable(0, 0)
urlImageDownloadTips.grid(row=0, column=0, sticky=tk.W)
urlImageDownloadList.grid(row=1, column=0, rowspan=4)
addImage.grid(row=2, column=1)
delImage.grid(row=3, column=1)
ImageTips.grid(row=0, column=2, sticky=tk.W)
ImageList.grid(row=1, column=2, rowspan=4)
ok.grid(row=5, column=2, sticky=tk.E)
message.mainloop()
class SettingVirtualMachine():
pass
def RunVirtualMachine():
threading.Thread(target=os.system, args=["kvm --cdrom {} --hda {} -m {}G".format("", "", "")]).start()
window = tk.Tk()
virtualMachineList = ttk.Treeview(window)
addVirtualMachine = tk.Button(window, text="", command=AddVirtualMachine.ShowWindow)
delVirtualMachine = tk.Button(window, text="", command=DelVirtualMachine.Tips)
addVirtualMachineImage = tk.Button(window, text="", command=AddVirtualImage.ShowWindow)
settingVirtualMachine = tk.Button(window, text="⚙️")
runVirtualMachine = tk.Button(window, text="", command=RunVirtualMachine)
tipsThings = tk.Text(window, height=5, width=30)
menu = tk.Menu(window)
programMenu = tk.Menu(menu, tearoff=0)
yuanMenu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="程序", menu=programMenu)
menu.add_cascade(label="", menu=yuanMenu)
programMenu.add_command(label="退出程序", command=sys.exit)
yuanMenu.add_command(label="更换源")
yuanMenu.add_command(label="修改默认源")
#window.configure(bg="white")
#ttkthemes.ThemedStyle(window).set_theme("ubuntu")
window.title("Android X86 Runner")
window.resizable(0, 0)
window.config(menu=menu)
runVirtualMachine.configure(foreground="green")
#tipsThings.configure(bg="white", foreground="black", state=tk.DISABLED)
virtualMachineList.grid(row=0, column=0, rowspan=3)
addVirtualMachine.grid(row=0, column=1)
delVirtualMachine.grid(row=0, column=2)
addVirtualMachineImage.grid(row=0, column=3)
settingVirtualMachine.grid(row=0, column=4)
runVirtualMachine.grid(row=0, column=5)
tipsThings.grid(row=2, column=1, columnspan=5, sticky=tk.W)
window.mainloop()

View File

@@ -96,7 +96,15 @@
"UEngine 键盘映射", "UEngine 键盘映射",
"UEngine 检测 CPU 是否支持运行", "UEngine 检测 CPU 是否支持运行",
"删除 UEngine 运行检查", "删除 UEngine 运行检查",
"重新安装 UEngine" "重新安装 UEngine",
{
"Name": "获取 UEngine 最高权限",
"Menu": [
"安装已经制作好的 UEngine 带最高权限的镜像",
"构建 UEngine 带最高权限的镜像到用户主目录",
"安装默认的 UEngine 镜像"
]
}
] ]
}, },
{ {
@@ -222,7 +230,15 @@
"UEngine Keyboard", "UEngine Keyboard",
"UEngine Check CPU Can Or Can't Run", "UEngine Check CPU Can Or Can't Run",
"Delete UEngine Runing Checking", "Delete UEngine Runing Checking",
"Reinstall UEngine" "Reinstall UEngine",
{
"Name": "Get UEngine Root User",
"Menu": [
"Install UEngine Image With Root User",
"Build An UEngine Image With Root User In Your Home Path",
"Install Defult UEngine Image"
]
}
] ]
}, },
{ {

View File

@@ -1,12 +1,48 @@
# uengine 运行器 1.5.1 # uengine 运行器 1.5.3
### 介绍 ### 介绍
        新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。         新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。
![1.4.3](https://storage.deepin.org/thread/202109111635389828_截图_选择区域_20210911163449.png) ![1.5.3](https://storage.deepin.org/thread/202112121231595786_截图_选择区域_20211212123106.png)
测试平台UOS 家庭版deepin 20.2.2,UOS 专业版 1040 测试平台UOS 家庭版 21.1deepin 20.3,UOS 专业版 1040
(自己美术功底太差,图标直接用 anbox 的了) (自己美术功底太差,图标直接用 anbox 的了)
## 安装前必读
+ releases 里有两个 deb 包,**是一样的除了包名和打包标准不同****只能选择其中一个安装****两个都安装会产生冲突**两个deb包的作用如下
- 包名为`spark-uengine-runner`的,是旧包,按照**正常标准打包**,适用于从**星火应用商店安装**以及**从低版本即1.3.2即以下版本升级上来的用户)升级**或者**之前就安装该版本的用户**甚至**想跨平台的用户**等等
- 包名为`com.gitee.uengine.runner.spark`的,是按照**deepin/UOS的标准打包的**,适用于**之前就安装该版本并升级上来的用户**以及**希望按照该方法打包的用户**等等
+ **近期升级的 UEngine 安装时会自动把要安装的 apk 删除**,如果这个 apk 文件非常重要请**拷贝一个备份版并安装这个备份版**
### 更新内容 ### 更新内容
#### V1.5.32021-12-12DDUC11版未完全完工
##### 更新内容
**※1、修复了在 UOS 家庭版安装 apk 文件安装包信息为 None 的问题**
**※2、“添加/删除 UEngine 图标”窗口的写入按钮在目录**`~/.local/share/icons/hicolor/256x256/apps`**不存在时点击无反应参考报错1.5.3-1**
**※3、修复了“UEngine APK 应用打包器”打包的deb包的.desktop文件的**`Icon`**和**`Exec`**字段有误的问题以及使用“使用前缀uengine-dc”前缀的问题**
4、“UEngine APK 应用打包器”支持打包完后自动删除临时目录
5、“UEngine APK 应用打包器”以及“添加/删除 UEngine 图标”支持在运行出现错误时显示报错
##### 报错:
*1.5.3-1*
```bash
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
return self.func(*args)
File "/home/gfdgd_xi/Desktop/uengine-runner/main.py", line 865, in SaveDesktopLink
shutil.copy(programPath + "/defult.png", iconSavePath)
File "/usr/lib/python3.7/shutil.py", line 245, in copy
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/usr/lib/python3.7/shutil.py", line 121, in copyfile
with open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: '/home/gfdgd_xi/.local/share/icons/hicolor/256x256/apps/com.miHoYo.cloudgames.ys.png'
```
##### 截图
![1.5.3](https://storage.deepin.org/thread/202112121231595786_截图_选择区域_20211212123106.png)
#### V1.5.22021-11-28
**※1、支持安装和构建带 Root 的 UEngine 的镜像**
2、更新了反馈链接
![](https://storage.deepin.org/thread/202111281607295590_截图_选择区域_20211128160706.png)
#### V1.5.12021-10-05国庆节版 #### V1.5.12021-10-05国庆节版
**※1、精简用户界面合并安装和卸载输入框和浏览按钮等** **※1、精简用户界面合并安装和卸载输入框和浏览按钮等**
**※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)** **※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)**
@@ -16,7 +52,7 @@
6、支持删除 UEngine 程序运行检查以及重新安装 UEngine 的功能 6、支持删除 UEngine 程序运行检查以及重新安装 UEngine 的功能
7、自带有跳过家庭版必须有指定包名才能运行程序限制的脚本 7、自带有跳过家庭版必须有指定包名才能运行程序限制的脚本
8、补回依赖包“adb” 8、补回依赖包“adb”
![]() ![1.5.1](https://storage.deepin.org/thread/202110051821076836_截图_dde-desktop_20211005182021.png)
#### V1.5.02021-09-21中秋节版 #### V1.5.02021-09-21中秋节版
**没有什么实质性的功能,只是开始有多语言支持** **没有什么实质性的功能,只是开始有多语言支持**
@@ -186,12 +222,14 @@ pip3 uninstall ttkthemes
| :-: | :-: | | :-: | :-: |
| gfdgd xi | 3025613752@qq.com | | gfdgd xi | 3025613752@qq.com |
| actionchen | 917981399@qq.com | | actionchen | 917981399@qq.com |
| 柚子 | https://gitee.com/Limexb |
### 相关项目 ### 相关项目
| 项目名称 | 项目地址 | | 项目名称 | 项目地址 |
| :-: | :-:| | :-: | :-:|
| uengine-installer | https://gitee.com/Maicss/uengine-installer | | uengine-installer | https://gitee.com/Maicss/uengine-installer |
| uengine APK 打包器 | https://gitee.com/gfdgd-xi/uengine-apk-builder | | uengine APK 打包器 | https://gitee.com/gfdgd-xi/uengine-apk-builder |
| Root UEngine | https://gitee.com/Limexb/root-uengine |
### 附测试生成图标无问题列表: ### 附测试生成图标无问题列表:
**至于能不能用就不测试了,这暂时不是重点** **至于能不能用就不测试了,这暂时不是重点**

14
UpdateApkProgram.py Normal file
View File

@@ -0,0 +1,14 @@
import ttkthemes
import tkinter as tk
import tkinter.ttk as ttk
window = tk.Tk()
win = tk.Frame(window)
chooseFrame = ttk.Frame(win)
fiveStar = ttk.Radiobutton(chooseFrame, text="五星(正常安装、运行、卸载且无任何问题)")
fourStar = ttk.Radiobutton(chooseFrame, text="四星(正常安装、运行、卸载,但在运行时有小问题)")
threeStar = ttk.Radiobutton(chooseFrame, text="三星(正常安装、运行、卸载,但运行时体验不佳,很多功能有问题)")
twoStar = ttk.Radiobutton(chooseFrame, text="二星(正常安装、卸载,但运行难以使用甚至完全无法运行)")
oneStar = ttk.Radiobutton(chooseFrame, text="一星(无法正常安装、运行、卸载)")
window.mainloop()

Binary file not shown.

View File

@@ -1,10 +1,10 @@
Package: spark-uengine-runner Package: spark-uengine-runner
Version: 1.5.1 Version: 1.5.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
Priority: optional Priority: optional
Conflicts: com.gitee.uengine.runner.spark, spark-uengine-apk-builder Conflicts: com.gitee.uengine.runner.spark, spark-uengine-apk-builder
Depends: python3, python3-tk, python3-pip, aapt, uengine, python3-setuptools, deepin-terminal, curl, python3-pil, python3-pil.imagetk, python3-requests, adb, translate-shell Depends: python3, python3-tk, python3-pip, aapt, uengine, python3-setuptools, deepin-terminal, curl, python3-pil, python3-pil.imagetk, python3-requests, adb, translate-shell, python3-xlib
Description: UEngine Runner for deepin and UOS Description: UEngine Runner for deepin and UOS

View File

@@ -7,4 +7,4 @@ python3 -m pip install --upgrade requests -i http://mirrors.aliyun.com/pypi/si
# 刷新图标缓存 # 刷新图标缓存
gtk-update-icon-cache /usr/share/icons/bloom gtk-update-icon-cache /usr/share/icons/bloom
# 向服务器返回安装数加1不显示内容且忽略错误 # 向服务器返回安装数加1不显示内容且忽略错误
curl http://gfdgdxi.qicp.vip/uengine/Install.php -s > /dev/null | true curl http://120.25.153.144/uengine-runner/Install.php?Version=1.5.3 -s > /dev/null | true

View File

@@ -1,14 +1,3 @@
#!/bin/sh #!/bin/sh
# 删除软链接
rm -fv /usr/bin/uengine-runner
rm -fv /usr/bin/uengine-apk-builder
rm -fv /usr/bin/uengine-app-uninstall
rm -fv /usr/bin/uengine-app-install
rm -fv /usr/bin/uengine-clean
rm -fv /usr/bin/uengine-runner-about
rm -fv /usr/bin/uengine-keyboard
rm -fv /usr/bin/uengine-useadb
rm -fv /usr/bin/uengine-runner-launch.sh
rm -fv /usr/bin/uengine-runner-update-bug
# 刷新图标缓存 # 刷新图标缓存
gtk-update-icon-cache /usr/share/icons/bloom gtk-update-icon-cache /usr/share/icons/bloom

View File

@@ -96,7 +96,15 @@
"UEngine 键盘映射", "UEngine 键盘映射",
"UEngine 检测 CPU 是否支持运行", "UEngine 检测 CPU 是否支持运行",
"删除 UEngine 运行检查", "删除 UEngine 运行检查",
"重新安装 UEngine" "重新安装 UEngine",
{
"Name": "获取 UEngine 最高权限",
"Menu": [
"安装已经制作好的 UEngine 带最高权限的镜像",
"构建 UEngine 带最高权限的镜像到用户主目录",
"安装默认的 UEngine 镜像"
]
}
] ]
}, },
{ {
@@ -222,7 +230,15 @@
"UEngine Keyboard", "UEngine Keyboard",
"UEngine Check CPU Can Or Can't Run", "UEngine Check CPU Can Or Can't Run",
"Delete UEngine Runing Checking", "Delete UEngine Runing Checking",
"Reinstall UEngine" "Reinstall UEngine",
{
"Name": "Get UEngine Root User",
"Menu": [
"Install UEngine Image With Root User",
"Build An UEngine Image With Root User In Your Home Path",
"Install Defult UEngine Image"
]
}
] ]
}, },
{ {

View File

@@ -2,7 +2,7 @@
Categories=System; Categories=System;
Comment=UEngine 程序菜单 Comment=UEngine 程序菜单
Encoding=UTF-8 Encoding=UTF-8
Exec=/usr/bin/uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity Exec=/usr/bin/uengine launch.sh --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
Icon=/opt/apps/uengine-runner/icon.png Icon=/opt/apps/uengine-runner/icon.png
MimeType= MimeType=
Name=UEngine 程序菜单 Name=UEngine 程序菜单

View File

@@ -3,29 +3,35 @@
"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.5.1", "Version": "1.5.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",
"",
"安装APK点浏览按钮选中需要安装的APK然后点安装按钮", "安装APK点浏览按钮选中需要安装的APK然后点安装按钮",
"",
"卸载APK在卸载APK下面的输入框内输入需要卸载的APK包名点卸载按钮如果无法获取包名可以通过浏览APK文件程序自动获取包名进行卸载。", "卸载APK在卸载APK下面的输入框内输入需要卸载的APK包名点卸载按钮如果无法获取包名可以通过浏览APK文件程序自动获取包名进行卸载。",
"",
"保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可", "保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可",
"",
"重置删除UEngine数据点击菜单栏的“UEngine”的“清空UEngine数据”输入密码重启即可", "重置删除UEngine数据点击菜单栏的“UEngine”的“清空UEngine数据”输入密码重启即可",
" 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载UEngine配置了", " 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载UEngine配置了",
"",
"打开UEngine应用列表打开系统已安装的应用列表安卓界面", "打开UEngine应用列表打开系统已安装的应用列表安卓界面",
"",
"提示:", "提示:",
"1、需要你有使用 root 权限的能力;", "1、近期升级的 UEngine 安装时会自动把要安装的 apk 删除,如果这个 apk 文件非常重要请拷贝一个备份版并安装这个备份版",
"2、需要安装 UEngine 才能使用", "2、需要你有使用 root 权限的能力",
"3、提取 apk 图标的 apk 路径以“安装 apk”那栏为准;", "3、需要安装 UEngine 才能使用;",
"4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁" "4、提取 apk 图标的 apk 路径以“安装 apk”那栏为准;",
"5、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
], ],
"Update": [ "Update": [
"V1.5.3",
"※1、修复了在 UOS 家庭版安装 apk 文件安装包信息为 None 的问题",
"※2、“添加/删除 UEngine 图标”窗口的写入按钮在目录~/.local/share/icons/hicolor/256x256/apps不存在时点击无反应参考报错",
"※3、修复了“UEngine APK应用打包器”打包的deb包的.desktop文件的Icon和Exec字段有误的问题以及使用“使用前缀uengine-dc”前缀的问题",
"4、“UEngine APK应用打包器”支持打包完后自动删除临时目录",
"5、“UEngine APK应用打包器”以及“添加/删除UEngine图标”支持在运行出现错误时显示报错",
"",
"V1.5.2",
"※1、支持安装和构建带Root的UEngine的镜像",
"2、更新了反馈链接",
"",
"V1.5.1", "V1.5.1",
"※1、精简用户界面合并安装和卸载输入框和浏览按钮等", "※1、精简用户界面合并安装和卸载输入框和浏览按钮等",
"※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)", "※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)",
@@ -128,6 +134,9 @@
"……" "……"
], ],
"Time": "2021年08月30日", "Time": "2021年08月30日",
"Contribute": ["gfdgd xi<3025613752@qq.com>", "Contribute": [
"actionchen<917981399@qq.com>"] "gfdgd xi<3025613752@qq.com>",
"actionchen<917981399@qq.com>",
"柚子<https://gitee.com/Limexb>"
]
} }

View File

@@ -0,0 +1,76 @@
#!/bin/bash
#sudo apt install squashfs-tools
mkdir -p ~/temp
cd ~/temp
echo "正在下载supersu"
wget -P ~/temp http://supersuroot.org/downloads/SuperSU-v2.82-201705271822.zip
cd ..
mkdir -p ~/temp/work/dabao/extract/DEBIAN
echo "正在解压supersu"
unzip ~/temp/SuperSU-v2.82-201705271822.zip -d ~/temp/work/su
WORKDIR=~/temp/work
cd "$WORKDIR"
echo "正在下载uengine-android-image"
apt download uengine-android-image
echo "正在解压uengine-android-image"
cd dabao
dpkg-deb -x $WORKDIR/uengine-android-image*.deb extract/
dpkg-deb -e $WORKDIR/uengine-android-image*.deb extract/DEBIAN
cd ..
cp dabao/extract/usr/share/uengine/android.img android.img
echo "正在解压android镜像"
sudo unsquashfs android.img
sudo mkdir -p ./squashfs-root/system/app/SuperSU
sudo mkdir -p ./squashfs-root/system/bin/.ext/
echo "正在将supersu安装到android镜像"
sudo cp ./su/common/Superuser.apk ./squashfs-root/system/app/SuperSU/SuperSU.apk
sudo cp ./su/common/install-recovery.sh ./squashfs-root/system/etc/install-recovery.sh
sudo cp ./su/common/install-recovery.sh ./squashfs-root/system/bin/install-recovery.sh
sudo cp ./su/x64/su ./squashfs-root/system/xbin/su
sudo cp ./su/x64/su ./squashfs-root/system/bin/.ext/.su
sudo cp ./su/x64/su ./squashfs-root/system/xbin/daemonsu
sudo cp ./su/x64/supolicy ./squashfs-root/system/xbin/supolicy
sudo cp ./su/x64/libsupol.so ./squashfs-root/system/lib64/libsupol.so
sudo cp ./squashfs-root/system/bin/app_process64 ./squashfs-root/system/bin/app_process_init
sudo cp ./squashfs-root/system/bin/app_process64 ./squashfs-root/system/bin/app_process64_original
sudo cp ./squashfs-root/system/xbin/daemonsu ./squashfs-root/system/bin/app_process
sudo cp ./squashfs-root/system/xbin/daemonsu ./squashfs-root/system/bin/app_process64
sudo chmod +x ./squashfs-root/system/app/SuperSU/SuperSU.apk
sudo chmod +x ./squashfs-root/system/etc/install-recovery.sh
sudo chmod +x ./squashfs-root/system/bin/install-recovery.sh
sudo chmod +x ./squashfs-root/system/xbin/su
sudo chmod +x ./squashfs-root/system/bin/.ext/.su
sudo chmod +x ./squashfs-root/system/xbin/daemonsu
sudo chmod +x ./squashfs-root/system/xbin/supolicy
sudo chmod +x ./squashfs-root/system/lib64/libsupol.so
sudo chmod +x ./squashfs-root/system/bin/app_process_init
sudo chmod +x ./squashfs-root/system/bin/app_process64_original
sudo chmod +x ./squashfs-root/system/bin/app_process
sudo chmod +x ./squashfs-root/system/bin/app_process64
echo "正在打包android镜像"
sudo rm android.img
sudo mksquashfs squashfs-root android.img -b 131072 -comp xz -Xbcj ia64
cp android.img dabao/extract/usr/share/uengine/android.img
echo "正在打包uengine-android-image"
cd dabao/extract
find usr -type f -print0 |xargs -0 md5sum >md5sums
cd ..
mkdir build
dpkg-deb -b extract/ build/
cp build/*.deb ~/
echo "正在清理垃圾"
sudo rm -rf ~/temp
echo "已在用户主目录生成新的安装包,安装后重启即可生效"

View File

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

View File

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

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi # 作者gfdgd xi
# 版本1.4.2 # 版本1.5.3
# 更新时间2021年8月30日 # 更新时间2021年12月12日DDUC11了
# 感谢anbox、deepin 和 统信 # 感谢anbox、deepin 和 统信
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
########################################################################################### ###########################################################################################
@@ -43,12 +43,20 @@ def BuildDeb():
messagebox.showerror(title="提示", message="信息填写错误,无法继续打包 APK") messagebox.showerror(title="提示", message="信息填写错误,无法继续打包 APK")
return return
DisabledAndEnbled(True) DisabledAndEnbled(True)
threading.Thread(target=BuildApkDeb, args=(combobox1.get(),)).start() threading.Thread(target=GetBuildApkDebError, args=(combobox1.get(),)).start()
def RunCommandShow(command): def RunCommandShow(command):
TextboxAddText1("$> {}".format(command)) TextboxAddText1("$> {}".format(command))
TextboxAddText1(GetCommandReturn(command)) TextboxAddText1(GetCommandReturn(command))
def GetBuildApkDebError(apkPath):
try:
BuildApkDeb(apkPath)
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
DisabledAndEnbled(False)
def BuildApkDeb(apkPath): def BuildApkDeb(apkPath):
tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024))) tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024)))
RunCommandShow("echo '======================================New===================================='") RunCommandShow("echo '======================================New===================================='")
@@ -58,11 +66,12 @@ def BuildApkDeb(apkPath):
RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath)) RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath))
RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath)) RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath))
RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'") RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'")
apkPackageName = GetApkPackageName(apkPath) apkPackageName = GetApkPackageName(apkPath, False)
apkPackageNameNew = GetApkPackageName(apkPath, True)
apkPackageVersion = GetApkVersion(apkPath) apkPackageVersion = GetApkVersion(apkPath)
apkChineseLabel = GetApkChineseLabel(apkPath) apkChineseLabel = GetApkChineseLabel(apkPath)
apkActivityName = GetApkActivityName(apkPath) apkActivityName = GetApkActivityName(apkPath)
iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageName) iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageNameNew)
debControl = '''Package: {} debControl = '''Package: {}
Version: {} Version: {}
Architecture: all Architecture: all
@@ -70,82 +79,66 @@ Maintainer: {}
Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1) Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1)
Section: utils Section: utils
Priority: optional Priority: optional
Description: {}\n'''.format(apkPackageName, apkPackageVersion, apkChineseLabel, apkChineseLabel) Description: {}\n'''.format(apkPackageNameNew, apkPackageVersion, apkChineseLabel, apkChineseLabel)
debPostinst = '''#!/bin/sh debPostinst = '''#!/bin/sh
APK_DIR="/usr/share/uengine/apk" APK_DIR="/usr/share/uengine/apk"
APK_NAME="{}.apk" APK_NAME="{}"
APK_PATH="$APK_DIR/$APK_NAME" APK_PATH="$APK_DIR/$APK_NAME"
DESKTOP_FILE="/usr/share/applications/{}.desktop" DESKTOP_FILE="{}"
ICON_FILE="/usr/share/uengine/icons/{}.png"
if [ -f $APK_PATH ]; then if [ -f $APK_PATH ]; then
echo "Installing $APK_NAME" echo "Installing $APK_NAME"
else else
echo "ERROR: $APK_NAME file not found." echo "ERROR: $APK_NAME does not exist."
exit 1 exit 0
fi fi
session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
if test -z "$session_manager"; then if test -z "$session_manager"; then
echo "ERROR: app install failed(session-manager not start)." echo "ERROR: app install failed(session-manager is not running)."
#sudo rm -f $DESKTOP_FILE sess_dir="/usr/share/uengine/session_install"
#sudo rm -f $ICON_FILE if [ ! -d $sess_dir ]; then
#sudo rm -f "$APK_PATH" mkdir $sess_dir
exit 1 chmod 777 $sess_dir
fi
apk_name=${{APK_PATH##*/}}
fileName="$sess_dir/$apk_name"
echo $DESKTOP_FILE > $fileName
abistr=""
if test -n "$abistr"; then
abi=`echo $abistr |awk -F \= '{{print $2}}'`
echo $abi >> $fileName
fi
chmod 766 $fileName
fi fi
ret=`/usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH"` /usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH"
if [ $? -ne 0 ]; then
echo "ERROR: apk install error..."
#sudo rm -f $DESKTOP_FILE
#sudo rm -f $ICON_FILE
#sudo rm -f "$APK_PATH"
exit 1
fi
chkfail=`echo $ret |grep "Failed"`
if test -n "$chkfail" ; then
echo "ERROR: $ret"
#sudo rm -f $DESKTOP_FILE
#sudo rm -f $ICON_FILE
#sudo rm -f "$APK_PATH"
exit 1
fi
sudo rm -f "$APK_PATH" exit 0'''.format(apkPackageNameNew + ".apk", "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
exit 0'''.format(apkPackageName, apkPackageName, apkPackageName)
debPrerm = '''#!/bin/sh debPrerm = '''#!/bin/sh
APP_NAME="{}" APP_NAME="{}"
DESKTOP_FILE="{}"
session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
if test -z "$session_manager"; then if test -z "$session_manager"; then
echo "ERROR: app install failed(session-manager not start)." echo "ERROR: app uninstall failed(session-manager is not running)."
exit 1 sess_dir="/usr/share/uengine/session_uninstall"
if [ ! -d $sess_dir ]; then
mkdir $sess_dir
chmod 777 $sess_dir
fi
fileName="$sess_dir/$APP_NAME"
echo $DESKTOP_FILE > $fileName
chmod 766 $fileName
fi fi
echo "Uninstalling $APP_NAME" echo "Uninstalling $APP_NAME"
ret=`/usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"` /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"
if [ $? -ne 0 ]; then
echo "ERROR: app uninstall error..."
exit 1
fi
chkfail=`echo $ret |grep "Failed"`
if test -n "$chkfail" ; then
echo "ERROR: $ret"
exit 1
fi
cat /etc/passwd | awk -F: '$3>=1000' | cut -f 1 -d : | while read line exit 0'''.format(apkPackageName, "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
do
inifile="/home/$line/.config/uengineAppGeometry.ini"
if [ -f $inifile ]; then
sed -i "/$APP_NAME/d" $inifile
fi
done
exit 0'''.format(apkPackageName)
desktopFile = '''[Desktop Entry] desktopFile = '''[Desktop Entry]
Categories=Other; Categories=Other;
Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={} Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={}
@@ -162,20 +155,22 @@ Name={}
write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst) write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst)
RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath)) RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath))
write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm) write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm)
RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageName)) RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageNameNew))
#write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageName), desktopFile) #write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew), desktopFile)
BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel, iconSavePath, BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel, "/usr/share/uengine/icons/{}.png".format(apkPackageNameNew),
"{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageName)) "{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew))
RunCommandShow("echo '复制文件'") RunCommandShow("echo '复制文件'")
RunCommandShow("echo '写入 APK 软件图标'") RunCommandShow("echo '写入 APK 软件图标'")
SaveApkIcon(apkPath, iconSavePath) SaveApkIcon(apkPath, iconSavePath)
RunCommandShow("echo '复制 APK 文件'") RunCommandShow("echo '复制 APK 文件'")
RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageName)) RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageNameNew))
RunCommandShow("echo '正在设置文件权限……'") RunCommandShow("echo '正在设置文件权限……'")
RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath)) RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath)) RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
RunCommandShow("echo '打包 deb 到桌面……'") RunCommandShow("echo '打包 deb 到桌面……'")
RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageName, apkPackageVersion)) RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
RunCommandShow("echo '正在删除临时目录……'")
RunCommandShow("rm -rfv '{}'".format(tempPath))
RunCommandShow("echo '完成!'") RunCommandShow("echo '完成!'")
findApkHistory.append(apkPath) findApkHistory.append(apkPath)
combobox1['value'] = findApkHistory combobox1['value'] = findApkHistory
@@ -260,7 +255,7 @@ def GetApkActivityName(apkFilePath):
line = line.replace("icon=", "") line = line.replace("icon=", "")
return line return line
def GetApkPackageName(apkFilePath): def GetApkPackageName(apkFilePath, setting):
# 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数 # 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数
info = GetApkInformation(apkFilePath) info = GetApkInformation(apkFilePath)
for line in info.split('\n'): for line in info.split('\n'):
@@ -271,7 +266,7 @@ def GetApkPackageName(apkFilePath):
line = line.replace("'", "") line = line.replace("'", "")
line = line.replace(" ", "") line = line.replace(" ", "")
# 此较为特殊,因为需要判断用户是否要添加前缀 # 此较为特殊,因为需要判断用户是否要添加前缀
if qianZhui.get() == True: if setting:
return "uengine-dc-{}".format(line).lower() return "uengine-dc-{}".format(line).lower()
return line.lower() return line.lower()
@@ -294,7 +289,7 @@ def BuildUengineDesktop(packageName, activityName, showName, iconPath, savePath)
[Desktop Entry] [Desktop Entry]
Categories=app; Categories=app;
Encoding=UTF-8 Encoding=UTF-8
Exec=/usr/bin/uengine launch.sh --action=android.intent.action.MAIN --package={} --component={} Exec=/usr/bin/uengine launch --action=android.intent.action.MAIN --package={} --component={}
GenericName={} GenericName={}
Icon={} Icon={}
MimeType= MimeType=
@@ -435,7 +430,7 @@ if len(sys.argv) > 1:
# 设置窗口 # 设置窗口
style = ttkthemes.ThemedStyle(win) style = ttkthemes.ThemedStyle(win)
style.set_theme("breeze") style.set_theme("breeze")
win.attributes('-alpha', 0.5) #win.attributes('-alpha', 0.5)
win.title(title) win.title(title)
win.resizable(0, 0) win.resizable(0, 0)
win.iconphoto(False, tk.PhotoImage(file=iconPath)) win.iconphoto(False, tk.PhotoImage(file=iconPath))

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
######################################### #########################################
# 版本1.4.0 # 版本1.5.1
# 更新时间2021年08月26日 # 更新时间2021年10月06日
# Need: unix, python3-tk, python3-pip, pymouse, keyboard # Need: unix, python3-tk, python3-pip, pymouse, keyboard
######################################### #########################################
import os import os
@@ -57,8 +57,8 @@ def Mouse(key):
print(keybo[key.name]["MousePlace"]) print(keybo[key.name]["MousePlace"])
pyautogui.FAILSAFE = False pyautogui.FAILSAFE = False
#os.system(programPath + "/mouse.py {} {}".format(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])) #os.system(programPath + "/mouse.py {} {}".format(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1]))
#pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1]) pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])
pyautogui.click(1500, 800) #pyautogui.click(1500, 800)
#m.click(keybo[key.name]["MousePlace"][0],keybo[key.name]["MousePlace"][1]) #m.click(keybo[key.name]["MousePlace"][0],keybo[key.name]["MousePlace"][1])
def Setting(key): def Setting(key):

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi<3025613752@qq.com> # 作者gfdgd xi<3025613752@qq.com>
# 版本1.5.1 # 版本1.5.3
# 更新时间2021年10月05日国庆了) # 更新时间2021年12月12日DDUC11了)
# 感谢anbox、deepin 和 UOS # 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
# 更新gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com> # 更新gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com>
@@ -35,8 +35,9 @@ from getxmlimg import getsavexml
# 卸载程序 # 卸载程序
def UninstallProgram(package: "apk 包名")->"卸载程序": def UninstallProgram(package: "apk 包名")->"卸载程序":
try: try:
global fineUninstallApkHistory global fineUninstallApkHistory
Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package)) Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package))
print(Return)
if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)): if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)):
os.remove("{}/.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)): if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)):
@@ -75,7 +76,6 @@ def ButtonClick8():
threading.Thread(target=UninstallProgram, args=[path]).start() threading.Thread(target=UninstallProgram, args=[path]).start()
# 浏览窗口 # 浏览窗口
# temp strs
temppath="" temppath=""
def FindApk()->"浏览窗口": def FindApk()->"浏览窗口":
path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"]) path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"])
@@ -105,15 +105,13 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
os.makedirs("{}/.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))
print(commandReturn)
print("start install apk12") print("start install apk12")
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path)) iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path))
tempstr1 = iconSavePath tempstr1 = iconSavePath
print("start install apk1") print("start install apk1")
iconSaveDir = os.path.dirname(iconSavePath) iconSaveDir = os.path.dirname(iconSavePath)
if not os.path.exists(iconSaveDir): if not os.path.exists(iconSaveDir):
os.makedirs(iconSaveDir,exist_ok=True) os.makedirs(iconSaveDir,exist_ok=True)
SaveApkIcon(path, iconSavePath) SaveApkIcon(path, iconSavePath)
print("start install apk2") print("start install apk2")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath, BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
@@ -121,6 +119,8 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
print("start install apk3") print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath, BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path))) "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)))
commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path))
print(commandReturn)
print("\nprint install complete") print("\nprint install complete")
if quit: if quit:
print(commandReturn) print(commandReturn)
@@ -170,26 +170,6 @@ def Button5Click():
def OpenUengineProgramList()->"打开“uengine 所有程序列表”": def OpenUengineProgramList()->"打开“uengine 所有程序列表”":
os.system("uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity") os.system("uengine launch --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()->"显示“提示”窗口": def helps()->"显示“提示”窗口":
global tips global tips
@@ -330,6 +310,18 @@ def GetApkPackageName(apkFilePath: "apk 所在路径")->"获取 apk 包名":
line = line.replace(" ", "") line = line.replace(" ", "")
return line return line
def InstallRootUengineImage():
if not os.path.exists:
os.mkdir("/tmp/uengine-runner")
write_txt("/tmp/uengine-runner/install.sh", "sudo dpkg -i /tmp/uengine-runner/u*.deb\nsudo apt install -f")
threading.Thread(target=os.system, args=["deepin-terminal -C \"wget -P '/tmp/uengine-runner' 'https://hub.fastgit.org/gfdgd-xi/uengine-runner/releases/download/U1.1.14/uengine-android-image_1.1.14_amd64.deb' && pkexec bash '/tmp/uengine-runner/install.sh'\""]).start()
def BuildRootUengineImage():
threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/root-uengine.sh")]).start()
def ReinstallUengineImage():
threading.Thread(target=os.system, args=["deepin-terminal -e ''pkexec apt reinstall uengine-android-image"]).start()
# 生成 uengine 启动文件到桌面 # 生成 uengine 启动文件到桌面
def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面": def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面":
things = '''[Desktop Entry] things = '''[Desktop Entry]
@@ -520,10 +512,6 @@ def SaveInstallUengineApp():
def UengineCheckCpu(): def UengineCheckCpu():
english = GetCommandReturn("uengine check-features") english = GetCommandReturn("uengine check-features")
#chinese = GetCommandReturn("trans -b \"{}\"".format(english)) # 获取中文翻译
#for i in chinese.split("\n"): # 删除提示
# if "Did you mean:" in i:
# chinese = chinese.replace(i, "").replace("\n", "")
messagebox.showinfo(title="提示", message="{}".format(english)) messagebox.showinfo(title="提示", message="{}".format(english))
# 获取用户主目录 # 获取用户主目录
@@ -870,31 +858,42 @@ class AddNewUengineDesktopLink():
# 添加快捷方式 # 添加快捷方式
def SaveDesktopLink(): def SaveDesktopLink():
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())): try:
if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"): if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
return if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"):
global activityName return
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get()) if not os.path.exists("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home())):
shutil.copy(programPath + "/defult.png", iconSavePath) os.makedirs("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home()))
BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath, global activityName
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())) iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get())
BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath, shutil.copy(programPath + "/defult.png", iconSavePath)
"{}/{}.desktop".format(get_desktop_path(), packageName.get())) BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
AddNewUengineDesktopLink.SaveHistory() "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
messagebox.showinfo(title="提示", message="创建完毕!") BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
"{}/{}.desktop".format(get_desktop_path(), packageName.get()))
AddNewUengineDesktopLink.SaveHistory()
messagebox.showinfo(title="提示", message="创建完毕!")
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
# 删除快捷方式 # 删除快捷方式
def DelDesktopLink(): 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: try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())) global packageName
AddNewUengineDesktopLink.SaveHistory() if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
messagebox.showinfo(title="提示", message="已删除") messagebox.showerror(title="错误", message="此包名对应的 UEngine 桌面快捷方式不存在!")
return
if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"):
return
try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
AddNewUengineDesktopLink.SaveHistory()
messagebox.showinfo(title="提示", message="已删除")
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
except: except:
traceback.print_exc() traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc()) messagebox.showerror(title="错误", message=traceback.format_exc())
@@ -967,7 +966,7 @@ Tk 版本 :{}
程序官网 {} 程序官网 {}
系统版本 :{} 系统版本 : {}
©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y")) ©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y"))
tips = "\n".join(information["Tips"]) tips = "\n".join(information["Tips"])
@@ -1161,6 +1160,7 @@ uengineInternet = tk.Menu(uengine, tearoff=0, background="white")
uengineIcon = tk.Menu(uengine, tearoff=0, background="white") uengineIcon = tk.Menu(uengine, tearoff=0, background="white")
uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white") uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white")
uengineData = tk.Menu(uengine, tearoff=0, background="white") uengineData = tk.Menu(uengine, tearoff=0, background="white")
uengineRoot = tk.Menu(uengine, tearoff=0, background="white")
menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu) menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu)
menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb) menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb)
@@ -1199,6 +1199,7 @@ uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"
uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData) uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData)
uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck) uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck)
uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine) uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine)
uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"], menu=uengineRoot)
help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL) # 设置“程序官网”项 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL) # 设置“程序官网”项
help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload) # 设置“程序官网”项 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload) # 设置“程序官网”项
@@ -1231,6 +1232,11 @@ uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["M
uengineData.add_separator() uengineData.add_separator()
uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean) uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean)
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][0], command=InstallRootUengineImage)
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][1], command=BuildRootUengineImage)
uengineRoot.add_separator()
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][2], command=ReinstallUengineImage)
menu.configure(activebackground="dodgerblue") menu.configure(activebackground="dodgerblue")
help.configure(activebackground="dodgerblue") help.configure(activebackground="dodgerblue")
adb.configure(activebackground="dodgerblue") adb.configure(activebackground="dodgerblue")
@@ -1270,11 +1276,6 @@ FrmInstall.grid(row=0, column=1,padx=3, rowspan=3)
BtnFindApk.grid(row=0, column=0) BtnFindApk.grid(row=0, column=0)
BtnInstall.grid(row=0, column=1) 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=1, column=0) BtnUninstall.grid(row=1, column=0)
BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2) BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2)

View File

@@ -28,7 +28,7 @@ def Update(name, stars, contact, things, version):
"Version": version "Version": version
} }
try: try:
messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vZ2ZkZ2R4aS5xaWNwLnZpcC91ZW5naW5lL2J1Zy91cGxvYWQucGhw").decode("utf-8")), data=data).text) messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vMTIwLjI1LjE1My4xNDQvdWVuZ2luZS1ydW5uZXIvYnVnL3VwbG9hZC5waHA=").decode("utf-8")), data=data).text)
except: except:
traceback.print_exc() traceback.print_exc()
messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc())) messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc()))
@@ -66,14 +66,14 @@ starValue.set("5分")
name = ttk.Label(win, text="你的昵称:") name = ttk.Label(win, text="你的昵称:")
nameThings = ttk.Entry(win, width=25) nameThings = ttk.Entry(win, width=25)
contact = ttk.Label(win, text="联系方式:") contact = ttk.Label(win, text="联系方式(电子邮箱)")
contactThings = ttk.Entry(win, width=25) contactThings = ttk.Entry(win, width=25)
star = ttk.Label(win, text="评分:") star = ttk.Label(win, text="评分:")
starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分") starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分")
updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):") updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):")
updateThings = tk.Text(win) updateThings = tk.Text(win, width=100)
otherUpload = ttk.Frame(win) otherUpload = ttk.Frame(win)
# 所属内容 # 所属内容
@@ -106,7 +106,7 @@ starMenu.grid(row=0, column=5)
updateThingsTips.grid(row=1, column=0, columnspan=2) updateThingsTips.grid(row=1, column=0, columnspan=2)
updateThings.grid(row=2, column=0, columnspan=6) updateThings.grid(row=2, column=0, columnspan=6)
otherUpload.grid(row=3, column=0, columnspan=4) otherUpload.grid(row=3, column=0, columnspan=4, sticky=tk.W)
updateButton.grid(row=3, column=5) updateButton.grid(row=3, column=5)
win.pack(expand="yes", fill="both") win.pack(expand="yes", fill="both")

View File

@@ -0,0 +1 @@
/opt/apps/uengine-runner/root-uengine.sh

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.bash">
<message>Authentication is required to Run Shell</message>
<message xml:lang="zh_CN">运行脚本需要输入密码</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">/usr/bin/bash</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

View File

@@ -8,7 +8,7 @@
<action id="com.deepin.pkexec.uengine-bridge"> <action id="com.deepin.pkexec.uengine-bridge">
<message>Authentication is required to Setting UEngine Internet Bridge</message> <message>Authentication is required to Setting UEngine Internet Bridge</message>
<message xml:lang="zh_CN">设置 UEngine 桥接需要输入密码</message> <message xml:lang="zh_CN">设置 UEngine 桥接需要输入密码</message>
<icon_name>uengine</icon_name> <icon_name>kbox</icon_name>
<defaults> <defaults>
<allow_any>no</allow_any> <allow_any>no</allow_any>
<allow_inactive>no</allow_inactive> <allow_inactive>no</allow_inactive>

View File

@@ -8,7 +8,7 @@
<action id="com.deepin.pkexec.uengine-session-launch-helper"> <action id="com.deepin.pkexec.uengine-session-launch-helper">
<message>Authentication is required to Change UEngine</message> <message>Authentication is required to Change UEngine</message>
<message xml:lang="zh_CN">设置 UEngine 需要输入密码</message> <message xml:lang="zh_CN">设置 UEngine 需要输入密码</message>
<icon_name>uengine</icon_name> <icon_name>kbox</icon_name>
<defaults> <defaults>
<allow_any>no</allow_any> <allow_any>no</allow_any>
<allow_inactive>no</allow_inactive> <allow_inactive>no</allow_inactive>

Binary file not shown.

View File

@@ -3,29 +3,35 @@
"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.5.1", "Version": "1.5.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",
"",
"安装APK点浏览按钮选中需要安装的APK然后点安装按钮", "安装APK点浏览按钮选中需要安装的APK然后点安装按钮",
"",
"卸载APK在卸载APK下面的输入框内输入需要卸载的APK包名点卸载按钮如果无法获取包名可以通过浏览APK文件程序自动获取包名进行卸载。", "卸载APK在卸载APK下面的输入框内输入需要卸载的APK包名点卸载按钮如果无法获取包名可以通过浏览APK文件程序自动获取包名进行卸载。",
"",
"保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可", "保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可",
"",
"重置删除UEngine数据点击菜单栏的“UEngine”的“清空UEngine数据”输入密码重启即可", "重置删除UEngine数据点击菜单栏的“UEngine”的“清空UEngine数据”输入密码重启即可",
" 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载UEngine配置了", " 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载UEngine配置了",
"",
"打开UEngine应用列表打开系统已安装的应用列表安卓界面", "打开UEngine应用列表打开系统已安装的应用列表安卓界面",
"",
"提示:", "提示:",
"1、需要你有使用 root 权限的能力;", "1、近期升级的 UEngine 安装时会自动把要安装的 apk 删除,如果这个 apk 文件非常重要请拷贝一个备份版并安装这个备份版",
"2、需要安装 UEngine 才能使用", "2、需要你有使用 root 权限的能力",
"3、提取 apk 图标的 apk 路径以“安装 apk”那栏为准;", "3、需要安装 UEngine 才能使用;",
"4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁" "4、提取 apk 图标的 apk 路径以“安装 apk”那栏为准;",
"5、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
], ],
"Update": [ "Update": [
"V1.5.3",
"※1、修复了在 UOS 家庭版安装 apk 文件安装包信息为 None 的问题",
"※2、“添加/删除 UEngine 图标”窗口的写入按钮在目录~/.local/share/icons/hicolor/256x256/apps不存在时点击无反应参考报错",
"※3、修复了“UEngine APK应用打包器”打包的deb包的.desktop文件的Icon和Exec字段有误的问题以及使用“使用前缀uengine-dc”前缀的问题",
"4、“UEngine APK应用打包器”支持打包完后自动删除临时目录",
"5、“UEngine APK应用打包器”以及“添加/删除UEngine图标”支持在运行出现错误时显示报错",
"",
"V1.5.2",
"※1、支持安装和构建带Root的UEngine的镜像",
"2、更新了反馈链接",
"",
"V1.5.1", "V1.5.1",
"※1、精简用户界面合并安装和卸载输入框和浏览按钮等", "※1、精简用户界面合并安装和卸载输入框和浏览按钮等",
"※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)", "※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)",
@@ -128,6 +134,9 @@
"……" "……"
], ],
"Time": "2021年08月30日", "Time": "2021年08月30日",
"Contribute": ["gfdgd xi<3025613752@qq.com>", "Contribute": [
"actionchen<917981399@qq.com>"] "gfdgd xi<3025613752@qq.com>",
"actionchen<917981399@qq.com>",
"柚子<https://gitee.com/Limexb>"
]
} }

BIN
kbox/icon.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

21
kbox/information.json Executable file
View File

@@ -0,0 +1,21 @@
{
"Url": [
"https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner"
],
"Version": "1.0.0 For arm64",
"System": "Linuxdeepin/UOS",
"Tips": [
"提示:",
""
],
"Update": [
""
],
"Use": [
""
],
"Time": "2021年10月17日",
"Contribute": ["gfdgd xi<3025613752@qq.com>",
"actionchen<917981399@qq.com>"]
}

113
kbox/kbox-runner-update-bug Executable file
View File

@@ -0,0 +1,113 @@
#!/usr/bin/env python3
import os
import json
import base64
import requests
import ttkthemes
import traceback
import webbrowser
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.messagebox as messagebox
import urllib.parse as parse
# 读取文本文档
def readtxt(path: "路径")->"读取文本文档":
f = open(path, "r") # 设置文件对象
str = f.read() # 获取内容
f.close() # 关闭文本对象
return str # 返回结果
def Update(name, stars, contact, things, version):
# post 内容
data = {
"Name": name,
"Starts": stars,
"Contact": contact,
"Things": things,
"Version": version
}
try:
messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vZ2ZkZ2R4aS5xaWNwLnZpcC91ZW5naW5lL2J1Zy91cGxvYWQucGhw").decode("utf-8")), data=data).text)
except:
traceback.print_exc()
messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc()))
def UpdateButtonClick():
#判断是否为空
if nameThings.get() == "" or starValue.get() == "" or contactThings.get() == "" or updateThings.get(1.0, "end").replace(" ", "").replace("\n", "") == "":
messagebox.showerror(title="错误", message="反馈信息未填写完整!")
return
Update(name=nameThings.get(), stars=starValue.get(), contact=contactThings.get(), things=updateThings.get(1.0, "end"), version=version)
def OpenGiteeIssues():
webbrowser.open_new_tab("https://gitee.com/gfdgd-xi/uengine-runner/issues")
def OpenGithubIssues():
webbrowser.open_new_tab("https://github.com/gfdgd-xi/uengine-runner/issues")
###########################
# 程序信息
###########################
iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0])
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
information = json.loads(readtxt(programPath + "/information.json"))
version = information["Version"]
###########################
# 窗口创建
###########################
window = tk.Tk()
win = ttk.Frame()
starValue = tk.StringVar()
starValue.set("5分")
name = ttk.Label(win, text="你的昵称:")
nameThings = ttk.Entry(win, width=25)
contact = ttk.Label(win, text="联系方式:")
contactThings = ttk.Entry(win, width=25)
star = ttk.Label(win, text="评分:")
starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分")
updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):")
updateThings = tk.Text(win)
otherUpload = ttk.Frame(win)
# 所属内容
tips = ttk.Label(otherUpload, text="如果无法正常反馈,可以用其他方式反馈:")
giteeButton = ttk.Button(otherUpload, text="Gitee Issues", command=OpenGiteeIssues)
githubButton = ttk.Button(otherUpload, text="Github Issues", command=OpenGithubIssues)
updateButton = ttk.Button(win, text="提交", command=UpdateButtonClick)
# 设置窗口
style = ttkthemes.ThemedStyle(window)
style.set_theme("breeze")
window.title("KBox 运行器 {} 问题/建议反馈".format(version))
window.resizable(0, 0)
window.iconphoto(False, tk.PhotoImage(file=iconPath))
tips.grid(row=0, column=0)
giteeButton.grid(row=0, column=1)
githubButton.grid(row=0, column=2)
name.grid(row=0, column=0)
nameThings.grid(row=0, column=1)
contact.grid(row=0, column=2)
contactThings.grid(row=0, column=3)
star.grid(row=0, column=4)
starMenu.grid(row=0, column=5)
updateThingsTips.grid(row=1, column=0, columnspan=2)
updateThings.grid(row=2, column=0, columnspan=6)
otherUpload.grid(row=3, column=0, columnspan=4)
updateButton.grid(row=3, column=5)
win.pack(expand="yes", fill="both")
window.mainloop()

482
kbox/main.py Executable file
View File

@@ -0,0 +1,482 @@
#!/usr/bin/env python3
# 使用系统默认的 python3 运行
###########################################################################################
# 作者gfdgd xi<3025613752@qq.com>
# 版本1.5.2
# 更新时间2021年10月16日国庆了
# 感谢kbox 和 UOS
# 基于 Python3 的 tkinter 构建
# 更新gfdgd xi<3025613752@qq.com>、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
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/kbox-runner/FindApk.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件
except:
pass
# 安装应用
def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
try:
print("start install apk")
global findApkHistory
commandReturn = GetCommandReturn("pkexec android-appmgr.sh install '{}'".format(path))
print(commandReturn)
print("start install apk1")
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/kbox-runner/FindApkHistory.json", str(json.dumps(ListToDictionary(findApkHistory)))) # 将历史记录的数组转换为字典并写入
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
DisabledAndEnbled(False)
# 安装按钮事件
def Button3Install():
if ComboInstallPath.get() is "" or not os.path.exists(ComboInstallPath.get()):
messagebox.showerror(title="提示", message="信息没有填写完整或错误,无法继续安装 APK")
return
DisabledAndEnbled(True)
threading.Thread(target=InstallApk, args=(ComboInstallPath.get(),)).start()
# 禁用或启动所有控件
def DisabledAndEnbled(choose: "启动或者禁用")->"禁用或启动所有控件":
userChoose = {True: tk.DISABLED, False: tk.NORMAL}
a = userChoose[choose]
ComboInstallPath.configure(state=a)
BtnFindApk.configure(state=a)
BtnInstall.configure(state=a)
BtnShowUengineApp.configure(state=a)
LabApkPath.configure(state=a)
# 需引入 subprocess
# 运行系统命令并获取返回值
def GetCommandReturn(cmd: "命令")->"运行系统命令并获取返回值":
# cmd 是要获取输出的命令
return subprocess.getoutput(cmd)
def GetSystemVersion():
systemInformation = readtxt("/etc/os-release")
for systemInformation in systemInformation.split('\n'):
if "PRETTY_NAME=" in systemInformation:
return systemInformation.replace("PRETTY_NAME=", "").replace('"', '')
# 打开所有窗口事件
def Button5Click():
threading.Thread(target=OpenUengineProgramList).start()
# 打开“uengine 所有程序列表”
def OpenUengineProgramList()->"打开“uengine 所有程序列表”":
os.system("uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity")
# 打开程序官网
def 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/kbox-runner")
ReStartProgram()
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
# 获取用户主目录
def get_home()->"获取用户主目录":
return os.path.expanduser('~')
# 获取用户桌面目录
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 # 返回目录
# 数组转字典
def ListToDictionary(list: "需要转换的数组")->"数组转字典":
dictionary = {}
for i in range(len(list)):
dictionary[i] = list[i]
return dictionary
# 读取文本文档
def readtxt(path: "路径")->"读取文本文档":
f = open(path, "r") # 设置文件对象
str = f.read() # 获取内容
f.close() # 关闭文本对象
return str # 返回结果
# 写入文本文档
def write_txt(path: "路径", things: "内容")->"写入文本文档":
TxtDir = os.path.dirname(path)
print(TxtDir)
if not os.path.exists(TxtDir):
os.makedirs(TxtDir,exist_ok=True)
file = open(path, 'w', encoding='UTF-8') # 设置文件对象
file.write(things) # 写入文本
file.close() # 关闭文本对象
# 获取 aapt 的所有信息
def GetApkInformation(apkFilePath: "apk 所在路径")->"获取 aapt 的所有信息":
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
# 获取 apk Activity
def GetApkActivityName(apkFilePath: "apk 所在路径")->"获取 apk Activity":
info = GetApkInformation(apkFilePath)
for line in info.split('\n'):
if "launchable-activity" in line:
line = line[0: line.index("label='")]
line = line.replace("launchable-activity: ", "")
line = line.replace("'", "")
line = line.replace(" ", "")
line = line.replace("name=", "")
line = line.replace("label=", "")
line = line.replace("icon=", "")
return line
# 获取 apk 包名
def GetApkPackageName(apkFilePath: "apk 所在路径")->"获取 apk 包名":
info = GetApkInformation(apkFilePath)
for line in info.split('\n'):
if "package:" in line:
line = line[0: line.index("versionCode='")]
line = line.replace("package:", "")
line = line.replace("name=", "")
line = line.replace("'", "")
line = line.replace(" ", "")
return line
# 获取软件的中文名称
def 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 get_home()->"获取用户主目录":
return os.path.expanduser('~')
def UengineRunnerBugUpload():
threading.Thread(target=os.system, args=[programPath + "/kbox-runner-update-bug"]).start()
def GetApkVersion(apkFilePath):
info = GetApkInformation(apkFilePath)
for line in info.split('\n'):
if "package:" in line:
if "compileSdkVersion='" in line:
line = line.replace(line[line.index("compileSdkVersion='"): -1], "")
if "platform" in line:
line = line.replace(line[line.index("platform"): -1], "")
line = line.replace(line[0: line.index("versionName='")], "")
line = line.replace("versionName='", "")
line = line.replace("'", "")
line = line.replace(" ", "")
return line
###########################
# 程序信息
###########################
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")
SystemVersion = GetSystemVersion()
about = '''介绍 :一个基于 Python3 的 tkinter 制作的 KBox 运行器在新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为UOS上的KBox安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。
版本 {}
适用平台 {}
Tk 版本 :{}
程序官网 {}
系统版本 :{}
©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y"))
tips = "\n".join(information["Tips"])
updateThingsString = "\n".join(information["Update"])
title = "KBox 安装器 {}".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"])
###########################
# 加载配置
###########################
if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
if not os.path.exists(get_home() + "/.config/uengine-runner"): # 如果没有配置文件夹
os.makedirs(get_home() + "/.config/uengine-runner") # 创建配置文件夹
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkNameHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkNameHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkActivityHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkActivityHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindUninstallApkHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindUninstallApkHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkName.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApkName.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindApk.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindApk.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/FindUninstallApk.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/FindUninstallApk.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/SaveApkIcon.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/SaveApkIcon.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/uengine-runner/SaveApk.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/uengine-runner/SaveApk.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
###########################
# 设置变量
###########################
findApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkHistory.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 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)
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)
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.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)
LabApkPath = ttk.Label(window, text="安装 APK")
ComboInstallPath = ttk.Combobox(window, width=50)
BtnFindApk = ttk.Button(FrmInstall, text="浏览", command=FindApk)
BtnInstall = ttk.Button(FrmInstall, text="安装", command=Button3Install)
BtnShowUengineApp = ttk.Button(window, text="打开程序列表", command=Button5Click)
# 设置菜单栏
menu = tk.Menu(window, background="white")
programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏
help = tk.Menu(menu, tearoff=0, background="white") # 设置“帮助”菜单栏
menu.add_cascade(label="程序", menu=programmenu)
menu.add_cascade(label="关于", menu=help)
programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory)
programmenu.add_separator() # 设置分界线
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”
help.add_command(label="程序官网", command=OpenProgramURL) # 设置“程序官网”项
help.add_command(label="反馈程序问题和建议", command=UengineRunnerBugUpload) # 设置“程序官网”项
help.add_command(label="关于", command=showhelp) # 设置“关于这个程序”项
menu.configure(activebackground="dodgerblue")
help.configure(activebackground="dodgerblue")
programmenu.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])
ComboInstallPath.set(sys.argv[2])
print("Unstall Path: " + sys.argv[2])
else:
print("Command Format Error")
except:
print("Not Command Or Command Format Error")
# 显示控件
win.config(menu=menu) # 显示菜单栏
LabApkPath.grid(row=0, column=0,sticky= tk.W,padx=3)
ComboInstallPath.grid(row=1, column=0,padx=3)
FrmInstall.grid(row=1, column=1,padx=3, rowspan=1)
BtnFindApk.grid(row=0, column=0)
BtnInstall.grid(row=0, column=1)
BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2)
window.pack()
win.mainloop()

117
main.py
View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi<3025613752@qq.com> # 作者gfdgd xi<3025613752@qq.com>
# 版本1.5.1 # 版本1.5.3
# 更新时间2021年10月05日国庆了) # 更新时间2021年12月12日DDUC11了)
# 感谢anbox、deepin 和 UOS # 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
# 更新gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com> # 更新gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com>
@@ -35,8 +35,9 @@ from getxmlimg import getsavexml
# 卸载程序 # 卸载程序
def UninstallProgram(package: "apk 包名")->"卸载程序": def UninstallProgram(package: "apk 包名")->"卸载程序":
try: try:
global fineUninstallApkHistory global fineUninstallApkHistory
Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package)) Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package))
print(Return)
if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)): if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)):
os.remove("{}/.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)): if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)):
@@ -75,7 +76,6 @@ def ButtonClick8():
threading.Thread(target=UninstallProgram, args=[path]).start() threading.Thread(target=UninstallProgram, args=[path]).start()
# 浏览窗口 # 浏览窗口
# temp strs
temppath="" temppath=""
def FindApk()->"浏览窗口": def FindApk()->"浏览窗口":
path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"]) path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"])
@@ -105,15 +105,13 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
os.makedirs("{}/.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))
print(commandReturn)
print("start install apk12") print("start install apk12")
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path)) iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path))
tempstr1 = iconSavePath tempstr1 = iconSavePath
print("start install apk1") print("start install apk1")
iconSaveDir = os.path.dirname(iconSavePath) iconSaveDir = os.path.dirname(iconSavePath)
if not os.path.exists(iconSaveDir): if not os.path.exists(iconSaveDir):
os.makedirs(iconSaveDir,exist_ok=True) os.makedirs(iconSaveDir,exist_ok=True)
SaveApkIcon(path, iconSavePath) SaveApkIcon(path, iconSavePath)
print("start install apk2") print("start install apk2")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath, BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
@@ -121,6 +119,8 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
print("start install apk3") print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath, BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path))) "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)))
commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path))
print(commandReturn)
print("\nprint install complete") print("\nprint install complete")
if quit: if quit:
print(commandReturn) print(commandReturn)
@@ -170,26 +170,6 @@ def Button5Click():
def OpenUengineProgramList()->"打开“uengine 所有程序列表”": def OpenUengineProgramList()->"打开“uengine 所有程序列表”":
os.system("uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity") os.system("uengine launch --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()->"显示“提示”窗口": def helps()->"显示“提示”窗口":
global tips global tips
@@ -330,6 +310,18 @@ def GetApkPackageName(apkFilePath: "apk 所在路径")->"获取 apk 包名":
line = line.replace(" ", "") line = line.replace(" ", "")
return line return line
def InstallRootUengineImage():
if not os.path.exists:
os.mkdir("/tmp/uengine-runner")
write_txt("/tmp/uengine-runner/install.sh", "sudo dpkg -i /tmp/uengine-runner/u*.deb\nsudo apt install -f")
threading.Thread(target=os.system, args=["deepin-terminal -C \"wget -P '/tmp/uengine-runner' 'https://hub.fastgit.org/gfdgd-xi/uengine-runner/releases/download/U1.1.14/uengine-android-image_1.1.14_amd64.deb' && pkexec bash '/tmp/uengine-runner/install.sh'\""]).start()
def BuildRootUengineImage():
threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/root-uengine.sh")]).start()
def ReinstallUengineImage():
threading.Thread(target=os.system, args=["deepin-terminal -e ''pkexec apt reinstall uengine-android-image"]).start()
# 生成 uengine 启动文件到桌面 # 生成 uengine 启动文件到桌面
def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面": def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面":
things = '''[Desktop Entry] things = '''[Desktop Entry]
@@ -520,10 +512,6 @@ def SaveInstallUengineApp():
def UengineCheckCpu(): def UengineCheckCpu():
english = GetCommandReturn("uengine check-features") english = GetCommandReturn("uengine check-features")
#chinese = GetCommandReturn("trans -b \"{}\"".format(english)) # 获取中文翻译
#for i in chinese.split("\n"): # 删除提示
# if "Did you mean:" in i:
# chinese = chinese.replace(i, "").replace("\n", "")
messagebox.showinfo(title="提示", message="{}".format(english)) messagebox.showinfo(title="提示", message="{}".format(english))
# 获取用户主目录 # 获取用户主目录
@@ -870,31 +858,42 @@ class AddNewUengineDesktopLink():
# 添加快捷方式 # 添加快捷方式
def SaveDesktopLink(): def SaveDesktopLink():
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())): try:
if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"): if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
return if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"):
global activityName return
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get()) if not os.path.exists("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home())):
shutil.copy(programPath + "/defult.png", iconSavePath) os.makedirs("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home()))
BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath, global activityName
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())) iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get())
BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath, shutil.copy(programPath + "/defult.png", iconSavePath)
"{}/{}.desktop".format(get_desktop_path(), packageName.get())) BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
AddNewUengineDesktopLink.SaveHistory() "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
messagebox.showinfo(title="提示", message="创建完毕!") BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
"{}/{}.desktop".format(get_desktop_path(), packageName.get()))
AddNewUengineDesktopLink.SaveHistory()
messagebox.showinfo(title="提示", message="创建完毕!")
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
# 删除快捷方式 # 删除快捷方式
def DelDesktopLink(): 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: try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())) global packageName
AddNewUengineDesktopLink.SaveHistory() if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
messagebox.showinfo(title="提示", message="已删除") messagebox.showerror(title="错误", message="此包名对应的 UEngine 桌面快捷方式不存在!")
return
if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"):
return
try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
AddNewUengineDesktopLink.SaveHistory()
messagebox.showinfo(title="提示", message="已删除")
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
except: except:
traceback.print_exc() traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc()) messagebox.showerror(title="错误", message=traceback.format_exc())
@@ -967,7 +966,7 @@ Tk 版本 :{}
程序官网 {} 程序官网 {}
系统版本 :{} 系统版本 : {}
©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y")) ©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y"))
tips = "\n".join(information["Tips"]) tips = "\n".join(information["Tips"])
@@ -1161,6 +1160,7 @@ uengineInternet = tk.Menu(uengine, tearoff=0, background="white")
uengineIcon = tk.Menu(uengine, tearoff=0, background="white") uengineIcon = tk.Menu(uengine, tearoff=0, background="white")
uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white") uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white")
uengineData = tk.Menu(uengine, tearoff=0, background="white") uengineData = tk.Menu(uengine, tearoff=0, background="white")
uengineRoot = tk.Menu(uengine, tearoff=0, background="white")
menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu) menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu)
menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb) menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb)
@@ -1199,6 +1199,7 @@ uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"
uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData) uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData)
uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck) uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck)
uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine) uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine)
uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"], menu=uengineRoot)
help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL) # 设置“程序官网”项 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL) # 设置“程序官网”项
help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload) # 设置“程序官网”项 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload) # 设置“程序官网”项
@@ -1231,6 +1232,11 @@ uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["M
uengineData.add_separator() uengineData.add_separator()
uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean) uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean)
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][0], command=InstallRootUengineImage)
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][1], command=BuildRootUengineImage)
uengineRoot.add_separator()
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][2], command=ReinstallUengineImage)
menu.configure(activebackground="dodgerblue") menu.configure(activebackground="dodgerblue")
help.configure(activebackground="dodgerblue") help.configure(activebackground="dodgerblue")
adb.configure(activebackground="dodgerblue") adb.configure(activebackground="dodgerblue")
@@ -1270,11 +1276,6 @@ FrmInstall.grid(row=0, column=1,padx=3, rowspan=3)
BtnFindApk.grid(row=0, column=0) BtnFindApk.grid(row=0, column=0)
BtnInstall.grid(row=0, column=1) 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=1, column=0) BtnUninstall.grid(row=1, column=0)
BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2) BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2)

View File

@@ -1,9 +1,9 @@
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.5.1 Version: 1.5.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, uengine, python3-setuptools, deepin-terminal, curl, python3-pil, python3-pil.imagetk, python3-requests, adb, translate-shell Depends: deepin-elf-verify (>= 0.0.16.7-1), python3, python3-tk, python3-pip, aapt, uengine, python3-setuptools, deepin-terminal, curl, python3-pil, python3-pil.imagetk, python3-requests, adb, translate-shell, python3-xlib
Section: utils Section: utils
Priority: optional Priority: optional
Conflicts: spark-uengine-runner, spark-uengine-apk-builder Conflicts: spark-uengine-runner, spark-uengine-apk-builder

View File

@@ -15,7 +15,8 @@ ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-keyboard
ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-useadb /usr/bin/uengine-useadb ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-useadb /usr/bin/uengine-useadb
ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-launch.sh /usr/bin/uengine-runner-launch.sh ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-launch.sh /usr/bin/uengine-runner-launch.sh
ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-update-bug /usr/bin/uengine-runner-update-bug ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner-update-bug /usr/bin/uengine-runner-update-bug
ln -s /opt/apps/com.gitee.uengine.runner.spark/files/root-uengine /usr/bin/uengine-root
# 刷新图标缓存 # 刷新图标缓存
#gtk-update-icon-cache /usr/share/icons/bloom #gtk-update-icon-cache /usr/share/icons/bloom
# 向服务器返回安装数加1不显示内容且忽略错误 # 向服务器返回安装数加1不显示内容且忽略错误
curl http://gfdgdxi.qicp.vip/uengine/Install.php -s > /dev/null | true curl http://120.25.153.144/uengine-runner/Install.php?Version=1.5.3 -s > /dev/null | true

View File

@@ -96,7 +96,15 @@
"UEngine 键盘映射", "UEngine 键盘映射",
"UEngine 检测 CPU 是否支持运行", "UEngine 检测 CPU 是否支持运行",
"删除 UEngine 运行检查", "删除 UEngine 运行检查",
"重新安装 UEngine" "重新安装 UEngine",
{
"Name": "获取 UEngine 最高权限",
"Menu": [
"安装已经制作好的 UEngine 带最高权限的镜像",
"构建 UEngine 带最高权限的镜像到用户主目录",
"安装默认的 UEngine 镜像"
]
}
] ]
}, },
{ {
@@ -222,7 +230,15 @@
"UEngine Keyboard", "UEngine Keyboard",
"UEngine Check CPU Can Or Can't Run", "UEngine Check CPU Can Or Can't Run",
"Delete UEngine Runing Checking", "Delete UEngine Runing Checking",
"Reinstall UEngine" "Reinstall UEngine",
{
"Name": "Get UEngine Root User",
"Menu": [
"Install UEngine Image With Root User",
"Build An UEngine Image With Root User In Your Home Path",
"Install Defult UEngine Image"
]
}
] ]
}, },
{ {

View File

@@ -2,7 +2,7 @@
Categories=System; Categories=System;
Comment=UEngine 程序菜单 Comment=UEngine 程序菜单
Encoding=UTF-8 Encoding=UTF-8
Exec=/usr/bin/uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity Exec=/usr/bin/uengine launch.sh --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
Icon=/opt/apps/uengine-runner/icon.png Icon=/opt/apps/uengine-runner/icon.png
MimeType= MimeType=
Name=UEngine 程序菜单 Name=UEngine 程序菜单

View File

@@ -3,29 +3,35 @@
"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.5.1", "Version": "1.5.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",
"",
"安装APK点浏览按钮选中需要安装的APK然后点安装按钮", "安装APK点浏览按钮选中需要安装的APK然后点安装按钮",
"",
"卸载APK在卸载APK下面的输入框内输入需要卸载的APK包名点卸载按钮如果无法获取包名可以通过浏览APK文件程序自动获取包名进行卸载。", "卸载APK在卸载APK下面的输入框内输入需要卸载的APK包名点卸载按钮如果无法获取包名可以通过浏览APK文件程序自动获取包名进行卸载。",
"",
"保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可", "保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可",
"",
"重置删除UEngine数据点击菜单栏的“UEngine”的“清空UEngine数据”输入密码重启即可", "重置删除UEngine数据点击菜单栏的“UEngine”的“清空UEngine数据”输入密码重启即可",
" 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载UEngine配置了", " 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载UEngine配置了",
"",
"打开UEngine应用列表打开系统已安装的应用列表安卓界面", "打开UEngine应用列表打开系统已安装的应用列表安卓界面",
"",
"提示:", "提示:",
"1、需要你有使用 root 权限的能力;", "1、近期升级的 UEngine 安装时会自动把要安装的 apk 删除,如果这个 apk 文件非常重要请拷贝一个备份版并安装这个备份版",
"2、需要安装 UEngine 才能使用", "2、需要你有使用 root 权限的能力",
"3、提取 apk 图标的 apk 路径以“安装 apk”那栏为准;", "3、需要安装 UEngine 才能使用;",
"4、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁" "4、提取 apk 图标的 apk 路径以“安装 apk”那栏为准;",
"5、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
], ],
"Update": [ "Update": [
"V1.5.3",
"※1、修复了在 UOS 家庭版安装 apk 文件安装包信息为 None 的问题",
"※2、“添加/删除 UEngine 图标”窗口的写入按钮在目录~/.local/share/icons/hicolor/256x256/apps不存在时点击无反应参考报错",
"※3、修复了“UEngine APK应用打包器”打包的deb包的.desktop文件的Icon和Exec字段有误的问题以及使用“使用前缀uengine-dc”前缀的问题",
"4、“UEngine APK应用打包器”支持打包完后自动删除临时目录",
"5、“UEngine APK应用打包器”以及“添加/删除UEngine图标”支持在运行出现错误时显示报错",
"",
"V1.5.2",
"※1、支持安装和构建带Root的UEngine的镜像",
"2、更新了反馈链接",
"",
"V1.5.1", "V1.5.1",
"※1、精简用户界面合并安装和卸载输入框和浏览按钮等", "※1、精简用户界面合并安装和卸载输入框和浏览按钮等",
"※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)", "※2、修复安装以其的程序图标无法点击进入的问题deepin 社区版不存在此问题)",
@@ -128,6 +134,9 @@
"……" "……"
], ],
"Time": "2021年08月30日", "Time": "2021年08月30日",
"Contribute": ["gfdgd xi<3025613752@qq.com>", "Contribute": [
"actionchen<917981399@qq.com>"] "gfdgd xi<3025613752@qq.com>",
"actionchen<917981399@qq.com>",
"柚子<https://gitee.com/Limexb>"
]
} }

View File

@@ -0,0 +1,76 @@
#!/bin/bash
#sudo apt install squashfs-tools
mkdir -p ~/temp
cd ~/temp
echo "正在下载supersu"
wget -P ~/temp http://supersuroot.org/downloads/SuperSU-v2.82-201705271822.zip
cd ..
mkdir -p ~/temp/work/dabao/extract/DEBIAN
echo "正在解压supersu"
unzip ~/temp/SuperSU-v2.82-201705271822.zip -d ~/temp/work/su
WORKDIR=~/temp/work
cd "$WORKDIR"
echo "正在下载uengine-android-image"
apt download uengine-android-image
echo "正在解压uengine-android-image"
cd dabao
dpkg-deb -x $WORKDIR/uengine-android-image*.deb extract/
dpkg-deb -e $WORKDIR/uengine-android-image*.deb extract/DEBIAN
cd ..
cp dabao/extract/usr/share/uengine/android.img android.img
echo "正在解压android镜像"
sudo unsquashfs android.img
sudo mkdir -p ./squashfs-root/system/app/SuperSU
sudo mkdir -p ./squashfs-root/system/bin/.ext/
echo "正在将supersu安装到android镜像"
sudo cp ./su/common/Superuser.apk ./squashfs-root/system/app/SuperSU/SuperSU.apk
sudo cp ./su/common/install-recovery.sh ./squashfs-root/system/etc/install-recovery.sh
sudo cp ./su/common/install-recovery.sh ./squashfs-root/system/bin/install-recovery.sh
sudo cp ./su/x64/su ./squashfs-root/system/xbin/su
sudo cp ./su/x64/su ./squashfs-root/system/bin/.ext/.su
sudo cp ./su/x64/su ./squashfs-root/system/xbin/daemonsu
sudo cp ./su/x64/supolicy ./squashfs-root/system/xbin/supolicy
sudo cp ./su/x64/libsupol.so ./squashfs-root/system/lib64/libsupol.so
sudo cp ./squashfs-root/system/bin/app_process64 ./squashfs-root/system/bin/app_process_init
sudo cp ./squashfs-root/system/bin/app_process64 ./squashfs-root/system/bin/app_process64_original
sudo cp ./squashfs-root/system/xbin/daemonsu ./squashfs-root/system/bin/app_process
sudo cp ./squashfs-root/system/xbin/daemonsu ./squashfs-root/system/bin/app_process64
sudo chmod +x ./squashfs-root/system/app/SuperSU/SuperSU.apk
sudo chmod +x ./squashfs-root/system/etc/install-recovery.sh
sudo chmod +x ./squashfs-root/system/bin/install-recovery.sh
sudo chmod +x ./squashfs-root/system/xbin/su
sudo chmod +x ./squashfs-root/system/bin/.ext/.su
sudo chmod +x ./squashfs-root/system/xbin/daemonsu
sudo chmod +x ./squashfs-root/system/xbin/supolicy
sudo chmod +x ./squashfs-root/system/lib64/libsupol.so
sudo chmod +x ./squashfs-root/system/bin/app_process_init
sudo chmod +x ./squashfs-root/system/bin/app_process64_original
sudo chmod +x ./squashfs-root/system/bin/app_process
sudo chmod +x ./squashfs-root/system/bin/app_process64
echo "正在打包android镜像"
sudo rm android.img
sudo mksquashfs squashfs-root android.img -b 131072 -comp xz -Xbcj ia64
cp android.img dabao/extract/usr/share/uengine/android.img
echo "正在打包uengine-android-image"
cd dabao/extract
find usr -type f -print0 |xargs -0 md5sum >md5sums
cd ..
mkdir build
dpkg-deb -b extract/ build/
cp build/*.deb ~/
echo "正在清理垃圾"
sudo rm -rf ~/temp
echo "已在用户主目录生成新的安装包,安装后重启即可生效"

View File

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

View File

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

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi # 作者gfdgd xi
# 版本1.4.2 # 版本1.5.3
# 更新时间2021年8月30日 # 更新时间2021年12月12日DDUC11了
# 感谢anbox、deepin 和 统信 # 感谢anbox、deepin 和 统信
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
########################################################################################### ###########################################################################################
@@ -43,12 +43,20 @@ def BuildDeb():
messagebox.showerror(title="提示", message="信息填写错误,无法继续打包 APK") messagebox.showerror(title="提示", message="信息填写错误,无法继续打包 APK")
return return
DisabledAndEnbled(True) DisabledAndEnbled(True)
threading.Thread(target=BuildApkDeb, args=(combobox1.get(),)).start() threading.Thread(target=GetBuildApkDebError, args=(combobox1.get(),)).start()
def RunCommandShow(command): def RunCommandShow(command):
TextboxAddText1("$> {}".format(command)) TextboxAddText1("$> {}".format(command))
TextboxAddText1(GetCommandReturn(command)) TextboxAddText1(GetCommandReturn(command))
def GetBuildApkDebError(apkPath):
try:
BuildApkDeb(apkPath)
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
DisabledAndEnbled(False)
def BuildApkDeb(apkPath): def BuildApkDeb(apkPath):
tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024))) tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024)))
RunCommandShow("echo '======================================New===================================='") RunCommandShow("echo '======================================New===================================='")
@@ -58,11 +66,12 @@ def BuildApkDeb(apkPath):
RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath)) RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath))
RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath)) RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath))
RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'") RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'")
apkPackageName = GetApkPackageName(apkPath) apkPackageName = GetApkPackageName(apkPath, False)
apkPackageNameNew = GetApkPackageName(apkPath, True)
apkPackageVersion = GetApkVersion(apkPath) apkPackageVersion = GetApkVersion(apkPath)
apkChineseLabel = GetApkChineseLabel(apkPath) apkChineseLabel = GetApkChineseLabel(apkPath)
apkActivityName = GetApkActivityName(apkPath) apkActivityName = GetApkActivityName(apkPath)
iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageName) iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageNameNew)
debControl = '''Package: {} debControl = '''Package: {}
Version: {} Version: {}
Architecture: all Architecture: all
@@ -70,82 +79,66 @@ Maintainer: {}
Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1) Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1)
Section: utils Section: utils
Priority: optional Priority: optional
Description: {}\n'''.format(apkPackageName, apkPackageVersion, apkChineseLabel, apkChineseLabel) Description: {}\n'''.format(apkPackageNameNew, apkPackageVersion, apkChineseLabel, apkChineseLabel)
debPostinst = '''#!/bin/sh debPostinst = '''#!/bin/sh
APK_DIR="/usr/share/uengine/apk" APK_DIR="/usr/share/uengine/apk"
APK_NAME="{}.apk" APK_NAME="{}"
APK_PATH="$APK_DIR/$APK_NAME" APK_PATH="$APK_DIR/$APK_NAME"
DESKTOP_FILE="/usr/share/applications/{}.desktop" DESKTOP_FILE="{}"
ICON_FILE="/usr/share/uengine/icons/{}.png"
if [ -f $APK_PATH ]; then if [ -f $APK_PATH ]; then
echo "Installing $APK_NAME" echo "Installing $APK_NAME"
else else
echo "ERROR: $APK_NAME file not found." echo "ERROR: $APK_NAME does not exist."
exit 1 exit 0
fi fi
session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
if test -z "$session_manager"; then if test -z "$session_manager"; then
echo "ERROR: app install failed(session-manager not start)." echo "ERROR: app install failed(session-manager is not running)."
#sudo rm -f $DESKTOP_FILE sess_dir="/usr/share/uengine/session_install"
#sudo rm -f $ICON_FILE if [ ! -d $sess_dir ]; then
#sudo rm -f "$APK_PATH" mkdir $sess_dir
exit 1 chmod 777 $sess_dir
fi
apk_name=${{APK_PATH##*/}}
fileName="$sess_dir/$apk_name"
echo $DESKTOP_FILE > $fileName
abistr=""
if test -n "$abistr"; then
abi=`echo $abistr |awk -F \= '{{print $2}}'`
echo $abi >> $fileName
fi
chmod 766 $fileName
fi fi
ret=`/usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH"` /usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH"
if [ $? -ne 0 ]; then
echo "ERROR: apk install error..."
#sudo rm -f $DESKTOP_FILE
#sudo rm -f $ICON_FILE
#sudo rm -f "$APK_PATH"
exit 1
fi
chkfail=`echo $ret |grep "Failed"`
if test -n "$chkfail" ; then
echo "ERROR: $ret"
#sudo rm -f $DESKTOP_FILE
#sudo rm -f $ICON_FILE
#sudo rm -f "$APK_PATH"
exit 1
fi
sudo rm -f "$APK_PATH" exit 0'''.format(apkPackageNameNew + ".apk", "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
exit 0'''.format(apkPackageName, apkPackageName, apkPackageName)
debPrerm = '''#!/bin/sh debPrerm = '''#!/bin/sh
APP_NAME="{}" APP_NAME="{}"
DESKTOP_FILE="{}"
session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
if test -z "$session_manager"; then if test -z "$session_manager"; then
echo "ERROR: app install failed(session-manager not start)." echo "ERROR: app uninstall failed(session-manager is not running)."
exit 1 sess_dir="/usr/share/uengine/session_uninstall"
if [ ! -d $sess_dir ]; then
mkdir $sess_dir
chmod 777 $sess_dir
fi
fileName="$sess_dir/$APP_NAME"
echo $DESKTOP_FILE > $fileName
chmod 766 $fileName
fi fi
echo "Uninstalling $APP_NAME" echo "Uninstalling $APP_NAME"
ret=`/usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"` /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"
if [ $? -ne 0 ]; then
echo "ERROR: app uninstall error..."
exit 1
fi
chkfail=`echo $ret |grep "Failed"`
if test -n "$chkfail" ; then
echo "ERROR: $ret"
exit 1
fi
cat /etc/passwd | awk -F: '$3>=1000' | cut -f 1 -d : | while read line exit 0'''.format(apkPackageName, "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
do
inifile="/home/$line/.config/uengineAppGeometry.ini"
if [ -f $inifile ]; then
sed -i "/$APP_NAME/d" $inifile
fi
done
exit 0'''.format(apkPackageName)
desktopFile = '''[Desktop Entry] desktopFile = '''[Desktop Entry]
Categories=Other; Categories=Other;
Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={} Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={}
@@ -162,20 +155,22 @@ Name={}
write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst) write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst)
RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath)) RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath))
write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm) write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm)
RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageName)) RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageNameNew))
#write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageName), desktopFile) #write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew), desktopFile)
BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel, iconSavePath, BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel, "/usr/share/uengine/icons/{}.png".format(apkPackageNameNew),
"{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageName)) "{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew))
RunCommandShow("echo '复制文件'") RunCommandShow("echo '复制文件'")
RunCommandShow("echo '写入 APK 软件图标'") RunCommandShow("echo '写入 APK 软件图标'")
SaveApkIcon(apkPath, iconSavePath) SaveApkIcon(apkPath, iconSavePath)
RunCommandShow("echo '复制 APK 文件'") RunCommandShow("echo '复制 APK 文件'")
RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageName)) RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageNameNew))
RunCommandShow("echo '正在设置文件权限……'") RunCommandShow("echo '正在设置文件权限……'")
RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath)) RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath)) RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
RunCommandShow("echo '打包 deb 到桌面……'") RunCommandShow("echo '打包 deb 到桌面……'")
RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageName, apkPackageVersion)) RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
RunCommandShow("echo '正在删除临时目录……'")
RunCommandShow("rm -rfv '{}'".format(tempPath))
RunCommandShow("echo '完成!'") RunCommandShow("echo '完成!'")
findApkHistory.append(apkPath) findApkHistory.append(apkPath)
combobox1['value'] = findApkHistory combobox1['value'] = findApkHistory
@@ -260,7 +255,7 @@ def GetApkActivityName(apkFilePath):
line = line.replace("icon=", "") line = line.replace("icon=", "")
return line return line
def GetApkPackageName(apkFilePath): def GetApkPackageName(apkFilePath, setting):
# 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数 # 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数
info = GetApkInformation(apkFilePath) info = GetApkInformation(apkFilePath)
for line in info.split('\n'): for line in info.split('\n'):
@@ -271,7 +266,7 @@ def GetApkPackageName(apkFilePath):
line = line.replace("'", "") line = line.replace("'", "")
line = line.replace(" ", "") line = line.replace(" ", "")
# 此较为特殊,因为需要判断用户是否要添加前缀 # 此较为特殊,因为需要判断用户是否要添加前缀
if qianZhui.get() == True: if setting:
return "uengine-dc-{}".format(line).lower() return "uengine-dc-{}".format(line).lower()
return line.lower() return line.lower()
@@ -294,7 +289,7 @@ def BuildUengineDesktop(packageName, activityName, showName, iconPath, savePath)
[Desktop Entry] [Desktop Entry]
Categories=app; Categories=app;
Encoding=UTF-8 Encoding=UTF-8
Exec=/usr/bin/uengine launch.sh --action=android.intent.action.MAIN --package={} --component={} Exec=/usr/bin/uengine launch --action=android.intent.action.MAIN --package={} --component={}
GenericName={} GenericName={}
Icon={} Icon={}
MimeType= MimeType=
@@ -435,7 +430,7 @@ if len(sys.argv) > 1:
# 设置窗口 # 设置窗口
style = ttkthemes.ThemedStyle(win) style = ttkthemes.ThemedStyle(win)
style.set_theme("breeze") style.set_theme("breeze")
win.attributes('-alpha', 0.5) #win.attributes('-alpha', 0.5)
win.title(title) win.title(title)
win.resizable(0, 0) win.resizable(0, 0)
win.iconphoto(False, tk.PhotoImage(file=iconPath)) win.iconphoto(False, tk.PhotoImage(file=iconPath))

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
######################################### #########################################
# 版本1.4.0 # 版本1.5.1
# 更新时间2021年08月26日 # 更新时间2021年10月06日
# Need: unix, python3-tk, python3-pip, pymouse, keyboard # Need: unix, python3-tk, python3-pip, pymouse, keyboard
######################################### #########################################
import os import os
@@ -57,8 +57,8 @@ def Mouse(key):
print(keybo[key.name]["MousePlace"]) print(keybo[key.name]["MousePlace"])
pyautogui.FAILSAFE = False pyautogui.FAILSAFE = False
#os.system(programPath + "/mouse.py {} {}".format(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])) #os.system(programPath + "/mouse.py {} {}".format(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1]))
#pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1]) pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])
pyautogui.click(1500, 800) #pyautogui.click(1500, 800)
#m.click(keybo[key.name]["MousePlace"][0],keybo[key.name]["MousePlace"][1]) #m.click(keybo[key.name]["MousePlace"][0],keybo[key.name]["MousePlace"][1])
def Setting(key): def Setting(key):

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi<3025613752@qq.com> # 作者gfdgd xi<3025613752@qq.com>
# 版本1.5.1 # 版本1.5.3
# 更新时间2021年10月05日国庆了) # 更新时间2021年12月12日DDUC11了)
# 感谢anbox、deepin 和 UOS # 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
# 更新gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com> # 更新gfdgd xi<3025613752@qq.com>、actionchen<917981399@qq.com>
@@ -35,8 +35,9 @@ from getxmlimg import getsavexml
# 卸载程序 # 卸载程序
def UninstallProgram(package: "apk 包名")->"卸载程序": def UninstallProgram(package: "apk 包名")->"卸载程序":
try: try:
global fineUninstallApkHistory global fineUninstallApkHistory
Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package)) Return = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(package))
print(Return)
if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)): if os.path.exists("{}/.local/share/applications/{}.desktop".format(get_home(), package)):
os.remove("{}/.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)): if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)):
@@ -75,7 +76,6 @@ def ButtonClick8():
threading.Thread(target=UninstallProgram, args=[path]).start() threading.Thread(target=UninstallProgram, args=[path]).start()
# 浏览窗口 # 浏览窗口
# temp strs
temppath="" temppath=""
def FindApk()->"浏览窗口": def FindApk()->"浏览窗口":
path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"]) path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"])
@@ -105,15 +105,13 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
os.makedirs("{}/.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))
print(commandReturn)
print("start install apk12") print("start install apk12")
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path)) iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), GetApkPackageName(path))
tempstr1 = iconSavePath tempstr1 = iconSavePath
print("start install apk1") print("start install apk1")
iconSaveDir = os.path.dirname(iconSavePath) iconSaveDir = os.path.dirname(iconSavePath)
if not os.path.exists(iconSaveDir): if not os.path.exists(iconSaveDir):
os.makedirs(iconSaveDir,exist_ok=True) os.makedirs(iconSaveDir,exist_ok=True)
SaveApkIcon(path, iconSavePath) SaveApkIcon(path, iconSavePath)
print("start install apk2") print("start install apk2")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath, BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
@@ -121,6 +119,8 @@ def InstallApk(path: "apk 路径", quit: "是否静默安装" = False):
print("start install apk3") print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath, BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path))) "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)))
commandReturn = GetCommandReturn("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(path))
print(commandReturn)
print("\nprint install complete") print("\nprint install complete")
if quit: if quit:
print(commandReturn) print(commandReturn)
@@ -170,26 +170,6 @@ def Button5Click():
def OpenUengineProgramList()->"打开“uengine 所有程序列表”": def OpenUengineProgramList()->"打开“uengine 所有程序列表”":
os.system("uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity") os.system("uengine launch --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()->"显示“提示”窗口": def helps()->"显示“提示”窗口":
global tips global tips
@@ -330,6 +310,18 @@ def GetApkPackageName(apkFilePath: "apk 所在路径")->"获取 apk 包名":
line = line.replace(" ", "") line = line.replace(" ", "")
return line return line
def InstallRootUengineImage():
if not os.path.exists:
os.mkdir("/tmp/uengine-runner")
write_txt("/tmp/uengine-runner/install.sh", "sudo dpkg -i /tmp/uengine-runner/u*.deb\nsudo apt install -f")
threading.Thread(target=os.system, args=["deepin-terminal -C \"wget -P '/tmp/uengine-runner' 'https://hub.fastgit.org/gfdgd-xi/uengine-runner/releases/download/U1.1.14/uengine-android-image_1.1.14_amd64.deb' && pkexec bash '/tmp/uengine-runner/install.sh'\""]).start()
def BuildRootUengineImage():
threading.Thread(target=os.system, args=["deepin-terminal -C \"bash '{}'\"".format(programPath + "/root-uengine.sh")]).start()
def ReinstallUengineImage():
threading.Thread(target=os.system, args=["deepin-terminal -e ''pkexec apt reinstall uengine-android-image"]).start()
# 生成 uengine 启动文件到桌面 # 生成 uengine 启动文件到桌面
def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面": def BuildUengineDesktop(packageName: "软件包名", activityName: "activity", showName: "显示名称", iconPath: "程序图标所在目录", savePath:".desktop 文件保存路径")->"生成 uengine 启动文件到桌面":
things = '''[Desktop Entry] things = '''[Desktop Entry]
@@ -520,10 +512,6 @@ def SaveInstallUengineApp():
def UengineCheckCpu(): def UengineCheckCpu():
english = GetCommandReturn("uengine check-features") english = GetCommandReturn("uengine check-features")
#chinese = GetCommandReturn("trans -b \"{}\"".format(english)) # 获取中文翻译
#for i in chinese.split("\n"): # 删除提示
# if "Did you mean:" in i:
# chinese = chinese.replace(i, "").replace("\n", "")
messagebox.showinfo(title="提示", message="{}".format(english)) messagebox.showinfo(title="提示", message="{}".format(english))
# 获取用户主目录 # 获取用户主目录
@@ -870,31 +858,42 @@ class AddNewUengineDesktopLink():
# 添加快捷方式 # 添加快捷方式
def SaveDesktopLink(): def SaveDesktopLink():
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())): try:
if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"): if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
return if not messagebox.askokcancel(title="提示", message="文件已存在,确定要覆盖吗?"):
global activityName return
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get()) if not os.path.exists("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home())):
shutil.copy(programPath + "/defult.png", iconSavePath) os.makedirs("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home()))
BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath, global activityName
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())) iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.get())
BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath, shutil.copy(programPath + "/defult.png", iconSavePath)
"{}/{}.desktop".format(get_desktop_path(), packageName.get())) BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
AddNewUengineDesktopLink.SaveHistory() "{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
messagebox.showinfo(title="提示", message="创建完毕!") BuildUengineDesktop(packageName.get(), activityName, packageName.get(), iconSavePath,
"{}/{}.desktop".format(get_desktop_path(), packageName.get()))
AddNewUengineDesktopLink.SaveHistory()
messagebox.showinfo(title="提示", message="创建完毕!")
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
# 删除快捷方式 # 删除快捷方式
def DelDesktopLink(): 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: try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())) global packageName
AddNewUengineDesktopLink.SaveHistory() if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get())):
messagebox.showinfo(title="提示", message="已删除") messagebox.showerror(title="错误", message="此包名对应的 UEngine 桌面快捷方式不存在!")
return
if not messagebox.askyesno(title="提示", message="你确定要删除吗?删除后将无法恢复!"):
return
try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.get()))
AddNewUengineDesktopLink.SaveHistory()
messagebox.showinfo(title="提示", message="已删除")
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
except: except:
traceback.print_exc() traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc()) messagebox.showerror(title="错误", message=traceback.format_exc())
@@ -967,7 +966,7 @@ Tk 版本 :{}
程序官网 {} 程序官网 {}
系统版本 :{} 系统版本 : {}
©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y")) ©2021-{}'''.format(version, goodRunSystem, tk.TkVersion, programUrl, SystemVersion, time.strftime("%Y"))
tips = "\n".join(information["Tips"]) tips = "\n".join(information["Tips"])
@@ -1161,6 +1160,7 @@ uengineInternet = tk.Menu(uengine, tearoff=0, background="white")
uengineIcon = tk.Menu(uengine, tearoff=0, background="white") uengineIcon = tk.Menu(uengine, tearoff=0, background="white")
uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white") uengineUseAdb = tk.Menu(uengine, tearoff=0, background="white")
uengineData = tk.Menu(uengine, tearoff=0, background="white") uengineData = tk.Menu(uengine, tearoff=0, background="white")
uengineRoot = tk.Menu(uengine, tearoff=0, background="white")
menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu) menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][0]["Name"], menu=programmenu)
menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb) menu.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][1]["Name"], menu=adb)
@@ -1199,6 +1199,7 @@ uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"
uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData) uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Name"], menu=uengineData)
uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck) uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][9], command=DelUengineCheck)
uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine) uengine.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][10], command=ReinstallUengine)
uengine.add_cascade(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"], menu=uengineRoot)
help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL) # 设置“程序官网”项 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][0], command=OpenProgramURL) # 设置“程序官网”项
help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload) # 设置“程序官网”项 help.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][3]["Menu"][2], command=UengineRunnerBugUpload) # 设置“程序官网”项
@@ -1231,6 +1232,11 @@ uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["M
uengineData.add_separator() uengineData.add_separator()
uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean) uengineData.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][6]["Menu"][2], command=BackUengineClean)
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][0], command=InstallRootUengineImage)
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][1], command=BuildRootUengineImage)
uengineRoot.add_separator()
uengineRoot.add_command(label=langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Menu"][2], command=ReinstallUengineImage)
menu.configure(activebackground="dodgerblue") menu.configure(activebackground="dodgerblue")
help.configure(activebackground="dodgerblue") help.configure(activebackground="dodgerblue")
adb.configure(activebackground="dodgerblue") adb.configure(activebackground="dodgerblue")
@@ -1270,11 +1276,6 @@ FrmInstall.grid(row=0, column=1,padx=3, rowspan=3)
BtnFindApk.grid(row=0, column=0) BtnFindApk.grid(row=0, column=0)
BtnInstall.grid(row=0, column=1) 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=1, column=0) BtnUninstall.grid(row=1, column=0)
BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2) BtnShowUengineApp.grid(row=2, column=0,sticky= tk.W,padx=3,pady=2)

View File

@@ -28,7 +28,7 @@ def Update(name, stars, contact, things, version):
"Version": version "Version": version
} }
try: try:
messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vZ2ZkZ2R4aS5xaWNwLnZpcC91ZW5naW5lL2J1Zy91cGxvYWQucGhw").decode("utf-8")), data=data).text) messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vMTIwLjI1LjE1My4xNDQvdWVuZ2luZS1ydW5uZXIvYnVnL3VwbG9hZC5waHA=").decode("utf-8")), data=data).text)
except: except:
traceback.print_exc() traceback.print_exc()
messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc())) messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc()))
@@ -66,14 +66,14 @@ starValue.set("5分")
name = ttk.Label(win, text="你的昵称:") name = ttk.Label(win, text="你的昵称:")
nameThings = ttk.Entry(win, width=25) nameThings = ttk.Entry(win, width=25)
contact = ttk.Label(win, text="联系方式:") contact = ttk.Label(win, text="联系方式(电子邮箱)")
contactThings = ttk.Entry(win, width=25) contactThings = ttk.Entry(win, width=25)
star = ttk.Label(win, text="评分:") star = ttk.Label(win, text="评分:")
starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分") starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分")
updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):") updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):")
updateThings = tk.Text(win) updateThings = tk.Text(win, width=100)
otherUpload = ttk.Frame(win) otherUpload = ttk.Frame(win)
# 所属内容 # 所属内容
@@ -106,7 +106,7 @@ starMenu.grid(row=0, column=5)
updateThingsTips.grid(row=1, column=0, columnspan=2) updateThingsTips.grid(row=1, column=0, columnspan=2)
updateThings.grid(row=2, column=0, columnspan=6) updateThings.grid(row=2, column=0, columnspan=6)
otherUpload.grid(row=3, column=0, columnspan=4) otherUpload.grid(row=3, column=0, columnspan=4, sticky=tk.W)
updateButton.grid(row=3, column=5) updateButton.grid(row=3, column=5)
win.pack(expand="yes", fill="both") win.pack(expand="yes", fill="both")

View File

@@ -1,59 +0,0 @@
#!/usr/bin/env python3
import os
import sys
import json
import shutil
import requests
import traceback
# 读取文本文档
def read_txt(path):
f = open(path,"r") # 设置文件对象
str = f.read() # 获取内容
f.close() # 关闭文本对象
return str # 返回结果
def GetPackageUpdateInformation():
global setting
global package
for i in allJson['Program']:
if i['Package'] == package:
return i
try:
setting = json.loads(read_txt("{}/setting.json".format(os.path.split(os.path.realpath(__file__))[0])))
except:
traceback.print_exc()
print("配置文件无法访问!")
package = setting['Package']
nowVersion = setting['Version']
try:
jsons = requests.get(setting["Url"])
except:
traceback.print_exc()
print("服务器出现错误!")
sys.exit(1)
allJson = json.loads(jsons.text)
updateInformation = GetPackageUpdateInformation()
name = updateInformation['Name']
newVersion = updateInformation['Version']
print("更新程序:{}".format(name))
print("最新版本:{}".format(newVersion))
print("目前版本:{}".format(nowVersion))
if nowVersion == newVersion:
print("目前是最新版本,无需更新!")
quit()
print("更新内容:")
print(updateInformation['New Things'])
choose = input("更新?[Y/N]")
if choose.upper() == "N":
quit()
if os.path.exists("/tmp/update-console-{}".format(package)):
shutil.rmtree("/tmp/update-console-{}".format(package))
os.mkdir("/tmp/update-console-{}".format(package))
if updateInformation["Linux App Url"][0] == None:
print("没有可用包源")
quit()
os.system("wget '{}' -P '/tmp/update-console-{}'".format(updateInformation["Linux App Url"][0], package))
os.system("sudo dpkg -i /tmp/update-console-{}/*".format(package))
os.system("sudo apt install -f -y")

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.bash">
<message>Authentication is required to Run Shell</message>
<message xml:lang="zh_CN">运行脚本需要输入密码</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">/usr/bin/bash</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

View File

@@ -8,7 +8,7 @@
<action id="com.deepin.pkexec.uengine-bridge"> <action id="com.deepin.pkexec.uengine-bridge">
<message>Authentication is required to Setting UEngine Internet Bridge</message> <message>Authentication is required to Setting UEngine Internet Bridge</message>
<message xml:lang="zh_CN">设置 UEngine 桥接需要输入密码</message> <message xml:lang="zh_CN">设置 UEngine 桥接需要输入密码</message>
<icon_name>uengine</icon_name> <icon_name>kbox</icon_name>
<defaults> <defaults>
<allow_any>no</allow_any> <allow_any>no</allow_any>
<allow_inactive>no</allow_inactive> <allow_inactive>no</allow_inactive>

View File

@@ -8,7 +8,7 @@
<action id="com.deepin.pkexec.uengine-session-launch-helper"> <action id="com.deepin.pkexec.uengine-session-launch-helper">
<message>Authentication is required to Change UEngine</message> <message>Authentication is required to Change UEngine</message>
<message xml:lang="zh_CN">设置 UEngine 需要输入密码</message> <message xml:lang="zh_CN">设置 UEngine 需要输入密码</message>
<icon_name>uengine</icon_name> <icon_name>kbox</icon_name>
<defaults> <defaults>
<allow_any>no</allow_any> <allow_any>no</allow_any>
<allow_inactive>no</allow_inactive> <allow_inactive>no</allow_inactive>

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.bash">
<message>Authentication is required to Run Shell</message>
<message xml:lang="zh_CN">运行脚本需要输入密码</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">/usr/bin/bash</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

76
root-uengine.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/bin/bash
#sudo apt install squashfs-tools
mkdir -p ~/temp
cd ~/temp
echo "正在下载supersu"
wget -P ~/temp http://supersuroot.org/downloads/SuperSU-v2.82-201705271822.zip
cd ..
mkdir -p ~/temp/work/dabao/extract/DEBIAN
echo "正在解压supersu"
unzip ~/temp/SuperSU-v2.82-201705271822.zip -d ~/temp/work/su
WORKDIR=~/temp/work
cd "$WORKDIR"
echo "正在下载uengine-android-image"
apt download uengine-android-image
echo "正在解压uengine-android-image"
cd dabao
dpkg-deb -x $WORKDIR/uengine-android-image*.deb extract/
dpkg-deb -e $WORKDIR/uengine-android-image*.deb extract/DEBIAN
cd ..
cp dabao/extract/usr/share/uengine/android.img android.img
echo "正在解压android镜像"
sudo unsquashfs android.img
sudo mkdir -p ./squashfs-root/system/app/SuperSU
sudo mkdir -p ./squashfs-root/system/bin/.ext/
echo "正在将supersu安装到android镜像"
sudo cp ./su/common/Superuser.apk ./squashfs-root/system/app/SuperSU/SuperSU.apk
sudo cp ./su/common/install-recovery.sh ./squashfs-root/system/etc/install-recovery.sh
sudo cp ./su/common/install-recovery.sh ./squashfs-root/system/bin/install-recovery.sh
sudo cp ./su/x64/su ./squashfs-root/system/xbin/su
sudo cp ./su/x64/su ./squashfs-root/system/bin/.ext/.su
sudo cp ./su/x64/su ./squashfs-root/system/xbin/daemonsu
sudo cp ./su/x64/supolicy ./squashfs-root/system/xbin/supolicy
sudo cp ./su/x64/libsupol.so ./squashfs-root/system/lib64/libsupol.so
sudo cp ./squashfs-root/system/bin/app_process64 ./squashfs-root/system/bin/app_process_init
sudo cp ./squashfs-root/system/bin/app_process64 ./squashfs-root/system/bin/app_process64_original
sudo cp ./squashfs-root/system/xbin/daemonsu ./squashfs-root/system/bin/app_process
sudo cp ./squashfs-root/system/xbin/daemonsu ./squashfs-root/system/bin/app_process64
sudo chmod +x ./squashfs-root/system/app/SuperSU/SuperSU.apk
sudo chmod +x ./squashfs-root/system/etc/install-recovery.sh
sudo chmod +x ./squashfs-root/system/bin/install-recovery.sh
sudo chmod +x ./squashfs-root/system/xbin/su
sudo chmod +x ./squashfs-root/system/bin/.ext/.su
sudo chmod +x ./squashfs-root/system/xbin/daemonsu
sudo chmod +x ./squashfs-root/system/xbin/supolicy
sudo chmod +x ./squashfs-root/system/lib64/libsupol.so
sudo chmod +x ./squashfs-root/system/bin/app_process_init
sudo chmod +x ./squashfs-root/system/bin/app_process64_original
sudo chmod +x ./squashfs-root/system/bin/app_process
sudo chmod +x ./squashfs-root/system/bin/app_process64
echo "正在打包android镜像"
sudo rm android.img
sudo mksquashfs squashfs-root android.img -b 131072 -comp xz -Xbcj ia64
cp android.img dabao/extract/usr/share/uengine/android.img
echo "正在打包uengine-android-image"
cd dabao/extract
find usr -type f -print0 |xargs -0 md5sum >md5sums
cd ..
mkdir build
dpkg-deb -b extract/ build/
cp build/*.deb ~/
echo "正在清理垃圾"
sudo rm -rf ~/temp
echo "已在用户主目录生成新的安装包,安装后重启即可生效"

View File

@@ -1,6 +1,6 @@
{ {
"Package": "com.gitee.uengine.runner.spark", "Package": "com.gitee.uengine.runner.spark",
"Update": true, "Update": true,
"Version": "1.5.1", "Version": "1.5.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.5.1", "Version": "1.5.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

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行 # 使用系统默认的 python3 运行
########################################################################################### ###########################################################################################
# 作者gfdgd xi # 作者gfdgd xi
# 版本1.4.2 # 版本1.5.3
# 更新时间2021年8月30日 # 更新时间2021年12月12日DDUC11了
# 感谢anbox、deepin 和 统信 # 感谢anbox、deepin 和 统信
# 基于 Python3 的 tkinter 构建 # 基于 Python3 的 tkinter 构建
########################################################################################### ###########################################################################################
@@ -43,12 +43,20 @@ def BuildDeb():
messagebox.showerror(title="提示", message="信息填写错误,无法继续打包 APK") messagebox.showerror(title="提示", message="信息填写错误,无法继续打包 APK")
return return
DisabledAndEnbled(True) DisabledAndEnbled(True)
threading.Thread(target=BuildApkDeb, args=(combobox1.get(),)).start() threading.Thread(target=GetBuildApkDebError, args=(combobox1.get(),)).start()
def RunCommandShow(command): def RunCommandShow(command):
TextboxAddText1("$> {}".format(command)) TextboxAddText1("$> {}".format(command))
TextboxAddText1(GetCommandReturn(command)) TextboxAddText1(GetCommandReturn(command))
def GetBuildApkDebError(apkPath):
try:
BuildApkDeb(apkPath)
except:
traceback.print_exc()
messagebox.showerror(title="错误", message=traceback.format_exc())
DisabledAndEnbled(False)
def BuildApkDeb(apkPath): def BuildApkDeb(apkPath):
tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024))) tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024)))
RunCommandShow("echo '======================================New===================================='") RunCommandShow("echo '======================================New===================================='")
@@ -58,11 +66,12 @@ def BuildApkDeb(apkPath):
RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath)) RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath))
RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath)) RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath))
RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'") RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'")
apkPackageName = GetApkPackageName(apkPath) apkPackageName = GetApkPackageName(apkPath, False)
apkPackageNameNew = GetApkPackageName(apkPath, True)
apkPackageVersion = GetApkVersion(apkPath) apkPackageVersion = GetApkVersion(apkPath)
apkChineseLabel = GetApkChineseLabel(apkPath) apkChineseLabel = GetApkChineseLabel(apkPath)
apkActivityName = GetApkActivityName(apkPath) apkActivityName = GetApkActivityName(apkPath)
iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageName) iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageNameNew)
debControl = '''Package: {} debControl = '''Package: {}
Version: {} Version: {}
Architecture: all Architecture: all
@@ -70,82 +79,66 @@ Maintainer: {}
Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1) Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1)
Section: utils Section: utils
Priority: optional Priority: optional
Description: {}\n'''.format(apkPackageName, apkPackageVersion, apkChineseLabel, apkChineseLabel) Description: {}\n'''.format(apkPackageNameNew, apkPackageVersion, apkChineseLabel, apkChineseLabel)
debPostinst = '''#!/bin/sh debPostinst = '''#!/bin/sh
APK_DIR="/usr/share/uengine/apk" APK_DIR="/usr/share/uengine/apk"
APK_NAME="{}.apk" APK_NAME="{}"
APK_PATH="$APK_DIR/$APK_NAME" APK_PATH="$APK_DIR/$APK_NAME"
DESKTOP_FILE="/usr/share/applications/{}.desktop" DESKTOP_FILE="{}"
ICON_FILE="/usr/share/uengine/icons/{}.png"
if [ -f $APK_PATH ]; then if [ -f $APK_PATH ]; then
echo "Installing $APK_NAME" echo "Installing $APK_NAME"
else else
echo "ERROR: $APK_NAME file not found." echo "ERROR: $APK_NAME does not exist."
exit 1 exit 0
fi fi
session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
if test -z "$session_manager"; then if test -z "$session_manager"; then
echo "ERROR: app install failed(session-manager not start)." echo "ERROR: app install failed(session-manager is not running)."
#sudo rm -f $DESKTOP_FILE sess_dir="/usr/share/uengine/session_install"
#sudo rm -f $ICON_FILE if [ ! -d $sess_dir ]; then
#sudo rm -f "$APK_PATH" mkdir $sess_dir
exit 1 chmod 777 $sess_dir
fi
apk_name=${{APK_PATH##*/}}
fileName="$sess_dir/$apk_name"
echo $DESKTOP_FILE > $fileName
abistr=""
if test -n "$abistr"; then
abi=`echo $abistr |awk -F \= '{{print $2}}'`
echo $abi >> $fileName
fi
chmod 766 $fileName
fi fi
ret=`/usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH"` /usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH"
if [ $? -ne 0 ]; then
echo "ERROR: apk install error..."
#sudo rm -f $DESKTOP_FILE
#sudo rm -f $ICON_FILE
#sudo rm -f "$APK_PATH"
exit 1
fi
chkfail=`echo $ret |grep "Failed"`
if test -n "$chkfail" ; then
echo "ERROR: $ret"
#sudo rm -f $DESKTOP_FILE
#sudo rm -f $ICON_FILE
#sudo rm -f "$APK_PATH"
exit 1
fi
sudo rm -f "$APK_PATH" exit 0'''.format(apkPackageNameNew + ".apk", "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
exit 0'''.format(apkPackageName, apkPackageName, apkPackageName)
debPrerm = '''#!/bin/sh debPrerm = '''#!/bin/sh
APP_NAME="{}" APP_NAME="{}"
DESKTOP_FILE="{}"
session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
if test -z "$session_manager"; then if test -z "$session_manager"; then
echo "ERROR: app install failed(session-manager not start)." echo "ERROR: app uninstall failed(session-manager is not running)."
exit 1 sess_dir="/usr/share/uengine/session_uninstall"
if [ ! -d $sess_dir ]; then
mkdir $sess_dir
chmod 777 $sess_dir
fi
fileName="$sess_dir/$APP_NAME"
echo $DESKTOP_FILE > $fileName
chmod 766 $fileName
fi fi
echo "Uninstalling $APP_NAME" echo "Uninstalling $APP_NAME"
ret=`/usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"` /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"
if [ $? -ne 0 ]; then
echo "ERROR: app uninstall error..."
exit 1
fi
chkfail=`echo $ret |grep "Failed"`
if test -n "$chkfail" ; then
echo "ERROR: $ret"
exit 1
fi
cat /etc/passwd | awk -F: '$3>=1000' | cut -f 1 -d : | while read line exit 0'''.format(apkPackageName, "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
do
inifile="/home/$line/.config/uengineAppGeometry.ini"
if [ -f $inifile ]; then
sed -i "/$APP_NAME/d" $inifile
fi
done
exit 0'''.format(apkPackageName)
desktopFile = '''[Desktop Entry] desktopFile = '''[Desktop Entry]
Categories=Other; Categories=Other;
Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={} Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={}
@@ -162,20 +155,22 @@ Name={}
write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst) write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst)
RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath)) RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath))
write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm) write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm)
RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageName)) RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageNameNew))
#write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageName), desktopFile) #write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew), desktopFile)
BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel, iconSavePath, BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel, "/usr/share/uengine/icons/{}.png".format(apkPackageNameNew),
"{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageName)) "{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew))
RunCommandShow("echo '复制文件'") RunCommandShow("echo '复制文件'")
RunCommandShow("echo '写入 APK 软件图标'") RunCommandShow("echo '写入 APK 软件图标'")
SaveApkIcon(apkPath, iconSavePath) SaveApkIcon(apkPath, iconSavePath)
RunCommandShow("echo '复制 APK 文件'") RunCommandShow("echo '复制 APK 文件'")
RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageName)) RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageNameNew))
RunCommandShow("echo '正在设置文件权限……'") RunCommandShow("echo '正在设置文件权限……'")
RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath)) RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath)) RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
RunCommandShow("echo '打包 deb 到桌面……'") RunCommandShow("echo '打包 deb 到桌面……'")
RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageName, apkPackageVersion)) RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
RunCommandShow("echo '正在删除临时目录……'")
RunCommandShow("rm -rfv '{}'".format(tempPath))
RunCommandShow("echo '完成!'") RunCommandShow("echo '完成!'")
findApkHistory.append(apkPath) findApkHistory.append(apkPath)
combobox1['value'] = findApkHistory combobox1['value'] = findApkHistory
@@ -260,7 +255,7 @@ def GetApkActivityName(apkFilePath):
line = line.replace("icon=", "") line = line.replace("icon=", "")
return line return line
def GetApkPackageName(apkFilePath): def GetApkPackageName(apkFilePath, setting):
# 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数 # 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数
info = GetApkInformation(apkFilePath) info = GetApkInformation(apkFilePath)
for line in info.split('\n'): for line in info.split('\n'):
@@ -271,7 +266,7 @@ def GetApkPackageName(apkFilePath):
line = line.replace("'", "") line = line.replace("'", "")
line = line.replace(" ", "") line = line.replace(" ", "")
# 此较为特殊,因为需要判断用户是否要添加前缀 # 此较为特殊,因为需要判断用户是否要添加前缀
if qianZhui.get() == True: if setting:
return "uengine-dc-{}".format(line).lower() return "uengine-dc-{}".format(line).lower()
return line.lower() return line.lower()
@@ -294,7 +289,7 @@ def BuildUengineDesktop(packageName, activityName, showName, iconPath, savePath)
[Desktop Entry] [Desktop Entry]
Categories=app; Categories=app;
Encoding=UTF-8 Encoding=UTF-8
Exec=/usr/bin/uengine launch.sh --action=android.intent.action.MAIN --package={} --component={} Exec=/usr/bin/uengine launch --action=android.intent.action.MAIN --package={} --component={}
GenericName={} GenericName={}
Icon={} Icon={}
MimeType= MimeType=
@@ -435,7 +430,7 @@ if len(sys.argv) > 1:
# 设置窗口 # 设置窗口
style = ttkthemes.ThemedStyle(win) style = ttkthemes.ThemedStyle(win)
style.set_theme("breeze") style.set_theme("breeze")
win.attributes('-alpha', 0.5) #win.attributes('-alpha', 0.5)
win.title(title) win.title(title)
win.resizable(0, 0) win.resizable(0, 0)
win.iconphoto(False, tk.PhotoImage(file=iconPath)) win.iconphoto(False, tk.PhotoImage(file=iconPath))

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
######################################### #########################################
# 版本1.4.0 # 版本1.5.1
# 更新时间2021年08月26日 # 更新时间2021年10月06日
# Need: unix, python3-tk, python3-pip, pymouse, keyboard # Need: unix, python3-tk, python3-pip, pymouse, keyboard
######################################### #########################################
import os import os
@@ -57,8 +57,8 @@ def Mouse(key):
print(keybo[key.name]["MousePlace"]) print(keybo[key.name]["MousePlace"])
pyautogui.FAILSAFE = False pyautogui.FAILSAFE = False
#os.system(programPath + "/mouse.py {} {}".format(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])) #os.system(programPath + "/mouse.py {} {}".format(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1]))
#pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1]) pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])
pyautogui.click(1500, 800) #pyautogui.click(1500, 800)
#m.click(keybo[key.name]["MousePlace"][0],keybo[key.name]["MousePlace"][1]) #m.click(keybo[key.name]["MousePlace"][0],keybo[key.name]["MousePlace"][1])
def Setting(key): def Setting(key):

View File

@@ -28,7 +28,7 @@ def Update(name, stars, contact, things, version):
"Version": version "Version": version
} }
try: try:
messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vZ2ZkZ2R4aS5xaWNwLnZpcC91ZW5naW5lL2J1Zy91cGxvYWQucGhw").decode("utf-8")), data=data).text) messagebox.showinfo(message=requests.post(parse.unquote(base64.b64decode("aHR0cCUzQS8vMTIwLjI1LjE1My4xNDQvdWVuZ2luZS1ydW5uZXIvYnVnL3VwbG9hZC5waHA=").decode("utf-8")), data=data).text)
except: except:
traceback.print_exc() traceback.print_exc()
messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc())) messagebox.showerror(title="错误", message="服务器疑似出现错误,可以进行以下尝试:①多尝试几次;②使用其他反馈途径\n错误信息{}".format(traceback.format_exc()))
@@ -66,14 +66,14 @@ starValue.set("5分")
name = ttk.Label(win, text="你的昵称:") name = ttk.Label(win, text="你的昵称:")
nameThings = ttk.Entry(win, width=25) nameThings = ttk.Entry(win, width=25)
contact = ttk.Label(win, text="联系方式:") contact = ttk.Label(win, text="联系方式(电子邮箱)")
contactThings = ttk.Entry(win, width=25) contactThings = ttk.Entry(win, width=25)
star = ttk.Label(win, text="评分:") star = ttk.Label(win, text="评分:")
starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分") starMenu = ttk.OptionMenu(win, starValue, "5分", "5分", "4分", "3分", "2分", "1分")
updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):") updateThingsTips = ttk.Label(win, text="反馈内容(支持 Markdown 格式):")
updateThings = tk.Text(win) updateThings = tk.Text(win, width=100)
otherUpload = ttk.Frame(win) otherUpload = ttk.Frame(win)
# 所属内容 # 所属内容
@@ -106,7 +106,7 @@ starMenu.grid(row=0, column=5)
updateThingsTips.grid(row=1, column=0, columnspan=2) updateThingsTips.grid(row=1, column=0, columnspan=2)
updateThings.grid(row=2, column=0, columnspan=6) updateThings.grid(row=2, column=0, columnspan=6)
otherUpload.grid(row=3, column=0, columnspan=4) otherUpload.grid(row=3, column=0, columnspan=4, sticky=tk.W)
updateButton.grid(row=3, column=5) updateButton.grid(row=3, column=5)
win.pack(expand="yes", fill="both") win.pack(expand="yes", fill="both")