Compare commits

...

30 Commits
2.1.1 ... main

Author SHA1 Message Date
ef3409419a 更新README 2024-02-05 09:05:30 +08:00
6aed0296ee 忘记修改版本号了 2024-02-04 11:06:33 +08:00
022e2f1b53 小调 2024-02-04 11:05:09 +08:00
27cf5b077a 2.2.0.1 2024-02-04 11:02:19 +08:00
c8e0d5042e 2.2.0 2024-01-30 11:19:53 +08:00
82b352d827 新增Via安装功能 2024-01-30 10:15:14 +08:00
e94ebecfa2 修复部分系统在使用程序的一些功能时发生崩溃的问题 2024-01-30 09:57:46 +08:00
123fadd7ac 新增QQ群入口 2024-01-30 09:21:36 +08:00
3fbfb38a53 新增ARM架构非飞腾CPU识别 2024-01-29 21:27:47 +08:00
83e34a983c 调整关于窗口 2024-01-29 20:41:37 +08:00
53b16c9d35 修改关于窗口背景 2024-01-29 19:30:05 +08:00
4c940403bd 新增赞赏页面 2024-01-29 19:26:54 +08:00
f82d767a19 修复 deepin 23 安装的 APK 无法正常在启动器显示图标的问题 2024-01-29 19:17:20 +08:00
d385fdd64c 适配deepin23 2024-01-29 18:55:14 +08:00
ce15113a7a 新增运行aapt脚本 2024-01-29 18:33:14 +08:00
23179c0266 精简aapt程序包 2024-01-29 18:26:52 +08:00
b8dde0ff52 进一步补充aapt 2024-01-21 17:19:28 +08:00
3df126d700 添加aapt包 2024-01-21 13:31:46 +08:00
e045169d99 添加bwrap文件以准备支持deepin23 2024-01-21 13:28:06 +08:00
414681fc0b 优化安装量统计机制 2023-11-11 10:08:09 +08:00
691d140db5 修改README链接 2023-08-17 13:59:16 +08:00
96cf7dfe74 2.1.2 2023-08-14 17:03:00 +08:00
576470f70a 引导用户到Gitee反馈bug 2023-08-14 16:55:12 +08:00
625e456e6b 修复deepin23缺失pil的问题 2023-08-14 16:46:20 +08:00
Bail
2a17547da3
修复添加应用图标时activity名称错误的问题 2023-07-28 17:58:47 +08:00
Bail
fb46147547
修复 #I6ZRZX
根据对报错信息的分析,我认为这个问题可能是由于程序退出时由于updatekiller.py已将pid文件删除,导致要退出的程序在atexit模块注册的函数要删除记录到pid时找不到pid文件,导致报错。
但经过复现尝试,发现不是杀进程时触发的。因为杀进程时被杀的进程不会执行atexit。
由于已更新至最新版本,无法通过更新进行复现。所以具体报错原因尚未探究清楚,问题尚未完全修复。
2023-07-18 21:57:53 +08:00
d37c7514f3 修改deb打包格式 2023-07-10 09:40:45 +08:00
7fe6187f98 修复bug提交问题 2023-07-09 06:41:43 +08:00
0bbb560b48 auto building 2023-07-06 15:36:29 +08:00
d583c396b1 忘改control了 2023-07-06 11:48:59 +08:00
67 changed files with 611 additions and 125 deletions

26
.github/workflows/auto-building.yml vendored Normal file

@ -0,0 +1,26 @@
name: Auto Building Wine Runner
run-name: ${{ github.actor }} Auto Building Wine Runner 🚀
on:
push:
workflow_dispatch:
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- name: Building DEB
run: |
# 配置环境
sudo apt update
sudo apt install git dpkg-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qt5-qmake -y
git clone https://github.com/gfdgd-xi/uengine-runner
cd uengine-runner
make build
mv com.gitee.uengine.runner.spark.deb ~
- name: upload result
uses: actions/upload-artifact@v1
with:
name: com.gitee.uengine.runner.spark.deb
path: /home/runner/com.gitee.uengine.runner.spark.deb

1
.gitignore vendored Normal file

@ -0,0 +1 @@
__pycache__

BIN
APK/Via.apk Normal file

Binary file not shown.

