From 20c32733c3019307292fdc89d6c77fac90937120 Mon Sep 17 00:00:00 2001
From: gfdgd_xi <3025613752@qq.com>
Date: Fri, 6 Jan 2023 21:30:12 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EUEngine=20API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 uengine-api/README.md                         | 109 +++++
 uengine-api/__init__.py                       | 371 ++++++++++++++++++
 .../__pycache__/__init__.cpython-310.pyc      | Bin 0 -> 15890 bytes
 .../__pycache__/__init__.cpython-37.pyc       | Bin 0 -> 16047 bytes
 .../__pycache__/getxmlimg.cpython-37.pyc      | Bin 0 -> 3202 bytes
 uengine-api/defult.png                        | Bin 0 -> 35859 bytes
 uengine-api/getxmlimg.py                      | 118 ++++++
 uengine-api/root-uengine.sh                   |  76 ++++
 8 files changed, 674 insertions(+)
 create mode 100755 uengine-api/README.md
 create mode 100755 uengine-api/__init__.py
 create mode 100644 uengine-api/__pycache__/__init__.cpython-310.pyc
 create mode 100644 uengine-api/__pycache__/__init__.cpython-37.pyc
 create mode 100755 uengine-api/__pycache__/getxmlimg.cpython-37.pyc
 create mode 100755 uengine-api/defult.png
 create mode 100755 uengine-api/getxmlimg.py
 create mode 100755 uengine-api/root-uengine.sh

