Compare commits

..
Author SHA1 Message Date
JonasAlv 22f03a94c4 Merge branch 'casualsnek:main' into main 2026-08-22 15:24:54 -03:00
ayasa520 d5289cfd89 Update libhoudini (#256)
* Update download link for Houdini version 13
2026-01-05 09:56:03 +01:00
Jonas Alves 1690a5fcd5 fix errors- manual patching 2025-12-19 18:51:05 -03:00
NullBite ddaa6b190f Add Nix flake and improve derivation
This adds a Nix flake to the repo as well as updates the derivation so
that it includes `lzip` as a dependency
2025-11-17 10:08:53 +01:00
Gerry Bagaskoro Putro 15020ec20a fix(nodataperm): prevent crash when uninstalling on Android 13 2025-11-11 19:37:38 +01:00
11 changed files with 186 additions and 346 deletions
+4 -22
View File
@@ -1,22 +1,4 @@
with (import <nixpkgs> {});
stdenv.mkDerivation {
name = "waydroid_script";
buildInputs = [
(python3.withPackages(ps: with ps; [ tqdm requests inquirerpy ]))
];
src = ./.;
postPatch = ''
patchShebangs main.py
'';
installPhase = ''
mkdir -p $out/libexec
cp -r . $out/libexec/waydroid_script
mkdir -p $out/bin
ln -s $out/libexec/waydroid_script/main.py $out/bin/waydroid_script
'';
}
let
pkgs = import <nixpkgs> {};
in
pkgs.callPackage ./package.nix { }
Generated
+41
View File
@@ -0,0 +1,41 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1707650010,
"narHash": "sha256-dOhphIA4MGrH4ElNCy/OlwmN24MsnEqFjRR6+RY7jZw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "809cca784b9f72a5ad4b991e0e7bcf8890f9c3a6",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs",
"systems": "systems"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
+21
View File
@@ -0,0 +1,21 @@
{
description = "Waydroid Extras Script";
inputs = {
systems.url = "github:nix-systems/default";
};
outputs = { self, nixpkgs, systems }:
let
inherit (nixpkgs) lib;
eachSystem = lib.genAttrs (import systems);
mkApp = program: { type = "app"; inherit program; };
in {
packages = eachSystem (system: rec {
waydroid_script = nixpkgs.legacyPackages."${system}".callPackage ./package.nix { };
default = waydroid_script;
});
apps = eachSystem (system: rec {
waydroid_script = mkApp "${self.outputs.packages.${system}.waydroid_script}/bin/waydroid_script";
default = waydroid_script;
});
};
}
+3 -27
View File
@@ -18,7 +18,6 @@ from stuff.nodataperm import Nodataperm
from stuff.smartdock import Smartdock
from stuff.widevine import Widevine
from stuff.fdroidpriv import FDroidPriv
from stuff.gps import GPS
import tools.helper as helper
from tools import container
from tools import images
@@ -90,8 +89,6 @@ def install_app(args):
install_list.append(Mitm(args.ca_cert_file))
if "fdroidpriv" in app:
install_list.append(FDroidPriv(args.android_version))
if "gps" in app:
install_list.append(GPS(args.android_version, args.gps_host, args.baud_rate))
if not container.use_overlayfs():
copy_dir = "/tmp/waydroid"
@@ -118,7 +115,8 @@ def install_app(args):
if not container.use_overlayfs():
umount("vendor", copy_dir)
umount("system", copy_dir)
container.upgrade()
container.upgrade()
def remove_app(args):
@@ -146,8 +144,6 @@ def remove_app(args):
remove_list.append(Nodataperm(args.android_version))
if "hidestatusbar" in app:
remove_list.append(HideStatusBar())
if "gps" in app:
remove_list.append(GPS())
if not container.use_overlayfs():
copy_dir = "/tmp/waydroid"
@@ -174,7 +170,6 @@ def hack_option(args):
if "hidestatusbar" in options:
hack_list.append(HideStatusBar())
if not container.use_overlayfs():
copy_dir = "/tmp/waydroid"
container.stop()
@@ -234,10 +229,7 @@ def interact():
if not action:
exit()
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine", "gps",]
baud_rate_choices = ["9600", "19200", "38400", "57600", "115200"]
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine",]
hack_choices = []
if android_version=="11":
hack_choices.extend(["nodataperm", "hidestatusbar"])
@@ -259,20 +251,6 @@ def interact():
default="Standard",
).execute()
args.microg_variant = microg_variant
if "gps" in apps:
gps_host = inquirer.text(
message="Enter GPS host (default: /dev/ttyGPSD)",
default="/dev/ttyGPSD",
).execute()
args.gps_host = gps_host
baud_rate = inquirer.select(
message="Enter baud rate (default: 9600)",
instruction="([\u2191\u2193]: [Enter]: Confirm",
default="9600",
choices=baud_rate_choices
).execute()
args.baud_rate = baud_rate
args.app = apps
install_app(args)
elif action == "Remove":
@@ -366,8 +344,6 @@ widevine: Add support for widevine DRM L3
args = parser.parse_args()
args.microg_variant = "Standard"
args.gps_host = "/dev/ttyGPSD"
args.baud_rate = "9600"
if hasattr(args, 'func'):
args_dict = vars(args)
helper.check_root()
+32
View File
@@ -0,0 +1,32 @@
{ lib,
stdenvNoCC,
lzip,
python3,
makeWrapper }:
let
wrappedPath = lib.makeBinPath [ lzip ];
in stdenvNoCC.mkDerivation {
name = "waydroid_script";
buildInputs = [
(python3.withPackages(ps: with ps; [ tqdm requests inquirerpy ]))
];
nativeBuildInputs = [
makeWrapper
];
src = ./.;
postPatch = ''
patchShebangs main.py
'';
installPhase = ''
mkdir -p $out/libexec
cp -r . $out/libexec/waydroid_script
mkdir -p $out/bin
makeShellWrapper $out/libexec/waydroid_script/main.py $out/bin/waydroid_script \
--prefix PATH : "${wrappedPath}"
'';
}
-197
View File
@@ -1,197 +0,0 @@
import os
from xml.dom import minidom
import xml.etree.ElementTree as ET
import shutil
from stuff.general import General
from tools.logger import Logger
import tools.images as images
from tools.helper import run, host
from tools import container
class GPS(General):
id = "gps"
partition = "vendor"
dl_links = ["https://github.com/Lolmc0587/android_gps_libraries/archive/refs/tags/2.1.zip","f84c369c7cebd9dbb8987ca15c6aa856"]
act_md5 = ...
dl_link = ...
dl_file_name = "android_gps_libraries-2.1.zip"
extract_to = "/tmp/android_gps_libraries-2.1"
files = [
"lib/hw/android.hardware.gnss@1.0-impl.so",
"lib64/hw/android.hardware.gnss@1.0-impl.so",
"lib/hw/gps.default.so",
"lib64/hw/gps.default.so",
"etc/init/android.hardware.gnss@1.0-service.rc",
]
def __init__(self, android_version="11", gps_host="/dev/ttyGPSD", baud_rate=9600) -> None:
super().__init__()
self.host_arch = host()
# Set for arm 32 bit support from file downloaded
self.host = "arm64-v8a" if "arm" in self.host_arch[0] else self.host_arch[0]
self.gps_host = gps_host
self.baud_rate = baud_rate
self.android_version = android_version
self.usb_name = self.gps_host.replace("/dev/", "")
self.files_vendor = [
"bin/hw/android.hardware.gnss@1.0-service",
]
self.config_files = {
"11": [
"etc/vintf/compatibility_matrix.legacy.xml",
"etc/vintf/manifest.xml",
"build.prop",
],
"13": [
"etc/vintf/compatibility_matrix.7.xml",
"etc/vintf/manifest.xml",
"build.prop",
],
}
self.compatibility_files = {
"11": "etc/vintf/compatibility_matrix.legacy.xml",
"13": "etc/vintf/compatibility_matrix.7.xml",
}
self.dl_link = self.dl_links[0]
self.act_md5 = self.dl_links[1]
def update_manifest(self, manifest_path, data):
"""
Update the manifest file by inserting data into the <manifest> tag and format the XML.
"""
tree = ET.parse(manifest_path)
root = tree.getroot()
root.append(ET.fromstring(data))
tree.write(manifest_path, encoding="utf-8", xml_declaration=True)
with open(manifest_path, "r") as f:
content = f.read()
formatted_content = minidom.parseString(content).toprettyxml(indent=" ")
formatted_content = "\n".join(
[line for line in formatted_content.split("\n") if line.strip()]
)
with open(manifest_path, "w") as f:
f.write(formatted_content)
def copy(self):
Logger.info("Copying gps library files ...")
if self.android_version == "11":
shutil.copytree(os.path.join(self.extract_to, self.dl_file_name.replace(".zip", ""), self.android_version,
self.host, "system"), os.path.join(self.copy_dir, "system"), dirs_exist_ok=True)
self.partition = "system"
if self.android_version == "13":
shutil.copytree(os.path.join(self.extract_to, self.dl_file_name.replace(".zip", ""), self.android_version,
self.host, "system"), os.path.join(self.copy_dir, "vendor"), dirs_exist_ok=True)
self.partition = "vendor"
shutil.copytree(os.path.join(self.extract_to, self.dl_file_name.replace(".zip", ""), self.android_version,
self.host, "vendor"), os.path.join(self.copy_dir, "vendor"), dirs_exist_ok=True)
def extra1(self):
Logger.info("Setting extra permissions ...")
# set permissions for vendor files
path = os.path.join(self.copy_dir, "vendor", self.files_vendor[0])
self.set_perm2(path, recursive=True)
# Copy nessessary files to the overlayfs
container.stop()
copy_dir = "/tmp/waydroid"
if container.use_overlayfs():
img = os.path.join(images.get_image_dir(), "system.img")
# images.mount(img, copy_dir)
if not os.path.exists(copy_dir):
os.makedirs(copy_dir)
run(["sudo", "mount", img, copy_dir])
for file in self.config_files[self.android_version]:
file_dir = os.path.join(self.copy_dir, "system", file)
if not os.path.exists(os.path.dirname(file_dir)):
os.makedirs(os.path.dirname(file_dir))
shutil.copyfile(os.path.join(copy_dir, "system", file), file_dir)
self.set_perm2(file_dir, recursive=True)
if self.android_version == "13":
# Copy missing libraries file for android 13 vendor partition from system partition
if not os.path.exists(os.path.join(self.copy_dir, "vendor", "lib64", "hw")):
os.makedirs(os.path.join(self.copy_dir, "vendor", "lib64", "hw"))
copy_ = True
if "arm" in self.host and self.host_arch[1] == 32:
copy_ = False
if copy_:
shutil.copyfile(os.path.join(copy_dir, "system", "lib64/android.hardware.gnss@1.0.so"),
os.path.join(self.copy_dir, "vendor", "lib64/hw/android.hardware.gnss@1.0.so"))
if not os.path.exists(os.path.join(self.copy_dir, "vendor", "lib", "hw")):
os.makedirs(os.path.join(self.copy_dir, "vendor", "lib", "hw"))
shutil.copyfile(os.path.join(copy_dir, "system", "lib/android.hardware.gnss@1.0.so"),
os.path.join(self.copy_dir, "vendor", "lib/hw/android.hardware.gnss@1.0.so"))
images.umount(copy_dir)
# Update manifest files
container.upgrade()
manifest_entry_1 = """
<hal format="hidl" optional="true">
<name>android.hardware.gnss</name>
<version>1.0</version>
<interface>
<name>IGnss</name>
<instance>default</instance>
</interface>
</hal>
"""
self.update_manifest(
os.path.join(self.copy_dir, "system", self.compatibility_files[self.android_version]),
data=manifest_entry_1,
)
manifest_entry_2 = """
<hal format="hidl">
<name>android.hardware.gnss</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IGnss</name>
<instance>default</instance>
</interface>
<fqname>@1.0::IGnss/default</fqname>
</hal>
"""
self.update_manifest(os.path.join(self.copy_dir, "system", "etc", "vintf", "manifest.xml"), data=manifest_entry_2)
config_nodes = "/var/lib/waydroid/lxc/waydroid/config_nodes"
# lxc.mount.entry = /dev/ttyGPSD dev/ttyGPSD none bind,create=file,optional 0 0
with open(config_nodes, "a") as f:
f.write(f"lxc.mount.entry = {self.gps_host} dev/{self.usb_name} none bind,create=file,optional 0 0\n")
with open(os.path.join(self.copy_dir, "system", "build.prop"), "a") as f:
f.write("ro.factory.hasGPS=true\n")
f.write(f"ro.kernel.android.gps={self.usb_name}\n")
f.write(f"ro.kernel.android.gps.speed={self.baud_rate}\n")
Logger.warning(
"You need to add user to the 'dialout' group to access the GPS device."
"\nYou can do this by running: sudo usermod -aG dialout <your_username>"
"\nand then reboot your system."
)
def extra2(self):
# Remove vendor files from system partition
self.files = self.files_vendor
self.partition = "vendor"
self.remove()
# Remove config files from system partition
self.files = self.config_files[self.android_version]
self.partition = "system"
self.remove()
container.upgrade()
+1 -1
View File
@@ -10,7 +10,7 @@ class Houdini(General):
partition = "system"
dl_links = {
"11": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/81f2a51ef539a35aead396ab7fce2adf89f46e88.zip", "fbff756612b4144797fbc99eadcb6653"],
"13": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/7e21ea3f63bd89e9e8af54e32da41bd8b65c93a1.zip", "f8cf5db10e5fdb9b77e98e515a9b08c9"]
"13": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/9e77896350caccd228b36b2e1b4a994aa4bd48da.zip", "3807fe029559db3037efe245d9e74270"]
}
act_md5 = ...
dl_link = ...
+14 -6
View File
@@ -10,19 +10,23 @@ from tools import container
class Nodataperm(General):
id = "nodataperm"
dl_links = {
"11":
{
"11": {
"x86_64": [
"https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip",
"b0e3908ffcf5df8ea62f4929aa680f1a"
],
},
"13": {
"x86_64": [
"https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip",
"b0e3908ffcf5df8ea62f4929aa680f1a"
],
},
"13": {}
}
dl_file_name = "nodataperm.zip"
extract_to = "/tmp/nodataperm"
dl_link = ...
act_md5 = ...
dl_link = None
act_md5 = None
partition = "system"
files = [
"etc/nodataperm.sh",
@@ -36,11 +40,15 @@ class Nodataperm(General):
super().__init__()
print("ok")
arch = self.arch[0]
if android_version not in self.dl_links:
raise KeyError(f"No download links for Android version '{android_version}'")
if arch not in self.dl_links[android_version]:
raise KeyError(f"No download links for architecture '{arch}' in Android version '{android_version}'")
self.dl_link = self.dl_links[android_version][arch][0]
self.act_md5 = self.dl_links[android_version][arch][1]
def copy(self):
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
name = re.findall(r"([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
extract_path = os.path.join(
self.extract_to, f"hack_full_data_permission-{name}")
if not container.use_overlayfs():
+4 -24
View File
@@ -1,23 +1,9 @@
import configparser
import os
import sys
# import dbus
from tools.helper import run
from tools.logger import Logger
# def DBusContainerService(object_path="/ContainerManager", intf="id.waydro.ContainerManager"):
# return dbus.Interface(dbus.SystemBus().get_object("id.waydro.Container", object_path), intf)
# def DBusSessionService(object_path="/SessionManager", intf="id.waydro.SessionManager"):
# return dbus.Interface(dbus.SessionBus().get_object("id.waydro.Session", object_path), intf)
# def use_dbus():
# try:
# DBusContainerService()
# except:
# return False
# return True
def use_overlayfs():
cfg = configparser.ConfigParser()
cfg_file = os.environ.get("WAYDROID_CONFIG", "/var/lib/waydroid/waydroid.cfg")
@@ -34,20 +20,14 @@ def use_overlayfs():
return False
# def get_session():
# return DBusContainerService().GetSession()
def stop():
# if use_dbus():
# session = DBusContainerService().GetSession()
# if session:
# DBusContainerService().Stop(False)
# else:
run(["waydroid", "container", "stop"])
def is_running():
return "Session:\tRUNNING" in run(["waydroid", "status"]).stdout.decode()
def upgrade():
run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
try:
run(["waydroid", "upgrade"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
except subprocess.CalledProcessError:
Logger.warning("Waydroid upgrade reported an error (likely system_ota), but we are continuing...")
+65 -67
View File
@@ -2,7 +2,6 @@ import gzip
import os
import re
import platform
import re
import subprocess
import sys
import requests
@@ -11,27 +10,24 @@ from tqdm import tqdm
import hashlib
from typing import Optional
def get_download_dir():
download_loc = ""
if os.environ.get("XDG_CACHE_HOME", None) is None:
download_loc = os.path.join('/', "home", os.environ.get(
"SUDO_USER", os.environ["USER"]), ".cache", "waydroid-script", "downloads"
)
else:
if os.environ.get("XDG_CACHE_HOME"):
download_loc = os.path.join(
os.environ["XDG_CACHE_HOME"], "waydroid-script", "downloads"
)
else:
user = os.environ.get("SUDO_USER", os.environ.get("USER", "root"))
download_loc = os.path.join("/", "home", user, ".cache", "waydroid-script", "downloads")
if not os.path.exists(download_loc):
os.makedirs(download_loc)
os.makedirs(download_loc, exist_ok=True)
return download_loc
# not good
def get_data_dir():
return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", "data")
user = os.environ.get("SUDO_USER", os.environ.get("USER", "root"))
return os.path.join("/", "home", user, ".local", "share", "waydroid", "data")
# execute on host
def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
def run(args: list, env: Optional[dict] = None, ignore: Optional[str] = None):
result = subprocess.run(
args=args,
env=env,
@@ -39,11 +35,12 @@ def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
stderr=subprocess.PIPE
)
# print(result.stdout.decode())
if result.stderr:
error = result.stderr.decode("utf-8")
if ignore and re.match(ignore, error):
error = result.stderr.decode("utf-8").strip()
if (ignore and re.search(ignore, error)) or "system_ota" in error:
return result
Logger.error(error)
raise subprocess.CalledProcessError(
returncode=result.returncode,
@@ -52,64 +49,58 @@ def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
)
return result
# execute on waydroid shell
def shell(arg: str, env: Optional[str] = None):
a = subprocess.Popen(
args=["sudo", "waydroid", "shell"],
cmd = ["sudo", "waydroid", "shell"]
process = subprocess.Popen(
args=cmd,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
stderr=subprocess.PIPE,
text=True
)
subprocess.Popen(
args=["echo", "export BOOTCLASSPATH=/apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/core-icu4j.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/framework-atb-backward-compatibility.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/javalib/updatable-media.jar:/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:/apex/com.android.os.statsd/javalib/framework-statsd.jar:/apex/com.android.permission/javalib/framework-permission.jar:/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:/apex/com.android.wifi/javalib/framework-wifi.jar:/apex/com.android.tethering/javalib/framework-tethering.jar"],
stdout=a.stdin,
stdin=subprocess.PIPE
).communicate()
boot_classpath = "export BOOTCLASSPATH=/apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/core-icu4j.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/framework-atb-backward-compatibility.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/javalib/updatable-media.jar:/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:/apex/com.android.os.statsd/javalib/framework-statsd.jar:/apex/com.android.permission/javalib/framework-permission.jar:/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:/apex/com.android.wifi/javalib/framework-wifi.jar:/apex/com.android.tethering/javalib/framework-tethering.jar"
full_script = f"{boot_classpath}\n"
if env:
subprocess.Popen(
args=["echo", env],
stdout=a.stdin,
stdin=subprocess.PIPE
).communicate()
full_script += f"{env}\n"
full_script += f"{arg}\n"
subprocess.Popen(
args=["echo", arg],
stdout=a.stdin,
stdin=subprocess.PIPE
).communicate()
stdout, stderr = process.communicate(input=full_script)
a.stdin.close()
if a.stderr.read():
Logger.error(a.stderr.read().decode('utf-8'))
if process.returncode != 0 and stderr:
Logger.error(stderr.strip())
raise subprocess.CalledProcessError(
returncode=a.returncode,
cmd=a.args,
stderr=a.stderr
returncode=process.returncode,
cmd=cmd,
stderr=stderr.encode()
)
return a.stdout.read().decode("utf-8")
return stdout
def download_file(url, f_name):
md5 = ""
response = requests.get(url, stream=True)
total_size_in_bytes = int(response.headers.get('content-length', 0))
block_size = 1024 # 1 Kibibyte
block_size = 1024
progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True)
with open(f_name, 'wb') as file:
for data in response.iter_content(block_size):
progress_bar.update(len(data))
file.write(data)
progress_bar.close()
hash_md5 = hashlib.md5()
with open(f_name, "rb") as f:
bytes = f.read()
md5 = hashlib.md5(bytes).hexdigest()
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes:
raise ValueError("Something went wrong while downloading")
return md5
raise ValueError("Download incomplete or corrupted")
return hash_md5.hexdigest()
def host():
machine = platform.machine()
mapping = {
"i686": ("x86", 32),
"x86_64": ("x86_64", 64),
@@ -117,30 +108,37 @@ def host():
"armv7l": ("armeabi-v7a", 32),
"armv8l": ("armeabi-v7a", 32)
}
if machine in mapping:
if mapping[machine] == "x86_64":
with open("/proc/cpuinfo") as f:
if "sse4_2" not in f.read():
Logger.warning("x86_64 CPU does not support SSE4.2, falling back to x86...")
return ("x86", 32)
return mapping[machine]
raise ValueError("platform.machine '" + machine + "'"
" architecture is not supported")
if machine in mapping:
if machine == "x86_64":
try:
with open("/proc/cpuinfo", "r") as f:
if "sse4_2" not in f.read():
Logger.warning("CPU does not support SSE4.2, falling back to x86...")
return ("x86", 32)
except Exception:
pass
return mapping[machine]
raise ValueError(f"Architecture '{machine}' is not supported")
def check_root():
if os.geteuid() != 0:
Logger.error("This script must be run as root. Aborting.")
Logger.error("This script must be run as root (sudo). Aborting.")
sys.exit(1)
def backup(path):
gz_filename = path+".gz"
with gzip.open(gz_filename, 'wb') as f_gz:
with open(path, "rb") as f:
f_gz.write(f.read())
if not os.path.exists(path):
return
gz_filename = path + ".gz"
with open(path, "rb") as f_in:
with gzip.open(gz_filename, "wb") as f_out:
f_out.writelines(f_in)
def restore(path):
gz_filename = path+".gz"
with gzip.GzipFile(gz_filename) as f_gz:
with open(path, "wb") as f:
f.writelines(f_gz)
gz_filename = path + ".gz"
if not os.path.exists(gz_filename):
return
with gzip.open(gz_filename, "rb") as f_in:
with open(path, "wb") as f_out:
f_out.write(f_in.read())
+1 -2
View File
@@ -28,7 +28,6 @@ def resize(img_file, size):
run(["sudo", "resize2fs", img_file, size], ignore="^resize2fs \d+\.\d+\.\d (.+)\n$")
def get_image_dir():
# Read waydroid config to get image location
cfg = configparser.ConfigParser()
cfg_file = os.environ.get("WAYDROID_CONFIG", "/var/lib/waydroid/waydroid.cfg")
if not os.path.isfile(cfg_file):
@@ -36,6 +35,6 @@ def get_image_dir():
sys.exit(1)
cfg.read(cfg_file)
if "waydroid" not in cfg:
Logger.error("Required entry in config was not found, Cannot continue!") #magisk
Logger.error("Required entry in config was not found, Cannot continue!")
sys.exit(1)
return cfg["waydroid"]["images_path"]