@ -41,8 +41,8 @@ programEnv = [
["($PROGRAMPATH)", programPath],
["($VERSION)", version],
["($THANK)", thankText],
["($MAKER)", "RacoonGX 团队By gfdgd xi"],
["($COPYRIGHT)", f"©2020~{time.strftime('%Y')} RacoonGX 团队By gfdgd xi"],
["($MAKER)", "gfdgd xi"],
["($COPYRIGHT)", f"©2020~{time.strftime('%Y')} gfdgd xi"],
["($?)", "0"],
["($PLATFORM)", platform.system()],
["($DEBUG)", "1"]

@ -1,5 +1,7 @@
#!/usr/bin/env python3
import os
import sys
import json
import base64
import requests
print("""浣溪沙
@ -8,4 +10,7 @@ print("""浣溪沙
print("")
print("听一支新曲喝一杯美酒,还是去年的天气旧日的亭台,西落的夕阳何时再回来?那花儿落去我也无可奈何,那归来的燕子似曾相识,在小园的花径上独自徘徊。")
print("================================")
print(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3VlbmdpbmUtcnVubmVyL0luc3RhbGwucGhwP1ZlcnNpb249").decode("utf-8") + sys.argv[1]).text)
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
with open(f"{programPath}/information.json") as file:
version = json.loads(file.read())["Version"]
print(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3VlbmdpbmUtcnVubmVyL0luc3RhbGwucGhwP1ZlcnNpb249").decode("utf-8") + version).text)

BIN
Icon/Program/about-background.png Executable file

Binary file not shown.

After

(image error) Size: 9.9 KiB

BIN
Icon/Program/about-icon.png Executable file

Binary file not shown.

After

(image error) Size: 69 KiB

BIN
Icon/QR/Alipay.jpg Normal file

Binary file not shown.

After

(image error) Size: 270 KiB

BIN
Icon/QR/QQ.png Normal file

Binary file not shown.

After

(image error) Size: 66 KiB

BIN
Icon/QR/Wechat.png Normal file

Binary file not shown.

After

(image error) Size: 76 KiB

BIN
Icon/QR/advertisement0.jpg Normal file

Binary file not shown.

After

(image error) Size: 338 KiB

7
LoadingBinder/uengine Normal file

@ -0,0 +1,7 @@
#!/bin/bash
export XDG_SESSION_TYPE=x11
export QT_QPA_PLATFORM=xcb
unset WAYLAND_DISPLAYCOPY
XDG_CURRENT_DESKTOP="Deepin"
export LD_LIBRARY_PATH=/usr/share/uengine/lib64/
uengine-session "$@" -platformtheme=deepin

@ -0,0 +1,15 @@
#!/bin/bash
programPath=$(cd $(dirname $0); pwd)
if [[ ! -f /usr/bin/uengine ]]; then
echo 未安装uengine请先安装
exit 1
fi
if [[ -f /usr/bin/uengine-session ]] ;then
echo 已经安装补丁,无需重复安装!
exit 1
fi
sudo mv /usr/bin/uengine /usr/bin/uengine-session
sudo cp "$programPath/uengine" /usr/bin/uengine
sudo chmod +x /usr/bin/uengine
sudo systemctl restart uengine-session.service
echo 补丁安装完成!

@ -0,0 +1,15 @@
#!/bin/bash
programPath=$(cd $(dirname $0); pwd)
if [[ ! -f /usr/bin/uengine ]]; then
echo 未安装uengine请先安装
exit 1
fi
if [[ ! -f /usr/bin/uengine-session ]] ;then
echo 未安装补丁,无需卸载!
exit 1
fi
rm -fv /usb/bin/uengine
sudo mv /usr/bin/uengine-session /usr/bin/uengine
sudo chmod +x /usr/bin/uengine
sudo systemctl restart uengine-session.service
echo 补丁卸载完成!

@ -1,5 +1,6 @@
clean:
python3 RemovePycacheFile.py
rm com.gitee.uengine.runner.spark.deb -fv
build:
echo 别云间
@ -58,6 +59,8 @@ build:
cp -rv uengine-remove.sh new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/
cp -rv pkexec new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/
cp -rv LoadingBinder new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/
cp -rv aapt new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/
cp -rv APK new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/
rm -rfv new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/Help/information
python3 UpdateTime.py
python3 RemovePycacheFile.py #new-deb-build/opt/apps/com.gitee.uengine.runner.spark/files/
@ -86,4 +89,4 @@ depend:
python3 -m pip install --upgrade keyboard --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple
run:
python3 mainwindow.py
python3 mainwindow.py

@ -1,7 +1,7 @@
<p width=100px align="center"><img src="runner.svg"></p>
<h1 align="center">UEngine 运行器 2.1.1</h1>
<h1 align="center">UEngine 运行器 2.2.0.1</h1>
<hr>
<a href='https://gitee.com/gfdgd-xi-org/uengine-runner/stargazers'><img src='https://gitee.com/gfdgd-xi-org/uengine-runner/badge/star.svg?theme=dark' alt='star'></img></a>
<a href='https://gitee.com/gfdgd-xi/uengine-runner/stargazers'><img src='https://gitee.com/gfdgd-xi/uengine-runner/badge/star.svg?theme=dark' alt='star'></img></a>
<a href='https://gitee.com/gfdgd-xi/uengine-runner/members'><img src='https://gitee.com/gfdgd-xi/uengine-runner/badge/fork.svg?theme=dark' alt='fork'></img></a>
## 介绍
@ -11,7 +11,13 @@
支持系统Deepinamd64、UOSamd64/arm64、Debianamd64≥debian 10、Ubuntuamd64≥Ubuntu 20.04
Debian 10、Debian 11、Ubuntu 20.04 需要从 http://dtk.gfdgdxi.top/ 下载 dtk版本≥5.5)并安装才能通过运行器的安装程序正确安装 UEngine
暂不支持 Debian 12
QQ 交流群872491938
## 在 deepin 23 上安装缺失依赖?
依赖下载地址https://gfdgdxi.lanzv.com/b01rwfgtg 密码:648f
## 程序相关网站
作者个人站https://www.gfdgdxi.top
查询 APK 运行情况https://gfdgd-xi.github.io/uengine-runner-info/
@ -27,6 +33,10 @@ Deepin 论坛https://bbs.deepin.org
https://gfdgdxi.lanzoue.com/b01qiu22f
密码:dihl
或者从星火应用商店下载安装,星火应用商店的源里已经补齐 UEngine 运行器在 Deepin 23 Alpha2/Beta 缺少的依赖
然后输入:
```bash
python3 -m pip install pillow
```
## 上架到的应用商店
> 可以从下列应用商店获取 UEngine 运行器
@ -76,6 +86,36 @@ sudo apt upgrade
![image.png](https://storage.deepin.org/thread/202205220801513371_image.png)
### 更新内容
#### V2.2.0.12023年02月04日
**※1、解决 deepin 23 beta3 缺失依赖的问题**
#### V2.2.02023年01月30日
**※1、支持 deepin 23不需要强制依赖 aapt**
**※2、修复 deepin 23 安装的 APK 无法正常在启动器显示图标的问题**
**※3、新增 ARM 架构非飞腾 CPU 识别防止破坏鲲鹏 kbox 环境**
**※4、修复部分系统在使用程序的一些功能时发生崩溃的问题**
**※5、新增 UEngine For Wayland 补丁**
6、优化安装量统计机制
7、关于窗口新增赞助页
8、新增 QQ 交流群入口
9、内置 Via 浏览器
![截图_选择区域_20240130111917.png](https://storage.deepin.org/thread/20240130031926574_截图_选择区域_20240130111917.png)
#### V2.1.22023年08月14日
**※1、修复 https://gitee.com/gfdgd-xi/uengine-runner/issues/I6ZRZX**
**※2、修复添加应用图标时activity名称错误的问题**
**※3、修复 UEngine 运行器在 23 运行时提示缺失 PIL.Image 库的问题**
![图片.png](https://storage.deepin.org/thread/202308141701411843_图片.png)
#### V2.1.12023年07月06日
**※1、修复在 Ubuntu/Debian 安装 UEngine 时提示“该脚本不支持 deepin”的问题**
**※2、修复 UEngine 在 debian12 安装无法正常开启 UEngine 的问题;**
@ -531,4 +571,14 @@ make install
[![星火社区作品集/spark-webapp-runtime 运行器](https://gitee.com/spark-community-works-collections/spark-webapp-runtime-runner/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/spark-community-works-collections/spark-webapp-runtime-runner)
[![gfdgd xi/定时器](https://gitee.com/gfdgd-xi/timer/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/gfdgd-xi/timer)
### 请作者喝杯茶
如果您觉得对你有帮助,可以请作者喝杯茶
<img src="Icon/QR/Wechat.png" width="250" />
<img src="Icon/QR/Alipay.jpg" width="250" />
<img src="Icon/QR/QQ.png" width="250" >
#### 广告
支付宝官方活动,扫描获得支付红包!
<p><img src="Icon/QR/advertisement0.jpg" width="250" ></p>
## ©2021-Now gfdgd xi

BIN
aapt/aapt Executable file

Binary file not shown.

BIN
aapt/aapt2 Executable file

Binary file not shown.

1
aapt/libaapt.so Symbolic link

@ -0,0 +1 @@
libaapt.so.0

BIN
aapt/libaapt.so.0 Normal file

Binary file not shown.

BIN
aapt/libandroidfw.so.0 Normal file

Binary file not shown.

19
aapt/run-aapt.sh Executable file

@ -0,0 +1,19 @@
#!/bin/bash
# 判断是不是 Deepin23
cat /etc/deepin_version | grep 23
if [[ $? != 0 ]]; then
# 如果不是
# 判断系统是否有安装 aapt
which aapt > /dev/null
if [[ $? == 0 ]]; then
# 如果有安装
aapt "$@"
exit $?
fi
fi
# 如果是
programPath=$(cd $(dirname $0); pwd)
echo $programPath
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$programPath"
$programPath/aapt "$@"
exit $?

@ -6,6 +6,12 @@ import traceback
import subprocess
from getxmlimg import getsavexml
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
# 获取用户主目录
def get_home()->"获取用户主目录":
return os.path.expanduser('~')
class ProgramInformation:
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
version = "1.6.0Alpha2"
@ -49,7 +55,7 @@ class APK:
def uninstall(self):
return os.system("uengine uninstall --pkg='{}'".format(self.packageName()))
def information(self):
return subprocess.getoutput("aapt dump badging '{}'".format(self.apkPath))
return subprocess.getoutput("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, self.apkPath))
def activityName(self):
info = self.information()
for line in info.split('\n'):

BIN
bwrap/bwrap_amd64 Executable file

Binary file not shown.

BIN
bwrap/bwrap_arm64 Executable file

Binary file not shown.

0
bwrap/run.sh Normal file

@ -1,13 +1,22 @@
import PIL.Image as Image
import PIL.ImageDraw as ImageDraw
import os
try:
import PIL.Image as Image
import PIL.ImageDraw as ImageDraw
except:
os.system("python3 -m pip install --upgrade pillow --break-system-packages --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple")
os.system("python3 -m pip install --upgrade pillow --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple")
import PIL.Image as Image
import PIL.ImageDraw as ImageDraw
import zipfile
import subprocess
import re
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
class getsavexml():
def savexml(self,apkFilePath,xmlpath,iconSavePath):
cmddumpid = "aapt dump xmltree "+ apkFilePath + " " + xmlpath
cmddumpid = f"'{programPath}/aapt/run-aapt.sh' dump xmltree "+ apkFilePath + " " + xmlpath
print(cmddumpid)
xmltree = subprocess.getoutput(cmddumpid)
xmls = xmltree.splitlines()
@ -29,7 +38,7 @@ class getsavexml():
print(foreimgid)
# 直接从apk resource文件获取前后两层图片路径及ID字符串
resource = subprocess.getoutput("aapt dump --values resources " + apkFilePath + "| grep -iE -A1 " + "\"" + backimgid + "|" + foreimgid + "\"")
resource = subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' dump --values resources " + apkFilePath + "| grep -iE -A1 " + "\"" + backimgid + "|" + foreimgid + "\"")
resourcelines = resource.splitlines()
print(resourcelines)

@ -4,7 +4,7 @@
"https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner"
],
"Version": "2.1.1",
"Version": "2.2.0.1",
"System": "Linuxdeepin/UOS/Ubuntu/Debian",
"Tips": [
"更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis 或程序的更多帮助",
@ -22,6 +22,25 @@
"5、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
],
"Update": [
"<b>V2.2.0.1</b>",
"※1、解决 deepin 23 beta3 缺失依赖的问题",
"",
"<b>V2.2.0</b>",
"※1、支持 deepin 23不需要强制依赖 aapt",
"※2、修复 deepin 23 安装的 APK 无法正常在启动器显示图标的问题",
"※3、新增 ARM 架构非飞腾 CPU 识别防止破坏鲲鹏 kbox 环境",
"※4、修复部分系统在使用程序的一些功能时发生崩溃的问题",
"※5、新增 UEngine For Wayland 补丁",
"6、优化安装量统计机制",
"7、关于窗口新增赞助页",
"8、新增 QQ 交流群入口",
"9、内置 Via 浏览器",
"",
"<b>V2.1.2</b>",
"※1、修复 https://gitee.com/gfdgd-xi/uengine-runner/issues/I6ZRZX",
"※2、修复添加应用图标时activity名称错误的问题",
"※3、修复 UEngine 运行器在 23 运行时提示缺失 PIL.Image 库的问题",
"",
"<b>V2.1.1</b>",
"※1、修复在 Ubuntu/Debian 安装 UEngine 时提示“该脚本不支持 deepin”的问题",
"※2、修复 UEngine 在 debian12 安装无法正常开启 UEngine 的问题;",

@ -89,8 +89,8 @@ class UninstallProgram(QtCore.QThread):
self.error.emit("疑似卸载失败,请检查 UEngine 是否正常安装、运行以及 APK 文件或包名是否正确、完整")
DisabledAndEnbled(False)
return
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), package)):
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), package))
if os.path.exists("{}/{}.desktop".format(desktopFilePath, package)):
os.remove("{}/{}.desktop".format(desktopFilePath, package))
if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)):
os.remove("{}/{}.desktop".format(get_desktop_path(), package))
findApkHistory.append(ComboInstallPath.currentText())
@ -174,9 +174,9 @@ class InstallApk(QtCore.QThread):
try:
if not os.path.exists("/tmp/uengine-runner"):
os.makedirs("/tmp/uengine-runner")
if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
if not os.path.exists(desktopFilePath):
print("Mkdir")
os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
os.makedirs(desktopFilePath)
# 读取设置
setting = json.loads(readtxt(get_home() + "/.config/uengine-runner/setting.json"))
# 安装应用
@ -246,7 +246,7 @@ logicalHeight {verticalHeighe}
"{}/{}.desktop".format(get_desktop_path(), GetApkPackageName(path)))
print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)))
"{}/{}.desktop".format(desktopFilePath, GetApkPackageName(path)))
print("\nprint install complete")
if quit:
return
@ -266,7 +266,7 @@ def InstallBuildDesktop(iconSavePath):
"{}/{}.desktop".format(get_desktop_path(), GetApkPackageName(path)), choose)
print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)), choose)
"{}/{}.desktop".format(desktopFilePath, GetApkPackageName(path)), choose)
print("\nprint install complete")
def UpdateCombobox(tmp):
@ -418,7 +418,7 @@ def write_txt(path: "路径", things: "内容")->"写入文本文档":
# 获取 aapt 的所有信息
def GetApkInformation(apkFilePath: "apk 所在路径")->"获取 aapt 的所有信息":
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
return GetCommandReturn("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, apkFilePath))
# 获取 apk Activity
def GetApkActivityName(apkFilePath: "apk 所在路径")->"获取 apk Activity":
@ -587,8 +587,8 @@ def BackUengineClean()->"清空 uengine 数据":
if QtWidgets.QMessageBox.warning(widget, "警告", "清空后数据将会完全丢失,确定要继续吗?", QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel) == QtWidgets.QMessageBox.Ok:
DisabledAndEnbled(True)
try:
if os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
shutil.rmtree("{}/.local/share/applications/uengine/".format(get_home()))
if os.path.exists(desktopFilePath):
shutil.rmtree(desktopFilePath)
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(widget, "错误", traceback.format_exc())
@ -1004,7 +1004,7 @@ class UengineWindowSizeSetting:
i.setChecked(True)
UengineWindowSizeSetting.setting.setWindowTitle(f"设置 Android 应用的窗口大小缩放设置")
UengineWindowSizeSetting.setting.show()
UengineWindowSizeSetting.setting.resize(UengineWindowSizeSetting.setting.frameSize().width() * 1.3, UengineWindowSizeSetting.setting.frameSize().height())
UengineWindowSizeSetting.setting.resize(int(UengineWindowSizeSetting.setting.frameSize().width() * 1.3), int(UengineWindowSizeSetting.setting.frameSize().height()))
def ReadSetting():
file = open(f"/usr/share/uengine/appetc/{UengineWindowSizeSetting.package}.txt")
@ -1191,7 +1191,7 @@ class UpdateWindow():
UpdateWindow.update.setCentralWidget(updateWidget)
UpdateWindow.update.setWindowTitle("检查 UEngine 运行器更新")
UpdateWindow.update.setWindowIcon(QtGui.QIcon(iconPath))
UpdateWindow.update.resize(updateWidget.frameGeometry().width(), int(updateWidget.frameGeometry().height() * 1.5))
UpdateWindow.update.resize(int(updateWidget.frameGeometry().width()), int(updateWidget.frameGeometry().height() * 1.5))
UpdateWindow.update.show()
def Update():
@ -1410,7 +1410,7 @@ class ShowTextTipsWindow():
ShowTextTipsWindow.messageWindow.setWindowTitle("提示")
ShowTextTipsWindow.messageWindow.setWindowIcon(QtGui.QIcon(iconPath))
ShowTextTipsWindow.messageWindow.show()
ShowTextTipsWindow.messageWindow.resize(ShowTextTipsWindow.messageWindow.frameSize().width() * 2, ShowTextTipsWindow.messageWindow.frameSize().height() * 1.5)
ShowTextTipsWindow.messageWindow.resize(int(ShowTextTipsWindow.messageWindow.frameSize().width() * 2), int(ShowTextTipsWindow.messageWindow.frameSize().height() * 1.5))
return
# 添加/删除 uengine 应用快捷方式
@ -1462,7 +1462,7 @@ class AddNewUengineDesktopLink():
# 添加快捷方式
def SaveDesktopLink():
try:
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text())):
if os.path.exists("{}/{}.desktop".format(desktopFilePath, packageName.text())):
if QtWidgets.QMessageBox.question(widget, "提示", "文件已存在,是否要覆盖?") == QtWidgets.QMessageBox.No:
return
if not os.path.exists("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home())):
@ -1470,9 +1470,9 @@ class AddNewUengineDesktopLink():
global activityName
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.text())
shutil.copy(programPath + "/defult.png", iconSavePath)
BuildUengineDesktop(packageName.text(), activityName, packageName.text(), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text()))
BuildUengineDesktop(packageName.text(), activityName, packageName.text(), iconSavePath,
BuildUengineDesktop(packageName.text(), activityName.text(), packageName.text(), iconSavePath,
"{}/{}.desktop".format(desktopFilePath, packageName.text()))
BuildUengineDesktop(packageName.text(), activityName.text(), packageName.text(), iconSavePath,
"{}/{}.desktop".format(get_desktop_path(), packageName.text()))
AddNewUengineDesktopLink.SaveHistory()
QtWidgets.QMessageBox.information(widget, "提示", "创建完毕!")
@ -1485,13 +1485,13 @@ class AddNewUengineDesktopLink():
def DelDesktopLink():
try:
global packageName
if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text())):
QtWidgets.QMessageBox.critical(widget, "错误", "此包名对应的 UEngine 桌面快捷方式不存在!")
if not os.path.exists("{}/{}.desktop".format(desktopFilePath, packageName.text())):
QtWidgets.QMessageBox.critical(widget, "错误", "此包名对应的 UEngine 快捷方式不存在!")
return
if QtWidgets.QMessageBox.warning(widget, "警告", "你确定要删除吗?删除后将无法恢复!", QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel) == QtWidgets.QMessageBox.Cancel:
return
try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text()))
os.remove("{}/{}.desktop".format(desktopFilePath, packageName.text()))
AddNewUengineDesktopLink.SaveHistory()
QtWidgets.QMessageBox.information(widget, "提示", "已删除")
except:
@ -1559,7 +1559,7 @@ def UseProgram():
<p>10deepin 终端{}</p>'''.format(subprocess.getoutput("uengine version"),
subprocess.getoutput("python3 --version"),
QtCore.qVersion,
subprocess.getoutput("aapt version"),
subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' version"),
subprocess.getoutput("dpkg --version"),
subprocess.getoutput("mkdir --version"),
subprocess.getoutput("chmod --version"),
@ -1570,6 +1570,26 @@ def BackAPK(choice):
global choose
choose = choice
def InstallUEnginePatchForWayland():
if os.system("which uengine"):
QtWidgets.QMessageBox.critical(window, "错误", "未安装UEngine请先安装UEngine")
return
if os.path.exists("/usr/bin/uengine-session"):
QtWidgets.QMessageBox.critical(window, "提示", "已安装该补丁,请勿重复安装")
return
os.system(f"pkexec bash '{programPath}/LoadingBinder/uengine-wayland-install.sh'")
QtWidgets.QMessageBox.information(window, "提示", "安装成功!重启电脑后生效")
def RemoveUEnginePatchForWayland():
if os.system("which uengine"):
QtWidgets.QMessageBox.critical(window, "错误", "未安装UEngine请先安装UEngine")
return
if not os.path.exists("/usr/bin/uengine-session"):
QtWidgets.QMessageBox.critical(window, "提示", "已卸载该补丁,无需卸载")
return
os.system(f"pkexec bash '{programPath}/LoadingBinder/uengine-wayland-uninstall.sh'")
QtWidgets.QMessageBox.information(window, "提示", "卸载成功!重启电脑后生效")
###########################
# 程序信息
###########################
@ -1582,11 +1602,10 @@ if not lang in langFile.keys():
programUrl = information["Url"][0]
version = information["Version"]
goodRunSystem = information["System"]
aaptVersion = GetCommandReturn("aapt version")
aaptVersion = GetCommandReturn(f"'{programPath}/aapt/run-aapt.sh' version")
SystemVersion = GetSystemVersion()
iconPath = "{}/runner.svg".format(os.path.split(os.path.realpath(__file__))[0])
about = f'''<p align="center"><img width=256 src="{iconPath}"/></p>
<p>介绍虽然通过Deepin/UOS应用商店已经能够安装部分安卓应用但对于安卓应用爱好者来说不能自由地安装任意APK软件包实在是不尽如人意本软件可以实现在Deepin/UOS上安装任意APK软件包并能将其启动图标发送到系统桌面或启动器中方便用户快速启动它 </p>
about = f'''<p>介绍虽然通过Deepin/UOS应用商店已经能够安装部分安卓应用但对于安卓应用爱好者来说不能自由地安装任意APK软件包实在是不尽如人意。本软件可以实现在Deepin/UOS上安装任意APK软件包并能将其启动图标发送到系统桌面或启动器中方便用户快速启动它。 </p>
<p>程序开源许可证GPLV3</p>
<p>版本{version}</p>
<p>适用平台{goodRunSystem}</p>
@ -1594,10 +1613,22 @@ about = f'''<p align="center"><img width=256 src="{iconPath}"/></p>
<p>程序官网{programUrl}</p>
<p>系统版本{SystemVersion}</p>
<p>安装包构建时间{information['Time']}</p>
<p>QQ 交流群872491938</p>
<h1>©2021-{time.strftime("%Y")} gfdgd xi</h1>'''
updateThingsString = ""
tips = ""
contribute = ""
appreciate = f"""<h3>请作者喝杯茶</h3>
<p>如果您觉得 UEngine 运行器对你有帮助可以请作者喝杯茶 </p>
<p>
<img src="{programPath}/Icon/QR/Wechat.png" width="250" />
<img src="{programPath}/Icon/QR/Alipay.jpg" width="250" />
<img src="{programPath}/Icon/QR/QQ.png" width="250" >
</p>
<hr/>
<h3>广告</h3>
<p>支付宝官方活动扫描获得支付红包</p>
<p><img src="{programPath}/Icon/QR/advertisement0.jpg" width="250" ></p>"""
for i in information["Tips"]:
tips += f"<p>{i}</p>"
for i in information["Update"]:
@ -1611,13 +1642,25 @@ desktop = programPath + "/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop"
useProgram = ""
threading.Thread(target=UseProgram).start()
isDeepin23=False
# 判断是不是 Deepin23
if os.path.exists("/etc/deepin_version"):
try:
with open(f"/etc/deepin_version") as file:
isDeepin23 = "23" in file.read()
except:
traceback.print_exc()
desktopFilePath = f"{get_home()}/.local/share/applications/uengine/"
if isDeepin23:
desktopFilePath = f"{get_home()}/.local/share/applications/"
###########################
# 加载配置
###########################
app = QtWidgets.QApplication(sys.argv)
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(desktopFilePath):
os.makedirs(desktopFilePath)
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"): # 如果没有配置文件
@ -1745,7 +1788,16 @@ def showhelp():
def ChgLog():
HelpStr.setHtml(updateThingsString)
def ChgAbout(event):
HelpStr.setHtml(about)
HelpStr.setHtml(f"<p align='center'><a href='https://www.gfdgdxi.top/ChangeIcon'><img width=256 src='{iconPath}'/></a></p>\n" + about)
def OpenUrl(url):
print(url.url())
if url.url() == "https://www.gfdgdxi.top/ChangeIcon":
ChgAboutChangeIcon()
return
webbrowser.open_new_tab(url.url())
def ChgAboutChangeIcon():
HelpStr.setHtml(f"<p align='center'><img width=256 src='{programPath}/Icon/Program/about-icon.png'/></p>\n" + about)
def ChgDep():
if useProgram == "":
BtnZujian.setDisabled(True)
@ -1755,7 +1807,8 @@ def showhelp():
HelpStr.setHtml(contribute)
def ChgTips():
HelpStr.setHtml(tips)
def ChgAppreciate():
HelpStr.setHtml(appreciate)
def ChgGPLV3():
try:
with open(f"{programPath}/LICENSE", "r") as file:
@ -1778,7 +1831,12 @@ def showhelp():
BtnDownN = QtWidgets.QPushButton("程序下载量")
BtnOpenN = QtWidgets.QPushButton("程序打开量")
BtnGPLV3 = QtWidgets.QPushButton("程序开源许可证")
appreciateButton = QtWidgets.QPushButton("赞赏作者")
HelpStr = QtWidgets.QTextBrowser()
HelpStr.setOpenLinks(False)
HelpStr.setHtml(about)
HelpStr.setOpenExternalLinks(False)
HelpStr.anchorClicked.connect(OpenUrl)
# 此功能从 2.0.0 后不再隐藏
#BtnDownN.setEnabled("--彩蛋" in sys.argv)
BtnReadme.clicked.connect(ChgTips)
@ -1789,6 +1847,7 @@ def showhelp():
BtnDownN.clicked.connect(Download)
BtnGPLV3.clicked.connect(ChgGPLV3)
BtnOpenN.clicked.connect(Open)
appreciateButton.clicked.connect(ChgAppreciate)
ChgTips()
@ -1799,14 +1858,18 @@ def showhelp():
helpLayout.addWidget(BtnDownN, 4, 0, 1, 1)
helpLayout.addWidget(BtnOpenN, 5, 0, 1, 1)
helpLayout.addWidget(BtnGPLV3, 6, 0, 1, 1)
helpLayout.addWidget(BtnAbout, 7, 0, 1, 1)
helpLayout.addWidget(HelpStr, 0, 1, 10, 1)
helpLayout.addWidget(appreciateButton, 7, 0, 1, 1)
helpLayout.addWidget(BtnAbout, 8, 0, 1, 1)
helpLayout.addWidget(HelpStr, 0, 1, 11, 1)
helpWidget.setLayout(helpLayout)
helpWindow.setCentralWidget(helpWidget)
helpWindow.setFixedSize(int(helpWindow.frameSize().width() * 0.9), int(helpWindow.frameSize().height() * 1.5))
helpWindow.setWindowTitle("帮助")
helpWindow.setWindowIcon(QtGui.QIcon(iconPath))
# 设置背景
helpWindow.setObjectName("helpWindow")
helpWindow.setStyleSheet(f"QWidget#helpWindow {{background: url({programPath}/Icon/Program/about-background.png) no-repeat;background-position: left bottom;}}")
helpWindow.show()
return
@ -1816,6 +1879,9 @@ def showhelp():
if not os.path.exists("/usr/bin/uengine"):
# Deepin/UOS 用户
if "deepin" in SystemVersion.lower() or "uos" in SystemVersion.lower() or subprocess.getoutput("arch").replace("\n", "").replace(" ", "") != "x86_64":
if not "ft-" in GetCommandReturn("lscpu").lower() and GetCommandReturn("lscpu").replace(" ", "").replace("\n", "") == "aarch64":
QtWidgets.QMessageBox.critical(None, "错误", "UEngine 运行器不支持非飞腾 CPU")
sys.exit(1)
if QtWidgets.QMessageBox.question(None, "提示", "您的电脑没有安装 UEngine是否安装 UEngine 以便更好的使用\n安装完后重新启动该程序即可") == QtWidgets.QMessageBox.Yes:
OpenTerminal(f"pkexec apt install uengine -y")
sys.exit(0)
@ -1830,10 +1896,19 @@ if not os.path.exists("/usr/bin/uengine"):
OpenTerminal(f"bash '{programPath}/uengine-installer'")
sys.exit(0)
###########################
# 窗口创建
###########################
window = QtWidgets.QMainWindow()
# 判断系统是不是 Deepin 23、有没有安装 Wayland 补丁、是不是 Wayland 环境
if not os.path.exists("/usr/bin/uengine-session") and isDeepin23 and os.getenv("XDG_SESSION_TYPE") == "wayland":
# 如果是
if QtWidgets.QMessageBox.question(None, "提示", "检测到您使用的是 Deepin 23 + Wayland 环境,建议安装 UEngine For Wayland 补丁以便能正常使用 UEngine是否安装") == QtWidgets.QMessageBox.Yes:
InstallUEnginePatchForWayland()
widget = QtWidgets.QWidget()
widgetLayout = QtWidgets.QGridLayout()
# 权重
@ -1978,6 +2053,9 @@ uengineUbuntuInstall = QtWidgets.QAction(QtGui.QIcon.fromTheme("ubuntu-logo-icon
uengineUbuntuRemove = QtWidgets.QAction(QtGui.QIcon.fromTheme("ubuntu-logo-icon"), "移除在 Ubuntu/Debian 上安装的 UEngine 及其附属脚本")
uengineUbuntuInstallRoot = QtWidgets.QAction(QtGui.QIcon.fromTheme("ubuntu-logo-icon"), "在 Ubuntu/Debian 上安装 UEngineSuperSU 镜像)")
uengineWindowSizeSetting = QtWidgets.QAction(langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][16])
uengineInstallVia = QtWidgets.QAction("安装 Via")
installUEnginePatchForWayland = QtWidgets.QAction("安装 UEngine For Wayland 补丁")
uninstallUEnginePatchForWayland = QtWidgets.QAction("卸载 UEngine For Wayland 补丁")
uengine.addAction(uengineOpenDebBuilder)
uengine.addAction(uengineOpenDebBuilderMore)
uengine.addAction(uengineKeyboardToMouse)
@ -2003,6 +2081,12 @@ uengine.addSeparator()
uengine.addAction(uengineDeleteUengineCheck)
uengine.addAction(uengineReinstall)
uengineRoot = uengine.addMenu(langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"])
uengine.addSeparator()
uengine.addAction(uengineInstallVia)
uengine.addSeparator()
uengine.addAction(installUEnginePatchForWayland)
uengine.addAction(uninstallUEnginePatchForWayland)
#uengineUbuntuInstall.setDisabled(True)
# 绑定信号
uengineAllowOrDisallowUpdateAndroidApp.triggered.connect(AllowOrDisallowUpdateAndroidApp)
@ -2017,6 +2101,14 @@ uengineUbuntuInstallRoot.triggered.connect(UengineUbuntuInstallRoot)
uengineDeleteUengineCheck.triggered.connect(DelUengineCheck)
uengineReinstall.triggered.connect(ReinstallUengine)
uengineWindowSizeSetting.triggered.connect(UengineWindowSizeSetting.ShowWindow)
installUEnginePatchForWayland.triggered.connect(InstallUEnginePatchForWayland)
uninstallUEnginePatchForWayland.triggered.connect(RemoveUEnginePatchForWayland)
def InstallVia():
ComboInstallPath.setCurrentText(f"{programPath}/APK/Via.apk")
Button3Install()
uengineInstallVia.triggered.connect(InstallVia)
uengineStart = QtWidgets.QAction(QtGui.QIcon.fromTheme("services"), langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][0])
uengineStop = QtWidgets.QAction(QtGui.QIcon.fromTheme("services"), langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][1])

@ -1,14 +1,14 @@
Package: com.gitee.uengine.runner.spark
Source: com.gitee.uengine.runner.spark
Replaces: spark-uengine-runner, com.gitee.uengine.runner.spark.ubuntu
Version: 2.1.0
Version: 2.2.0.1
Architecture: all
Section: utils
Installed-Size: 2920
Installed-Size: 9384
Maintainer: gfdgd xi <3025613752@qq.com>
Depends: python3, python3-tk, python3-pip, aapt, python3-setuptools, deepin-terminal | mate-terminal | gnome-terminal | xfce4-terminal, curl, python3-pil, python3-requests, adb, fonts-noto-cjk, python3-numpy, wget, inotify-tools, aria2, python3-pyqt5, python3-matplotlib, python3-urllib3, zenity, python3-pil.imagetk
Recommends: uengine, deepin-elf-verify, python3-pyqt5.qtwebengine
Depends: python3, python3-tk, python3-pip, python3-setuptools, deepin-terminal | mate-terminal | gnome-terminal | xfce4-terminal, curl, python3-pil, python3-requests, adb, fonts-noto-cjk, python3-numpy, wget, aria2, python3-pyqt5, python3-matplotlib, python3-urllib3, zenity, python3-pil.imagetk
Recommends: uengine, deepin-elf-verify, python3-pyqt5.qtwebengine, aapt
Priority: optional
Conflicts: spark-uengine-apk-builder, com.gitee.uengine.runner.spark.ubuntu
Conflicts: spark-uengine-apk-builder, com.gitee.uengine.runner.spark.ubuntu, kbox
Homepage: https://gitee.com/gfdgd-xi/uengine-runner
Description: 新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的Uengine安卓运行环境安装/卸载/打包自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。

@ -1,10 +1,10 @@
#!/bin/bash
# 使用 pip 安装所需库
echo 安装组件
python3 -m pip install --upgrade ttkthemes --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade pyautogui --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade keyboard --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade pillow --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade ttkthemes --break-system-packages --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade pyautogui --break-system-packages --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade keyboard --break-system-packages --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
python3 -m pip install --upgrade pillow --break-system-packages --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple > /dev/null 2>&1 | true
echo 执行完成
# 建立软链接
ln -s /opt/apps/com.gitee.uengine.runner.spark/files/uengine-runner /usr/bin/uengine-runner
@ -59,8 +59,15 @@ if [[ -f /usr/bin/uengine-loading-ubuntu ]] || [[ -f /usr/bin/uengine-loading-bi
done
rm -f /tmp/upgrade-uengine-loading-ubuntu
fi
# 自动往 UEngine 安装 Via如果 UEngine 已存在)
if [[ -f /usr/bin/uengine-session-launch-helper ]]; then
# 忽略错误进行安装
cp /opt/apps/com.gitee.uengine.runner.spark/files/APK/Via.apk /tmp/Via.apk | true
/usr/bin/uengine-session-launch-helper -- uengine install --apk=/tmp/Via.apk | true
rm -f /tmp/Via.apk | true
fi
# 刷新图标缓存
# 因为 Ubuntu 的问题,省略
gtk-update-icon-cache /usr/share/icons/bloom > /dev/null | true
# 向服务器返回安装数加1不显示内容且忽略错误
python3 /opt/apps/com.gitee.uengine.runner.spark/files/Download.py 2.1.1 > /dev/null | true
python3 /opt/apps/com.gitee.uengine.runner.spark/files/Download.py 2.1.2 > /dev/null | true

@ -27,6 +27,11 @@ rm -f /usr/bin/uengine-runner-auto-install-bash
# 加判断是为了怕 reinstall 后程序就再也打不开了(除非卸载后重新安装)
if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then
rm -rf /opt/apps/com.gitee.uengine.runner.spark
# 移除 UEngine For 23 Wayland 补丁
if [[ -f /usr/bin/uengine-session ]]; then
rm -fv /usb/bin/uengine
mv -v /usr/bin/uengine-session /usr/bin/uengine
fi
fi
# 删除软件配置文件只限“purge”
# 配置目录:~/.config/uengine-runner
@ -61,7 +66,11 @@ if [ "$1" = "purge" ]; then
else
echo "非 purge跳过清理"
fi
# 自动卸载 UEngine 的 Via如果 UEngine 已存在)
if [[ -f /usr/bin/uengine-session-launch-helper ]]; then
# 忽略错误进行安装
/usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg=mark.via | true
fi
# 刷新图标缓存
# 因为 Ubuntu 的问题,省略
gtk-update-icon-cache /usr/share/icons/bloom > /dev/null | true

@ -41,8 +41,8 @@ programEnv = [
["($PROGRAMPATH)", programPath],
["($VERSION)", version],
["($THANK)", thankText],
["($MAKER)", "RacoonGX 团队By gfdgd xi"],
["($COPYRIGHT)", f"©2020~{time.strftime('%Y')} RacoonGX 团队By gfdgd xi"],
["($MAKER)", "gfdgd xi"],
["($COPYRIGHT)", f"©2020~{time.strftime('%Y')} gfdgd xi"],
["($?)", "0"],
["($PLATFORM)", platform.system()],
["($DEBUG)", "1"]

@ -1,5 +1,7 @@
#!/usr/bin/env python3
import os
import sys
import json
import base64
import requests
print("""浣溪沙
@ -8,4 +10,7 @@ print("""浣溪沙
print("")
print("听一支新曲喝一杯美酒,还是去年的天气旧日的亭台,西落的夕阳何时再回来?那花儿落去我也无可奈何,那归来的燕子似曾相识,在小园的花径上独自徘徊。")
print("================================")
print(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3VlbmdpbmUtcnVubmVyL0luc3RhbGwucGhwP1ZlcnNpb249").decode("utf-8") + sys.argv[1]).text)
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
with open(f"{programPath}/information.json") as file:
version = json.loads(file.read())["Version"]
print(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3VlbmdpbmUtcnVubmVyL0luc3RhbGwucGhwP1ZlcnNpb249").decode("utf-8") + version).text)

Binary file not shown.

After

(image error) Size: 9.9 KiB

Binary file not shown.

After

(image error) Size: 69 KiB

Binary file not shown.

After

(image error) Size: 270 KiB

Binary file not shown.

After

(image error) Size: 66 KiB

Binary file not shown.

After

(image error) Size: 76 KiB

Binary file not shown.

After

(image error) Size: 338 KiB

@ -0,0 +1,7 @@
#!/bin/bash
export XDG_SESSION_TYPE=x11
export QT_QPA_PLATFORM=xcb
unset WAYLAND_DISPLAYCOPY
XDG_CURRENT_DESKTOP="Deepin"
export LD_LIBRARY_PATH=/usr/share/uengine/lib64/
uengine-session "$@" -platformtheme=deepin

@ -0,0 +1,15 @@
#!/bin/bash
programPath=$(cd $(dirname $0); pwd)
if [[ ! -f /usr/bin/uengine ]]; then
echo 未安装uengine请先安装
exit 1
fi
if [[ -f /usr/bin/uengine-session ]] ;then
echo 已经安装补丁,无需重复安装!
exit 1
fi
sudo mv /usr/bin/uengine /usr/bin/uengine-session
sudo cp "$programPath/uengine" /usr/bin/uengine
sudo chmod +x /usr/bin/uengine
sudo systemctl restart uengine-session.service
echo 补丁安装完成!

@ -0,0 +1,15 @@
#!/bin/bash
programPath=$(cd $(dirname $0); pwd)
if [[ ! -f /usr/bin/uengine ]]; then
echo 未安装uengine请先安装
exit 1
fi
if [[ ! -f /usr/bin/uengine-session ]] ;then
echo 未安装补丁,无需卸载!
exit 1
fi
rm -fv /usb/bin/uengine
sudo mv /usr/bin/uengine-session /usr/bin/uengine
sudo chmod +x /usr/bin/uengine
sudo systemctl restart uengine-session.service
echo 补丁卸载完成!

@ -0,0 +1,19 @@
#!/bin/bash
# 判断是不是 Deepin23
cat /etc/deepin_version | grep 23
if [[ $? != 0 ]]; then
# 如果不是
# 判断系统是否有安装 aapt
which aapt > /dev/null
if [[ $? == 0 ]]; then
# 如果有安装
aapt "$@"
exit $?
fi
fi
# 如果是
programPath=$(cd $(dirname $0); pwd)
echo $programPath
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$programPath"
$programPath/aapt "$@"
exit $?

@ -6,6 +6,12 @@ import traceback
import subprocess
from getxmlimg import getsavexml
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
# 获取用户主目录
def get_home()->"获取用户主目录":
return os.path.expanduser('~')
class ProgramInformation:
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
version = "1.6.0Alpha2"
@ -49,7 +55,7 @@ class APK:
def uninstall(self):
return os.system("uengine uninstall --pkg='{}'".format(self.packageName()))
def information(self):
return subprocess.getoutput("aapt dump badging '{}'".format(self.apkPath))
return subprocess.getoutput("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, self.apkPath))
def activityName(self):
info = self.information()
for line in info.split('\n'):

@ -1,13 +1,22 @@
import PIL.Image as Image
import PIL.ImageDraw as ImageDraw
import os
try:
import PIL.Image as Image
import PIL.ImageDraw as ImageDraw
except:
os.system("python3 -m pip install --upgrade pillow --break-system-packages --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple")
os.system("python3 -m pip install --upgrade pillow --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple")
import PIL.Image as Image
import PIL.ImageDraw as ImageDraw
import zipfile
import subprocess
import re
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
class getsavexml():
def savexml(self,apkFilePath,xmlpath,iconSavePath):
cmddumpid = "aapt dump xmltree "+ apkFilePath + " " + xmlpath
cmddumpid = f"'{programPath}/aapt/run-aapt.sh' dump xmltree "+ apkFilePath + " " + xmlpath
print(cmddumpid)
xmltree = subprocess.getoutput(cmddumpid)
xmls = xmltree.splitlines()
@ -29,7 +38,7 @@ class getsavexml():
print(foreimgid)
# 直接从apk resource文件获取前后两层图片路径及ID字符串
resource = subprocess.getoutput("aapt dump --values resources " + apkFilePath + "| grep -iE -A1 " + "\"" + backimgid + "|" + foreimgid + "\"")
resource = subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' dump --values resources " + apkFilePath + "| grep -iE -A1 " + "\"" + backimgid + "|" + foreimgid + "\"")
resourcelines = resource.splitlines()
print(resourcelines)

@ -4,7 +4,7 @@
"https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner"
],
"Version": "2.1.1",
"Version": "2.2.0.1",
"System": "Linuxdeepin/UOS/Ubuntu/Debian",
"Tips": [
"更多可见https://gitee.com/gfdgd-xi/uengine-runner/wikis 或程序的更多帮助",
@ -22,6 +22,25 @@
"5、如果想要使用adb连接UEngine或其他手机请使用 1.2.0 以前的版本。如需连接UEngine请安装adb补丁"
],
"Update": [
"<b>V2.2.0.1</b>",
"※1、解决 deepin 23 beta3 缺失依赖的问题",
"",
"<b>V2.2.0</b>",
"※1、支持 deepin 23不需要强制依赖 aapt",
"※2、修复 deepin 23 安装的 APK 无法正常在启动器显示图标的问题",
"※3、新增 ARM 架构非飞腾 CPU 识别防止破坏鲲鹏 kbox 环境",
"※4、修复部分系统在使用程序的一些功能时发生崩溃的问题",
"※5、新增 UEngine For Wayland 补丁",
"6、优化安装量统计机制",
"7、关于窗口新增赞助页",
"8、新增 QQ 交流群入口",
"9、内置 Via 浏览器",
"",
"<b>V2.1.2</b>",
"※1、修复 https://gitee.com/gfdgd-xi/uengine-runner/issues/I6ZRZX",
"※2、修复添加应用图标时activity名称错误的问题",
"※3、修复 UEngine 运行器在 23 运行时提示缺失 PIL.Image 库的问题",
"",
"<b>V2.1.1</b>",
"※1、修复在 Ubuntu/Debian 安装 UEngine 时提示“该脚本不支持 deepin”的问题",
"※2、修复 UEngine 在 debian12 安装无法正常开启 UEngine 的问题;",
@ -258,7 +277,7 @@
"11、deepin 终端",
"……"
],
"Time": "2023-07-06 11:35:32 Linux-5.15.77-amd64-desktop-x86_64-with-Deepin-20.9-apricot",
"Time": "2024-02-04 11:05:59 Linux-6.1.32-amd64-desktop-hwe-x86_64-with-glibc2.37",
"Contribute": [
"<b>感谢以下用户提供的问题、建议、图标、代码等,如果有遗漏,请及时与开发者联系添加,以及如果侵犯到您的合法权益,也及时与开发者联系:</p>",
"<hr>",

@ -2,3 +2,6 @@
export XDG_SESSION_TYPE=x11
export QT_QPA_PLATFORM=xcb
unset WAYLAND_DISPLAYCOPY
XDG_CURRENT_DESKTOP="Deepin"
export LD_LIBRARY_PATH=/usr/share/uengine/lib64/
"$@"

@ -207,7 +207,7 @@ Name={}
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
self.RunCommandShow("echo '打包 deb 到桌面……'")
self.RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
self.RunCommandShow("dpkg-deb -Z xz -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
self.RunCommandShow("echo '正在删除临时目录……'")
self.RunCommandShow("rm -rfv '{}'".format(tempPath))
self.RunCommandShow("echo '完成!'")
@ -289,7 +289,7 @@ def write_txt(path, things):
file.close() # 关闭文本对象
def GetApkInformation(apkFilePath):
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
return GetCommandReturn("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, apkFilePath))
def GetApkActivityName(apkFilePath):
info = GetApkInformation(apkFilePath)

@ -227,7 +227,7 @@ Name={}
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
self.RunCommandShow("echo '打包 deb 到桌面……'")
self.RunCommandShow("dpkg -b '{}' '{}/{}_{}_all.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, versionText.text()))
self.RunCommandShow("dpkg-deb -Z xz -b '{}' '{}/{}_{}_all.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, versionText.text()))
self.RunCommandShow("echo '正在删除临时目录……'")
self.RunCommandShow("rm -rfv '{}'".format(tempPath))
self.RunCommandShow("echo '完成!'")
@ -313,7 +313,7 @@ def write_txt(path, things):
file.close() # 关闭文本对象
def GetApkInformation(apkFilePath):
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
return GetCommandReturn("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, apkFilePath))
def GetApkActivityName(apkFilePath):
info = GetApkInformation(apkFilePath)

@ -89,8 +89,8 @@ class UninstallProgram(QtCore.QThread):
self.error.emit("疑似卸载失败,请检查 UEngine 是否正常安装、运行以及 APK 文件或包名是否正确、完整")
DisabledAndEnbled(False)
return
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), package)):
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), package))
if os.path.exists("{}/{}.desktop".format(desktopFilePath, package)):
os.remove("{}/{}.desktop".format(desktopFilePath, package))
if os.path.exists("{}/{}.desktop".format(get_desktop_path(), package)):
os.remove("{}/{}.desktop".format(get_desktop_path(), package))
findApkHistory.append(ComboInstallPath.currentText())
@ -174,9 +174,9 @@ class InstallApk(QtCore.QThread):
try:
if not os.path.exists("/tmp/uengine-runner"):
os.makedirs("/tmp/uengine-runner")
if not os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
if not os.path.exists(desktopFilePath):
print("Mkdir")
os.makedirs("{}/.local/share/applications/uengine/".format(get_home()))
os.makedirs(desktopFilePath)
# 读取设置
setting = json.loads(readtxt(get_home() + "/.config/uengine-runner/setting.json"))
# 安装应用
@ -246,7 +246,7 @@ logicalHeight {verticalHeighe}
"{}/{}.desktop".format(get_desktop_path(), GetApkPackageName(path)))
print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)))
"{}/{}.desktop".format(desktopFilePath, GetApkPackageName(path)))
print("\nprint install complete")
if quit:
return
@ -266,7 +266,7 @@ def InstallBuildDesktop(iconSavePath):
"{}/{}.desktop".format(get_desktop_path(), GetApkPackageName(path)), choose)
print("start install apk3")
BuildUengineDesktop(GetApkPackageName(path), GetApkActivityName(path), GetApkChineseLabel(path), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), GetApkPackageName(path)), choose)
"{}/{}.desktop".format(desktopFilePath, GetApkPackageName(path)), choose)
print("\nprint install complete")
def UpdateCombobox(tmp):
@ -418,7 +418,7 @@ def write_txt(path: "路径", things: "内容")->"写入文本文档":
# 获取 aapt 的所有信息
def GetApkInformation(apkFilePath: "apk 所在路径")->"获取 aapt 的所有信息":
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
return GetCommandReturn("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, apkFilePath))
# 获取 apk Activity
def GetApkActivityName(apkFilePath: "apk 所在路径")->"获取 apk Activity":
@ -587,8 +587,8 @@ def BackUengineClean()->"清空 uengine 数据":
if QtWidgets.QMessageBox.warning(widget, "警告", "清空后数据将会完全丢失,确定要继续吗?", QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel) == QtWidgets.QMessageBox.Ok:
DisabledAndEnbled(True)
try:
if os.path.exists("{}/.local/share/applications/uengine/".format(get_home())):
shutil.rmtree("{}/.local/share/applications/uengine/".format(get_home()))
if os.path.exists(desktopFilePath):
shutil.rmtree(desktopFilePath)
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(widget, "错误", traceback.format_exc())
@ -1004,7 +1004,7 @@ class UengineWindowSizeSetting:
i.setChecked(True)
UengineWindowSizeSetting.setting.setWindowTitle(f"设置 Android 应用的窗口大小缩放设置")
UengineWindowSizeSetting.setting.show()
UengineWindowSizeSetting.setting.resize(UengineWindowSizeSetting.setting.frameSize().width() * 1.3, UengineWindowSizeSetting.setting.frameSize().height())
UengineWindowSizeSetting.setting.resize(int(UengineWindowSizeSetting.setting.frameSize().width() * 1.3), int(UengineWindowSizeSetting.setting.frameSize().height()))
def ReadSetting():
file = open(f"/usr/share/uengine/appetc/{UengineWindowSizeSetting.package}.txt")
@ -1191,7 +1191,7 @@ class UpdateWindow():
UpdateWindow.update.setCentralWidget(updateWidget)
UpdateWindow.update.setWindowTitle("检查 UEngine 运行器更新")
UpdateWindow.update.setWindowIcon(QtGui.QIcon(iconPath))
UpdateWindow.update.resize(updateWidget.frameGeometry().width(), int(updateWidget.frameGeometry().height() * 1.5))
UpdateWindow.update.resize(int(updateWidget.frameGeometry().width()), int(updateWidget.frameGeometry().height() * 1.5))
UpdateWindow.update.show()
def Update():
@ -1410,7 +1410,7 @@ class ShowTextTipsWindow():
ShowTextTipsWindow.messageWindow.setWindowTitle("提示")
ShowTextTipsWindow.messageWindow.setWindowIcon(QtGui.QIcon(iconPath))
ShowTextTipsWindow.messageWindow.show()
ShowTextTipsWindow.messageWindow.resize(ShowTextTipsWindow.messageWindow.frameSize().width() * 2, ShowTextTipsWindow.messageWindow.frameSize().height() * 1.5)
ShowTextTipsWindow.messageWindow.resize(int(ShowTextTipsWindow.messageWindow.frameSize().width() * 2), int(ShowTextTipsWindow.messageWindow.frameSize().height() * 1.5))
return
# 添加/删除 uengine 应用快捷方式
@ -1462,7 +1462,7 @@ class AddNewUengineDesktopLink():
# 添加快捷方式
def SaveDesktopLink():
try:
if os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text())):
if os.path.exists("{}/{}.desktop".format(desktopFilePath, packageName.text())):
if QtWidgets.QMessageBox.question(widget, "提示", "文件已存在,是否要覆盖?") == QtWidgets.QMessageBox.No:
return
if not os.path.exists("{}/.local/share/icons/hicolor/256x256/apps/".format(get_home())):
@ -1470,9 +1470,9 @@ class AddNewUengineDesktopLink():
global activityName
iconSavePath = "{}/.local/share/icons/hicolor/256x256/apps/{}.png".format(get_home(), packageName.text())
shutil.copy(programPath + "/defult.png", iconSavePath)
BuildUengineDesktop(packageName.text(), activityName, packageName.text(), iconSavePath,
"{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text()))
BuildUengineDesktop(packageName.text(), activityName, packageName.text(), iconSavePath,
BuildUengineDesktop(packageName.text(), activityName.text(), packageName.text(), iconSavePath,
"{}/{}.desktop".format(desktopFilePath, packageName.text()))
BuildUengineDesktop(packageName.text(), activityName.text(), packageName.text(), iconSavePath,
"{}/{}.desktop".format(get_desktop_path(), packageName.text()))
AddNewUengineDesktopLink.SaveHistory()
QtWidgets.QMessageBox.information(widget, "提示", "创建完毕!")
@ -1485,13 +1485,13 @@ class AddNewUengineDesktopLink():
def DelDesktopLink():
try:
global packageName
if not os.path.exists("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text())):
QtWidgets.QMessageBox.critical(widget, "错误", "此包名对应的 UEngine 桌面快捷方式不存在!")
if not os.path.exists("{}/{}.desktop".format(desktopFilePath, packageName.text())):
QtWidgets.QMessageBox.critical(widget, "错误", "此包名对应的 UEngine 快捷方式不存在!")
return
if QtWidgets.QMessageBox.warning(widget, "警告", "你确定要删除吗?删除后将无法恢复!", QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel) == QtWidgets.QMessageBox.Cancel:
return
try:
os.remove("{}/.local/share/applications/uengine/{}.desktop".format(get_home(), packageName.text()))
os.remove("{}/{}.desktop".format(desktopFilePath, packageName.text()))
AddNewUengineDesktopLink.SaveHistory()
QtWidgets.QMessageBox.information(widget, "提示", "已删除")
except:
@ -1559,7 +1559,7 @@ def UseProgram():
<p>10、deepin 终端:{}</p>'''.format(subprocess.getoutput("uengine version"),
subprocess.getoutput("python3 --version"),
QtCore.qVersion,
subprocess.getoutput("aapt version"),
subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' version"),
subprocess.getoutput("dpkg --version"),
subprocess.getoutput("mkdir --version"),
subprocess.getoutput("chmod --version"),
@ -1570,6 +1570,26 @@ def BackAPK(choice):
global choose
choose = choice
def InstallUEnginePatchForWayland():
if os.system("which uengine"):
QtWidgets.QMessageBox.critical(window, "错误", "未安装UEngine请先安装UEngine")
return
if os.path.exists("/usr/bin/uengine-session"):
QtWidgets.QMessageBox.critical(window, "提示", "已安装该补丁,请勿重复安装")
return
os.system(f"pkexec bash '{programPath}/LoadingBinder/uengine-wayland-install.sh'")
QtWidgets.QMessageBox.information(window, "提示", "安装成功!重启电脑后生效")
def RemoveUEnginePatchForWayland():
if os.system("which uengine"):
QtWidgets.QMessageBox.critical(window, "错误", "未安装UEngine请先安装UEngine")
return
if not os.path.exists("/usr/bin/uengine-session"):
QtWidgets.QMessageBox.critical(window, "提示", "已卸载该补丁,无需卸载")
return
os.system(f"pkexec bash '{programPath}/LoadingBinder/uengine-wayland-uninstall.sh'")
QtWidgets.QMessageBox.information(window, "提示", "卸载成功!重启电脑后生效")
###########################
# 程序信息
###########################
@ -1582,11 +1602,10 @@ if not lang in langFile.keys():
programUrl = information["Url"][0]
version = information["Version"]
goodRunSystem = information["System"]
aaptVersion = GetCommandReturn("aapt version")
aaptVersion = GetCommandReturn(f"'{programPath}/aapt/run-aapt.sh' version")
SystemVersion = GetSystemVersion()
iconPath = "{}/runner.svg".format(os.path.split(os.path.realpath(__file__))[0])
about = f'''<p align="center"><img width=256 src="{iconPath}"/></p>
<p>介绍虽然通过Deepin/UOS应用商店已经能够安装部分安卓应用但对于安卓应用爱好者来说不能自由地安装任意APK软件包实在是不尽如人意。本软件可以实现在Deepin/UOS上安装任意APK软件包并能将其启动图标发送到系统桌面或启动器中方便用户快速启动它。 </p>
about = f'''<p>介绍虽然通过Deepin/UOS应用商店已经能够安装部分安卓应用但对于安卓应用爱好者来说不能自由地安装任意APK软件包实在是不尽如人意。本软件可以实现在Deepin/UOS上安装任意APK软件包并能将其启动图标发送到系统桌面或启动器中方便用户快速启动它。 </p>
<p>程序开源许可证GPLV3</p>
<p>版本:{version}</p>
<p>适用平台:{goodRunSystem}</p>
@ -1594,10 +1613,22 @@ about = f'''<p align="center"><img width=256 src="{iconPath}"/></p>
<p>程序官网:{programUrl}</p>
<p>系统版本:{SystemVersion}</p>
<p>安装包构建时间:{information['Time']}</p>
<p>QQ 交流群872491938</p>
<h1>©2021-{time.strftime("%Y")} gfdgd xi</h1>'''
updateThingsString = ""
tips = ""
contribute = ""
appreciate = f"""<h3>请作者喝杯茶</h3>
<p>如果您觉得 UEngine 运行器对你有帮助,可以请作者喝杯茶 </p>
<p>
<img src="{programPath}/Icon/QR/Wechat.png" width="250" />
<img src="{programPath}/Icon/QR/Alipay.jpg" width="250" />
<img src="{programPath}/Icon/QR/QQ.png" width="250" >
</p>
<hr/>
<h3>广告</h3>
<p>支付宝官方活动,扫描获得支付红包!</p>
<p><img src="{programPath}/Icon/QR/advertisement0.jpg" width="250" ></p>"""
for i in information["Tips"]:
tips += f"<p>{i}</p>"
for i in information["Update"]:
@ -1611,13 +1642,25 @@ desktop = programPath + "/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop"
useProgram = ""
threading.Thread(target=UseProgram).start()
isDeepin23=False
# 判断是不是 Deepin23
if os.path.exists("/etc/deepin_version"):
try:
with open(f"/etc/deepin_version") as file:
isDeepin23 = "23" in file.read()
except:
traceback.print_exc()
desktopFilePath = f"{get_home()}/.local/share/applications/uengine/"
if isDeepin23:
desktopFilePath = f"{get_home()}/.local/share/applications/"
###########################
# 加载配置
###########################
app = QtWidgets.QApplication(sys.argv)
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(desktopFilePath):
os.makedirs(desktopFilePath)
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"): # 如果没有配置文件
@ -1745,7 +1788,16 @@ def showhelp():
def ChgLog():
HelpStr.setHtml(updateThingsString)
def ChgAbout(event):
HelpStr.setHtml(about)
HelpStr.setHtml(f"<p align='center'><a href='https://www.gfdgdxi.top/ChangeIcon'><img width=256 src='{iconPath}'/></a></p>\n" + about)
def OpenUrl(url):
print(url.url())
if url.url() == "https://www.gfdgdxi.top/ChangeIcon":
ChgAboutChangeIcon()
return
webbrowser.open_new_tab(url.url())
def ChgAboutChangeIcon():
HelpStr.setHtml(f"<p align='center'><img width=256 src='{programPath}/Icon/Program/about-icon.png'/></p>\n" + about)
def ChgDep():
if useProgram == "":
BtnZujian.setDisabled(True)
@ -1755,7 +1807,8 @@ def showhelp():
HelpStr.setHtml(contribute)
def ChgTips():
HelpStr.setHtml(tips)
def ChgAppreciate():
HelpStr.setHtml(appreciate)
def ChgGPLV3():
try:
with open(f"{programPath}/LICENSE", "r") as file:
@ -1778,7 +1831,12 @@ def showhelp():
BtnDownN = QtWidgets.QPushButton("程序下载量")
BtnOpenN = QtWidgets.QPushButton("程序打开量")
BtnGPLV3 = QtWidgets.QPushButton("程序开源许可证")
appreciateButton = QtWidgets.QPushButton("赞赏作者")
HelpStr = QtWidgets.QTextBrowser()
HelpStr.setOpenLinks(False)
HelpStr.setHtml(about)
HelpStr.setOpenExternalLinks(False)
HelpStr.anchorClicked.connect(OpenUrl)
# 此功能从 2.0.0 后不再隐藏
#BtnDownN.setEnabled("--彩蛋" in sys.argv)
BtnReadme.clicked.connect(ChgTips)
@ -1789,6 +1847,7 @@ def showhelp():
BtnDownN.clicked.connect(Download)
BtnGPLV3.clicked.connect(ChgGPLV3)
BtnOpenN.clicked.connect(Open)
appreciateButton.clicked.connect(ChgAppreciate)
ChgTips()
@ -1799,14 +1858,18 @@ def showhelp():
helpLayout.addWidget(BtnDownN, 4, 0, 1, 1)
helpLayout.addWidget(BtnOpenN, 5, 0, 1, 1)
helpLayout.addWidget(BtnGPLV3, 6, 0, 1, 1)
helpLayout.addWidget(BtnAbout, 7, 0, 1, 1)
helpLayout.addWidget(HelpStr, 0, 1, 10, 1)
helpLayout.addWidget(appreciateButton, 7, 0, 1, 1)
helpLayout.addWidget(BtnAbout, 8, 0, 1, 1)
helpLayout.addWidget(HelpStr, 0, 1, 11, 1)
helpWidget.setLayout(helpLayout)
helpWindow.setCentralWidget(helpWidget)
helpWindow.setFixedSize(int(helpWindow.frameSize().width() * 0.9), int(helpWindow.frameSize().height() * 1.5))
helpWindow.setWindowTitle("帮助")
helpWindow.setWindowIcon(QtGui.QIcon(iconPath))
# 设置背景
helpWindow.setObjectName("helpWindow")
helpWindow.setStyleSheet(f"QWidget#helpWindow {{background: url({programPath}/Icon/Program/about-background.png) no-repeat;background-position: left bottom;}}")
helpWindow.show()
return
@ -1816,6 +1879,9 @@ def showhelp():
if not os.path.exists("/usr/bin/uengine"):
# Deepin/UOS 用户
if "deepin" in SystemVersion.lower() or "uos" in SystemVersion.lower() or subprocess.getoutput("arch").replace("\n", "").replace(" ", "") != "x86_64":
if not "ft-" in GetCommandReturn("lscpu").lower() and GetCommandReturn("lscpu").replace(" ", "").replace("\n", "") == "aarch64":
QtWidgets.QMessageBox.critical(None, "错误", "UEngine 运行器不支持非飞腾 CPU")
sys.exit(1)
if QtWidgets.QMessageBox.question(None, "提示", "您的电脑没有安装 UEngine是否安装 UEngine 以便更好的使用\n安装完后重新启动该程序即可") == QtWidgets.QMessageBox.Yes:
OpenTerminal(f"pkexec apt install uengine -y")
sys.exit(0)
@ -1830,10 +1896,19 @@ if not os.path.exists("/usr/bin/uengine"):
OpenTerminal(f"bash '{programPath}/uengine-installer'")
sys.exit(0)
###########################
# 窗口创建
###########################
window = QtWidgets.QMainWindow()
# 判断系统是不是 Deepin 23、有没有安装 Wayland 补丁、是不是 Wayland 环境
if not os.path.exists("/usr/bin/uengine-session") and isDeepin23 and os.getenv("XDG_SESSION_TYPE") == "wayland":
# 如果是
if QtWidgets.QMessageBox.question(None, "提示", "检测到您使用的是 Deepin 23 + Wayland 环境,建议安装 UEngine For Wayland 补丁以便能正常使用 UEngine是否安装") == QtWidgets.QMessageBox.Yes:
InstallUEnginePatchForWayland()
widget = QtWidgets.QWidget()
widgetLayout = QtWidgets.QGridLayout()
# 权重
@ -1978,6 +2053,9 @@ uengineUbuntuInstall = QtWidgets.QAction(QtGui.QIcon.fromTheme("ubuntu-logo-icon
uengineUbuntuRemove = QtWidgets.QAction(QtGui.QIcon.fromTheme("ubuntu-logo-icon"), "移除在 Ubuntu/Debian 上安装的 UEngine 及其附属脚本")
uengineUbuntuInstallRoot = QtWidgets.QAction(QtGui.QIcon.fromTheme("ubuntu-logo-icon"), "在 Ubuntu/Debian 上安装 UEngineSuperSU 镜像)")
uengineWindowSizeSetting = QtWidgets.QAction(langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][16])
uengineInstallVia = QtWidgets.QAction("安装 Via")
installUEnginePatchForWayland = QtWidgets.QAction("安装 UEngine For Wayland 补丁")
uninstallUEnginePatchForWayland = QtWidgets.QAction("卸载 UEngine For Wayland 补丁")
uengine.addAction(uengineOpenDebBuilder)
uengine.addAction(uengineOpenDebBuilderMore)
uengine.addAction(uengineKeyboardToMouse)
@ -2003,6 +2081,12 @@ uengine.addSeparator()
uengine.addAction(uengineDeleteUengineCheck)
uengine.addAction(uengineReinstall)
uengineRoot = uengine.addMenu(langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][11]["Name"])
uengine.addSeparator()
uengine.addAction(uengineInstallVia)
uengine.addSeparator()
uengine.addAction(installUEnginePatchForWayland)
uengine.addAction(uninstallUEnginePatchForWayland)
#uengineUbuntuInstall.setDisabled(True)
# 绑定信号
uengineAllowOrDisallowUpdateAndroidApp.triggered.connect(AllowOrDisallowUpdateAndroidApp)
@ -2017,6 +2101,14 @@ uengineUbuntuInstallRoot.triggered.connect(UengineUbuntuInstallRoot)
uengineDeleteUengineCheck.triggered.connect(DelUengineCheck)
uengineReinstall.triggered.connect(ReinstallUengine)
uengineWindowSizeSetting.triggered.connect(UengineWindowSizeSetting.ShowWindow)
installUEnginePatchForWayland.triggered.connect(InstallUEnginePatchForWayland)
uninstallUEnginePatchForWayland.triggered.connect(RemoveUEnginePatchForWayland)
def InstallVia():
ComboInstallPath.setCurrentText(f"{programPath}/APK/Via.apk")
Button3Install()
uengineInstallVia.triggered.connect(InstallVia)
uengineStart = QtWidgets.QAction(QtGui.QIcon.fromTheme("services"), langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][0])
uengineStop = QtWidgets.QAction(QtGui.QIcon.fromTheme("services"), langFile[lang]["Main"]["MainWindow"]["Menu"][2]["Menu"][2]["Menu"][1])

