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