diff --git a/uengine-api/README.md b/uengine-api/README.md
new file mode 100755
index 0000000..8630a4e
--- /dev/null
+++ b/uengine-api/README.md
@@ -0,0 +1,109 @@
+# API 介绍
+# 必知
+1. 此 API 只支持可以运行 UEngine 的 Linux 上,Windows 上无法使用
+2. 部分函数需要 root 权限
+3. 这是 UEngine 运行器的函数重构,所以一些 UEngine 运行器上没有的 bug 可能在这个 API 里有
+## ProgramInformation
+用于获取一些程序信息,详细如下(未特殊表明的是变量,否则是函数):
+| 变量/函数名 | 变量/函数介绍 |
+|:-:|:-:|
+| programPath | 获取程序所在路径 |
+| version | API 版本 |
+| updateTime | 更新时间 |
+| websize | 程序官网 |
+| home | 用户 home(用户文件)目录 |
+| developer | 参与的开发者列表 |
+| language | 当前语言 |
+| DesktopPath() | (函数)用户桌面目录 |
+
+## Check
+用于检查 API 所需的东西是否完整,详细如下:  
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| CheckDepend() | 检查 API 所需的依赖是否完整 |  
+
+## ROOT
+用于检查 ROOT 方面问题,详细如下:
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| GetRoot() | 检查程序/API是否以 ROOT 权限运行 |
+
+## APK
+这是面向对象的写法,所以应用方式也不一样:
+```python
+import api
+xxx = api.APK("APK 所在路径")
+```
+具体函数介绍:  
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| xxx.install() | 安装这个 APK 包(需要 Root) |
+| xxx.uninstall()| 卸载这个 APK 包(需要 Root) |
+| xxx.information()| 获取从 aapt 获取到的 APK 信息 |
+| xxx.activityName() | 获取 APK 的 Activity 信息 |
+| xxx.packageName() | 获取 APK 包名 |
+| xxx.chineseLabel() | 获取 APK 中文名称 |
+| xxx.saveApkIcon("图标保存路径") | 保存 APK 的图标到指定路径 |
+| xxx.version() | 获取 APK 版本号 |
+| xxx.saveDesktopFile("图标保存路径", "快捷方式保存路径") | 保存支持 UEngine 启动的 APK 快捷方式 |
+| xxx.run() | 运行该应用(需要保证已经安装) |
+| xxx.buildDeb("deb 包保存路径", qianZhui) | 打包为 deb 包(“qianZhui”是布尔值,可略,True代表有前缀为“uengine-dc”,False代表没有前缀) |
+
+## UEngine
+用于对 UEngine 进行一点点操控,详细如下:
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| UengineAppManager() | 显示 UEngine 安装应用程序管理器 |
+| OpenApp("应用包名", "应用Activity") | 运行指定的应用(需要保证程序已经安装) |
+| UengineDataClean() | 清空 UEngine 数据(需要 Root) |
+| RemoveUengineCheck() | 删除 UEngine 的检查脚本(需要 Root) |
+| CPUCheck() | 检查 CPU 是否支持运行 UEngine |
+| BuildUengineRootImage() | 构建 UEngine 的 Root 镜像 |
+| OpenUengineRootData() | 打开 UEngine 数据目录 |
+| InstallRootUengineImage() | 安装已经被 Root 过的 UEngine 镜像(需要 Root) |
+| Services | 用于操控 UEngine 服务的类,见下(需要 Root) |
+| InternetBridge | 用于操控 UEngine 网络桥接的类,见下(需要 Root) |
+### Services
+关于 UEngine 的服务控制:
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| Services.Open() | 打开 UEngine 服务(需要 Root) | 
+| Services.Close() | 关闭 UEngine 服务(需要 Root) |
+| Services.Restart() | 重启 UEngine 服务(需要 Root) |
+### InternetBridge
+关于 UEngine 的网络桥接控制:
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| InternetBridge.Open() | 打开 UEngine 网络桥接(需要 Root) | 
+| InternetBridge.Close() | 关闭 UEngine 网络桥接(需要 Root) |
+| InternetBridge.Restart() | 重启 UEngine 网络桥接(需要 Root) |
+| InternetBridge.Reload() | 重新加载 UEngine 网络桥接(需要 Root) |
+| InternetBridge.ForceReload() | 强制加载 UEngine 网络桥接(需要 Root) |
+## Adb
+用于对 Adb 的部分操控
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| Services | 用于操控 Adb 服务的类,见下 |
+### Service
+关于 Adb 的服务控制:
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| Services.Open() | 打开 Adb 服务 | 
+| Services.Close() | 关闭 Adb 服务 |
+| Services.Kill() | 杀死 Adb 进程 |
+## File
+关于文件的读取和写入,这是面向对象的写法,所以应用方式也不一样:
+```python
+import api
+xxx = api.File("文件所在路径")
+```
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| xxx.read() | 读取这个文件 |
+| xxx.write("写入内容") | 写入这个文件 |
+
+## UengineRunner
+用于 UEngine 运行器的部分操控(请保证安装了 UEngine 运行器)
+| 函数名 | 函数介绍 |
+|:-:|:-:|
+| CleanHistory() | 清理 UEngine 运行器的历史记录 |
\ No newline at end of file
diff --git a/uengine-api/__init__.py b/uengine-api/__init__.py
new file mode 100755
index 0000000..9409c47
--- /dev/null
+++ b/uengine-api/__init__.py
@@ -0,0 +1,371 @@
+import os
+import random
+import shutil
+import zipfile
+import traceback
+import subprocess
+from getxmlimg import getsavexml
+
+class ProgramInformation:
+    programPath = os.path.split(os.path.realpath(__file__))[0]  # 返回 string
+    version = "1.6.0Alpha2"
+    updateTime = "2022年05月21日"
+    websize = ["https://gitee.com/gfdgd-xi/uengine-runner", "https://github.com/gfdgd-xi/uengine-runner"]
+    home = os.path.expanduser('~')
+    developer = ["gfdgd xi<3025613752@qq.com>", "为什么您不喜欢熊出没和阿布呢<https://weibo.com/u/7755040136>", "星空露光<https://gitee.com/Cynorkyle>", "actionchen<917981399@qq.com>", "柚子<https://gitee.com/Limexb>"]
+    lang = os.getenv('LANG')
+    # 获取用户桌面目录
+    def DesktopPath() -> "获取用户桌面目录":
+        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  # 返回目录
+
+# 判断程序以正确方式运行
+class Check:
+    def CheckDepend():
+        depend = ["/usr/bin/uengine", "UEngine", "/usr/bin/adb", "adb", "/usr/bin/uengine-session-launch-helper", "UEngine", "/usr/bin/aapt", "aapt"]
+        for i in range(0, len(depend), 2):
+            if not os.path.exists(depend[i]):
+                print("依赖{}不存在".format(depend[i + 1]))
+
+class ROOT:
+    def GetRoot():
+        return os.geteuid() == 0
+
+class APK:
+    def __init__(self, apkPath):
+        self.apkPath = apkPath
+    def install(self):
+        os.system("pkexec /usr/bin/uengine-session-launch-helper -- uengine install --apk='{}'".format(self.apkPath))
+    def uninstall(self):
+        os.system("pkexec /usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg='{}'".format(self.packageName()))
+    def information(self):
+        return subprocess.getoutput("aapt dump badging '{}'".format(self.apkPath))
+    def activityName(self):
+        info = self.information()
+        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 packageName(self):
+        info = self.information()
+        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 chineseLabel(self) -> "获取软件的中文名称":
+        info = self.information()
+        for line in info.split('\n'):
+            if "application-label:" in line:
+                line = line.replace("application-label:", "")
+                line = line.replace("'", "")
+                return line
+    # 保存apk图标
+    def saveApkIcon(self, iconSavePath) -> "保存 apk 文件的图标":
+        try:
+            if os.path.exists(iconSavePath):
+                os.remove(iconSavePath)
+            info = self.information()
+            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(self.apkPath, xmlpath, iconSavePath)
+                        return
+                    else:
+                        zip = zipfile.ZipFile(self.apkPath)
+                        iconData = zip.read(xmlpath)
+                        with open(iconSavePath, 'w+b') as saveIconFile:
+                            saveIconFile.write(iconData)
+                            return
+            print("None Icon! Show defult icon")
+            shutil.copy(ProgramInformation.programPath + "/defult.png", iconSavePath)
+        except:
+            traceback.print_exc()
+            print("Error, show defult icon")
+            shutil.copy(ProgramInformation.programPath + "/defult.png", iconSavePath)
+    def version(self):
+        info = self.information()
+        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
+    def saveDesktopFile(self, desktopPath, iconPath):
+        showName = self.chineseLabel()
+        if showName == "" or showName == None:
+            showName = "未知应用"
+        self.saveApkIcon(iconPath)
+        things = '''[Desktop Entry]
+        Categories=app;
+        Encoding=UTF-8
+        Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={}
+        GenericName={}
+        Icon={}
+        MimeType=
+        Name={}
+        StartupWMClass={}
+        Terminal=false
+        Type=Application
+        '''.format(self.packageName(), self.activityName(), showName, iconPath, showName, showName)
+        File(desktopPath).write(things)
+    def run(self):
+        UEngine.OpenApp(self.packageName(), self.activityName())
+
+    def buildDeb(self, savePath, qianZhui = True):
+        tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024)))
+        #RunCommandShow("echo '======================================New===================================='")
+        #RunCommandShow("echo '创建目录'")
+        os.makedirs("{}/DEBIAN".format(tempPath))
+        os.makedirs("{}/usr/share/applications".format(tempPath))
+        os.makedirs("{}/usr/share/uengine/apk".format(tempPath))
+        os.makedirs("{}/usr/share/uengine/icons".format(tempPath))
+        apkPackageName = self.packageName()
+        if qianZhui:
+            apkPackageNameNew = "uengine-dc-" + self.packageName().lower()
+        else:
+            apkPackageNameNew = self.packageName().lower()
+        apkPackageVersion = self.version()
+        if apkPackageVersion[0].upper() == "V":
+            package = list(apkPackageVersion)
+            package.pop(0)
+            apkPackageVersion = "".join(package)
+        apkChineseLabel = self.chineseLabel()
+        apkActivityName = self.activityName()
+        iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageNameNew)
+        debControl = '''Package: {}
+Version: {}
+Architecture: all
+Maintainer: {}
+Depends: deepin-elf-verify (>= 0.0.16.7-1), uengine (>= 1.0.1)
+Section: utils
+Priority: optional
+Description: {}\n'''.format(apkPackageNameNew, apkPackageVersion, apkChineseLabel, apkChineseLabel)
+        debPostinst = '''#!/bin/sh
+
+APK_DIR="/usr/share/uengine/apk"
+APK_NAME="{}"
+APK_PATH="$APK_DIR/$APK_NAME"
+DESKTOP_FILE="{}"
+
+
+if [ -f $APK_PATH ]; then
+    echo "Installing $APK_NAME"
+else 
+    echo "ERROR: $APK_NAME does not exist."
+    exit 0
+fi
+
+session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
+if test -z "$session_manager"; then
+    echo "ERROR: app install failed(session-manager is not running)."
+    sess_dir="/usr/share/uengine/session_install"
+    if [ ! -d $sess_dir ]; then
+        mkdir $sess_dir
+        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
+
+/usr/bin/uengine-session-launch-helper -- uengine install  --apk="$APK_PATH"
+
+exit 0'''.format(apkPackageNameNew + ".apk", "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
+        debPrerm = '''#!/bin/sh
+
+APP_NAME="{}"
+DESKTOP_FILE="{}"
+
+session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep`
+if test -z "$session_manager"; then
+    echo "ERROR: app uninstall failed(session-manager is not running)."
+    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
+
+echo "Uninstalling $APP_NAME"
+/usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME"
+
+exit 0'''.format(apkPackageName, "/usr/share/applications/{}.desktop".format(apkPackageNameNew))
+        desktopFile = '''[Desktop Entry]
+Categories=Other;
+Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={}
+Icon=/usr/share/uengine/icons/{}.png
+Terminal=false
+Type=Application
+GenericName={}
+Name={}
+'''
+        # RunCommandShow("echo '{}' > '{}/DEBIAN/control'".format(debControl, tempPath))
+        #RunCommandShow("echo 正在写入文件:'{}/DEBIAN/control'".format(tempPath))
+        File("{}/DEBIAN/control".format(tempPath)).write(debControl)
+        #RunCommandShow("echo 正在写入文件:'{}/DEBIAN/postinst'".format(tempPath))
+        File("{}/DEBIAN/postinst".format(tempPath)).write(debPostinst)
+        #RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath))
+        File("{}/DEBIAN/prerm".format(tempPath)).write(debPrerm)
+        #RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageNameNew))
+        # write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew), desktopFile)
+        self.saveDesktopFile("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew),
+                             "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageNameNew))
+        #BuildUengineDesktop(apkPackageName, apkActivityName, apkChineseLabel,
+        #                    "/usr/share/uengine/icons/{}.png".format(apkPackageNameNew),
+        #                    "{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew))
+        #RunCommandShow("echo '复制文件'")
+        #RunCommandShow("echo '写入 APK 软件图标'")
+        #SaveApkIcon(apkPath, iconSavePath)
+        self.saveApkIcon(iconSavePath)
+        #RunCommandShow("echo '复制 APK 文件'")
+        shutil.copy(self.apkPath, "{}/usr/share/uengine/apk/{}.apk".format(tempPath, apkPackageNameNew))
+        #RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageNameNew))
+        #RunCommandShow("echo '正在设置文件权限……'")
+        os.system("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath))
+        os.system("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath))
+        #RunCommandShow("echo '打包 deb 到桌面……'")
+        os.system(
+            "dpkg -b '{}' '{}'".format(tempPath, savePath))
+        #RunCommandShow("echo '正在删除临时目录……'")
+        #shutil.rmtree(tempPath)
+        #RunCommandShow("rm -rfv '{}'".format(tempPath))
+        #RunCommandShow("echo '完成!'")
+        #findApkHistory.append(apkPath)
+        #combobox1['value'] = findApkHistory
+        #write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json",
+        #          str(json.dumps(ListToDictionary(findApkHistory))))  # 将历史记录的数组转换为字典并写入
+        #messagebox.showinfo(title="提示", message="打包完成")
+        #DisabledAndEnbled(False)
+
+
+class UEngine:
+    def UengineAppManager():
+        os.system("uengine launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity")
+    def OpenApp(appPackage, appActivity):
+        os.system("uengine launch --package={} --component={}".format(appPackage, appActivity))
+    # 清空 uengine 数据
+    def UengineDataClean() -> "清空 uengine 数据":
+        shutil.rmtree("{}/.local/share/applications/uengine/".format(ProgramInformation.home))
+        shutil.rmtree("/data/uengine")
+    def RemoveUengineCheck():
+        os.remove("/usr/share/uengine/uengine-check-runnable.sh")
+    def CPUCheck():
+        return subprocess.getoutput("uengine check-features")
+    def BuildUengineRootImage():
+        os.system(ProgramInformation.programPath + "/root-uengine.sh")
+    def OpenUengineRootData():
+        os.system("xdg-open /data/uengine/data/data")
+    def InstallRootUengineImage():
+        if not os.path.exists:
+            os.mkdir("/tmp/uengine-runner")
+        File("/tmp/uengine-runner/install.sh").write("sudo dpkg -i /tmp/uengine-runner/u*.deb\nsudo apt install -f")
+        os.system("wget -P '/tmp/uengine-runner' 'https://hub.fastgit.xyz/gfdgd-xi/uengine-runner/releases/download/U1.2.15/uengine-android-image_1.2.15_amd64.deb' && pkexec bash '/tmp/uengine-runner/install.sh'")
+    class Services:
+        def Open():
+            os.system("pkexec systemctl enable uengine-container uengine-session && systemctl start uengine-container uengine-session")
+        def Close():
+            os.system("pkexec systemctl disable uengine-container uengine-session")
+        def Restart():
+            os.system("pkexec systemctl restart uengine*")
+    class InternetBridge:
+        def Open():
+            os.system("pkexec uengine-bridge.sh start")
+        def Close():
+            os.system("pkexec uengine-bridge.sh stop")
+        def Restart():
+            os.system("pkexec uengine-bridge.sh restart")
+        def Reload():
+            os.system("pkexec uengine-bridge.sh reload")
+        def ForceReload():
+            os.system("pkexec uengine-bridge.sh force-reload")
+
+class Adb:
+    def __init__(self, ip=""):
+        self.ip = ip
+
+    def connect(self):
+        os.system(f"adb connect {self.ip}")
+
+    class Service:
+        def Open():
+            os.system("adb start-server")
+        def Close():
+            os.system("adb kill-server")
+        def Kill():
+            os.system("killall adb")
+
+    def boolAndroidInstallOtherAppSetting(self):
+        return subprocess.getoutput(f"adb -s {self.ip} shell settings get secure install_non_market_apps").replace(" ", "") == "1"
+
+    def setAndroidInstallOtherAppSetting(self, op: bool):
+        os.system(f"adb -s {self.ip} shell settings put secure install_non_market_apps {int(op)}")
+
+class File:
+    def __init__(self, filePath):
+        self.filePath = filePath
+    def read(self):
+        f = open(self.filePath, "r")  # 设置文件对象
+        str = f.read()  # 获取内容
+        f.close()  # 关闭文本对象
+        return str  # 返回结果
+    def write(self, things) -> "写入文本文档":
+        TxtDir = os.path.dirname(self.filePath)
+        print(TxtDir)
+        if not os.path.exists(TxtDir):
+            os.makedirs(TxtDir, exist_ok=True)
+        file = open(self.filePath, 'w', encoding='UTF-8')  # 设置文件对象
+        file.write(things)  # 写入文本
+        file.close()  # 关闭文本对象
+
+class UengineRunner:
+    def CleanHistory():
+        shutil.rmtree(ProgramInformation.home + "/.config/uengine-runner")
+
+if __name__ == "__main__":
+    print("本 API 不支持直接运行,请通过引入的方式使用此 API")
+    adb = Adb("192.168.250.2:5555")
+    print(adb.boolAndroidInstallOtherAppSetting())
+
+    quit()
+
+if not ROOT.GetRoot():
+    print("请获取 ROOT 权限以便更好的使用该 API")
\ No newline at end of file
diff --git a/uengine-api/__pycache__/__init__.cpython-310.pyc b/uengine-api/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d5c61002bee0ee88aaaf4fb827ebcf3aff1e4f6f
GIT binary patch
literal 15890
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

literal 0
HcmV?d00001

diff --git a/uengine-api/__pycache__/__init__.cpython-37.pyc b/uengine-api/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2bd853a115320ee12cc58a01aed55f4018224f2e
GIT binary patch
literal 16047
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
X_}93_cwc;1yfZG^ZLvTo5aIt9e4fB0

literal 0
HcmV?d00001

diff --git a/uengine-api/__pycache__/getxmlimg.cpython-37.pyc b/uengine-api/__pycache__/getxmlimg.cpython-37.pyc
new file mode 100755
index 0000000000000000000000000000000000000000..79021ab50d040d3e4ab5ae5fd955c94806704893
GIT binary patch
literal 3202
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
QH10AQ$`$>kgZDJQ2mHJ!MF0Q*

literal 0
HcmV?d00001

diff --git a/uengine-api/defult.png b/uengine-api/defult.png
new file mode 100755
index 0000000000000000000000000000000000000000..c836b687a2bf32dca02d1834024e2188dccde2b0
GIT binary patch
literal 35859
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
W8k^~Ea@;i)z;XCsWN33pV)4I~8VDi)

literal 0
HcmV?d00001

diff --git a/uengine-api/getxmlimg.py b/uengine-api/getxmlimg.py
new file mode 100755
index 0000000..af59a70
--- /dev/null
+++ b/uengine-api/getxmlimg.py
@@ -0,0 +1,118 @@
+import PIL.Image as Image
+import PIL.ImageDraw as ImageDraw
+import zipfile
+import subprocess
+import re
+
+class getsavexml():
+
+    def savexml(self,apkFilePath,xmlpath,iconSavePath):
+        cmddumpid = "aapt dump xmltree "+ apkFilePath + " " + xmlpath
+        print(cmddumpid)
+        xmltree =  subprocess.getoutput(cmddumpid)
+        xmls = xmltree.splitlines()
+        # find strs ,print next line
+        def FindStrs(lines,strs):
+            i=0
+            while i < len(lines):
+                if re.search(strs,lines[i]):
+                    tmpstr = lines[i+1]
+                    i += 1
+                    Resultstr = tmpstr.split(":")[-1].split("=")[-1].split("0x")[-1] 
+                    return Resultstr
+                else:
+                    i += 1
+        #从apk的信息中获取前后景图片的ID号
+        backimgid =  FindStrs(xmls,"background")
+        foreimgid =  FindStrs(xmls,"foreground")
+        print(backimgid)
+        print(foreimgid)
+
+        # 直接从apk resource文件获取前后两层图片路径及ID字符串
+        resource =  subprocess.getoutput("aapt dump --values resources " +  apkFilePath + "| grep -iE -A1 " +  "\"" + backimgid + "|" + foreimgid + "\"")
+        resourcelines = resource.splitlines()
+        print(resourcelines)
+
+        # 从过滤出的字符串中获取所有相同ID的图片路径
+        def Findpicpath(lines,imgid):
+            i=0
+            Resultstr = []
+            while i < len(lines):
+                if re.search(imgid,lines[i]) and re.search("string8",lines[i+1]) :
+                    print(lines[i+1])
+                    tmpstr = lines[i+1].replace("\"","")
+                    i += 1 
+                    Resultstr.append(tmpstr.split()[-1])
+                else:
+                    i += 1
+            return Resultstr
+
+        #获取所有带前后图片ID的图片路径(相同背景或者前景的图片ID但分辨率不一样)
+        backimgs =  Findpicpath(resourcelines,backimgid)
+        foreimgs =  Findpicpath(resourcelines,foreimgid)
+        print(backimgs)
+        print(foreimgs)
+        #获取分辨率最高的图片路径
+        def getmaxsize(imgs):
+            j = 0
+            size=(0,0)
+            zipapk = zipfile.ZipFile(apkFilePath)
+            imgpath = ""
+            while j < len(imgs):
+                print(imgs[j])
+                img = Image.open(zipapk.open(imgs[j]))
+                print(imgs[j])
+                print(img.size)
+                if size < img.size:
+                    size = img.size
+                    imgpath = imgs[j]
+                j += 1
+            return imgpath
+
+        # 获取到文件列表后,进行比较分辨率,选取分辨率最高的张图片
+        iconbackpath = getmaxsize(backimgs)
+        iconforepath = getmaxsize(foreimgs)
+        print(iconbackpath + " " + iconforepath)
+
+        #从APK文件获取最终图片
+        zipapk = zipfile.ZipFile(apkFilePath)
+        iconback = zipapk.open(iconbackpath)
+        iconfore = zipapk.open(iconforepath)
+
+
+        # 叠加图片,mask 设置前景为蒙版
+        iconbackimg =  Image.open(iconback).convert("RGBA")
+        iconforeimg =  Image.open(iconfore).convert("RGBA")
+        iconbackimg.paste(iconforeimg,mask=iconforeimg)
+
+
+        # 圆角图片函数,网上拷贝的
+        def circle_corner(img, radii):  #把原图片变成圆角,这个函数是从网上找的,原址 https://www.pyget.cn/p/185266
+            """
+            圆角处理
+            :param img: 源图象。
+            :param radii: 半径,如:30。
+            :return: 返回一个圆角处理后的图象。
+            """
+            # 画圆(用于分离4个角)
+            circle = Image.new('L', (radii * 2, radii * 2), 0)  # 创建一个黑色背景的画布
+            draw = ImageDraw.Draw(circle)
+            draw.ellipse((0, 0, radii * 2, radii * 2), fill=255)  # 画白色圆形
+            # 原图
+            img = img.convert("RGBA")
+            w, h = img.size
+            # 画4个角(将整圆分离为4个部分)
+            alpha = Image.new('L', img.size, 255)
+            alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0))  # 左上角
+            alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0))  # 右上角
+            alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii))  # 右下角
+            alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii))  # 左下角
+            # alpha.show()
+            img.putalpha(alpha)  # 白色区域透明可见,黑色区域不可见
+            return img
+
+        #  圆角半径1/8边长,保存icon图片
+        w,h = iconbackimg.size
+        iconimg = circle_corner(iconbackimg,int(w/8))
+        iconimg.save(iconSavePath)
+
diff --git a/uengine-api/root-uengine.sh b/uengine-api/root-uengine.sh
new file mode 100755
index 0000000..335f765
--- /dev/null
+++ b/uengine-api/root-uengine.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+#sudo apt install squashfs-tools
+
+mkdir -p ~/temp
+cd ~/temp
+echo "正在下载supersu"
+aria2c -x 16 -s 16 -d ~/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 "已在用户主目录生成新的安装包,安装后重启即可生效" 
\ No newline at end of file