@ -35,7 +35,7 @@ information = json.loads(readtxt(programPath + "/information.json"))
programUrl = information["Url"][0]
version = information["Version"]
goodRunSystem = information["System"]
aaptVersion = subprocess.getoutput("aapt version")
aaptVersion = subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' version")
about = '''介绍 :一个基于 Python3 的 tkinter 制作的 UEngine 运行器在新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。
版本 {}
@ -75,7 +75,7 @@ def UseProgram():
10、deepin 终端:{}'''.format(subprocess.getoutput("uengine version"),
subprocess.getoutput("python3 --version"),
tk.TkVersion,
subprocess.getoutput("aapt version"),
subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' version"),
subprocess.getoutput("dpkg --version"),
subprocess.getoutput("mkdir --version"),
subprocess.getoutput("chmod --version"),

@ -33,7 +33,7 @@ def Update(name, stars, contact, things, version):
"Version": version
}
try:
QtWidgets.QMessageBox.information(widget, "提示", requests.post(parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vdWVuZ2luZS1ydW5uZXIvYnVnL3VwbG9hZC5waHA=").decode("utf-8")), data=data).text)
QtWidgets.QMessageBox.information(widget, "提示", requests.post(parse.unquote(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3VlbmdpbmUtcnVubmVyL2J1Zy91cGxvYWQucGhw").decode("utf-8")), data=data).text)
print(data)
except:
traceback.print_exc()
@ -104,4 +104,11 @@ window.setCentralWidget(widget)
window.setWindowTitle(f"UEngine 运行器 {version} 问题/建议反馈")
window.setWindowIcon(QtGui.QIcon(iconPath))
window.show()
starMenu.setDisabled(True)
contactThings.setDisabled(True)
#otherUpload.setDisabled(True)
nameThings.setDisabled(True)
updateButton.setDisabled(True)
updateThings.setDisabled(True)
updateThings.setText("请移步到 Gitee 或 Github 提交 Bug推荐使用 Gitee")
sys.exit(app.exec_())

@ -8,15 +8,12 @@ PIDFILE = '/tmp/uengine-runner.pid'
#程序结束时清理pid
@atexit.register
def remove_pid():
try:
with open(PIDFILE) as pidfile:
pidlst = pidfile.readlines()
pidlst.remove(str(PID)+'\n')
with open(PIDFILE,'w') as pidfile:
pidfile.writelines(pidlst)
except:
# 忽略
pass
'''程序结束时清理pid'''
with open(PIDFILE) as pidfile:
pidlst = pidfile.readlines()
pidlst.remove(str(PID)+'\n') #移除记录中的pid
with open(PIDFILE,'w') as pidfile:
pidfile.writelines(pidlst)
#更新时结束进程
def main():
@ -25,7 +22,7 @@ def main():
os.kill(int(i),15)
except ProcessLookupError:
pass
os.remove(PIDFILE)
## os.remove(PIDFILE) #因修复#I6ZRZX而注释
#当该程序被直接执行时执行结束进程操作。如果是导入的形式则只是记录pid
if __name__ == '__main__':

@ -2,3 +2,6 @@
export XDG_SESSION_TYPE=x11
export QT_QPA_PLATFORM=xcb
unset WAYLAND_DISPLAYCOPY
XDG_CURRENT_DESKTOP="Deepin"
export LD_LIBRARY_PATH=/usr/share/uengine/lib64/
"$@"

BIN
spark-uengine-runner.deb Executable file → Normal file

Binary file not shown.

@ -207,7 +207,7 @@ Name={}
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
self.RunCommandShow("echo '打包 deb 到桌面……'")
self.RunCommandShow("dpkg -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
self.RunCommandShow("dpkg-deb -Z xz -b '{}' '{}/{}_{}.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, apkPackageVersion))
self.RunCommandShow("echo '正在删除临时目录……'")
self.RunCommandShow("rm -rfv '{}'".format(tempPath))
self.RunCommandShow("echo '完成!'")
@ -289,7 +289,7 @@ def write_txt(path, things):
file.close() # 关闭文本对象
def GetApkInformation(apkFilePath):
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
return GetCommandReturn("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, apkFilePath))
def GetApkActivityName(apkFilePath):
info = GetApkInformation(apkFilePath)

@ -227,7 +227,7 @@ Name={}
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
self.RunCommandShow("echo '打包 deb 到桌面……'")
self.RunCommandShow("dpkg -b '{}' '{}/{}_{}_all.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, versionText.text()))
self.RunCommandShow("dpkg-deb -Z xz -b '{}' '{}/{}_{}_all.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, versionText.text()))
self.RunCommandShow("echo '正在删除临时目录……'")
self.RunCommandShow("rm -rfv '{}'".format(tempPath))
self.RunCommandShow("echo '完成!'")
@ -313,7 +313,7 @@ def write_txt(path, things):
file.close() # 关闭文本对象
def GetApkInformation(apkFilePath):
return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath))
return GetCommandReturn("'{}/aapt/run-aapt.sh' dump badging '{}'".format(programPath, apkFilePath))
def GetApkActivityName(apkFilePath):
info = GetApkInformation(apkFilePath)

@ -35,7 +35,7 @@ information = json.loads(readtxt(programPath + "/information.json"))
programUrl = information["Url"][0]
version = information["Version"]
goodRunSystem = information["System"]
aaptVersion = subprocess.getoutput("aapt version")
aaptVersion = subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' version")
about = '''介绍 :一个基于 Python3 的 tkinter 制作的 UEngine 运行器在新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。
版本 {}
@ -75,7 +75,7 @@ def UseProgram():
10、deepin 终端:{}'''.format(subprocess.getoutput("uengine version"),
subprocess.getoutput("python3 --version"),
tk.TkVersion,
subprocess.getoutput("aapt version"),
subprocess.getoutput(f"'{programPath}/aapt/run-aapt.sh' version"),
subprocess.getoutput("dpkg --version"),
subprocess.getoutput("mkdir --version"),
subprocess.getoutput("chmod --version"),

@ -33,7 +33,7 @@ def Update(name, stars, contact, things, version):
"Version": version
}
try:
QtWidgets.QMessageBox.information(widget, "提示", requests.post(parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vdWVuZ2luZS1ydW5uZXIvYnVnL3VwbG9hZC5waHA=").decode("utf-8")), data=data).text)
QtWidgets.QMessageBox.information(widget, "提示", requests.post(parse.unquote(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3VlbmdpbmUtcnVubmVyL2J1Zy91cGxvYWQucGhw").decode("utf-8")), data=data).text)
print(data)
except:
traceback.print_exc()
@ -104,4 +104,11 @@ window.setCentralWidget(widget)
window.setWindowTitle(f"UEngine 运行器 {version} 问题/建议反馈")
window.setWindowIcon(QtGui.QIcon(iconPath))
window.show()
starMenu.setDisabled(True)
contactThings.setDisabled(True)
#otherUpload.setDisabled(True)
nameThings.setDisabled(True)
updateButton.setDisabled(True)
updateThings.setDisabled(True)
updateThings.setText("请移步到 Gitee 或 Github 提交 Bug推荐使用 Gitee")
sys.exit(app.exec_())

@ -8,15 +8,12 @@ PIDFILE = '/tmp/uengine-runner.pid'
#程序结束时清理pid
@atexit.register
def remove_pid():
try:
with open(PIDFILE) as pidfile:
pidlst = pidfile.readlines()
pidlst.remove(str(PID)+'\n')
with open(PIDFILE,'w') as pidfile:
pidfile.writelines(pidlst)
except:
# 忽略
pass
'''程序结束时清理pid'''
with open(PIDFILE) as pidfile:
pidlst = pidfile.readlines()
pidlst.remove(str(PID)+'\n') #移除记录中的pid
with open(PIDFILE,'w') as pidfile:
pidfile.writelines(pidlst)
#更新时结束进程
def main():
@ -25,7 +22,7 @@ def main():
os.kill(int(i),15)
except ProcessLookupError:
pass
os.remove(PIDFILE)
## os.remove(PIDFILE) #因修复#I6ZRZX而注释
#当该程序被直接执行时执行结束进程操作。如果是导入的形式则只是记录pid
if __name__ == '__main__':