Compare commits

..
Author SHA1 Message Date
sr00t3d 046383d14f fix(hacks): add tflitefix to prevent SIGSEGV crash in games using TensorFlow Lite under ARM translation 2026-08-14 05:15:10 -04:00
ayasa520 d5289cfd89 Update libhoudini (#256)
* Update download link for Houdini version 13
2026-01-05 09:56:03 +01: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
24 changed files with 352 additions and 256 deletions
+41 -57
View File
@@ -20,7 +20,9 @@ sudo venv/bin/python3 main.py
![image-20230430013148814](assets/img/README/image-20230430013148814.png) ![image-20230430013148814](assets/img/README/image-20230430013148814.png)
## Command line
## Command Line
```bash ```bash
git clone https://github.com/casualsnek/waydroid_script git clone https://github.com/casualsnek/waydroid_script
@@ -40,72 +42,60 @@ sudo venv/bin/python3 main.py hack {nodataperm, hidestatusbar}
## Dependencies ## Dependencies
"lzip" is required for this script to work, install it using your distribution's package manager: "lzip" is required for this script to work, install it using your distribution's package manager:
### Arch, Manjaro and EndeavourOS based distributions:
### Arch, Manjaro, and EndeavourOS-based distributions:
sudo pacman -S lzip sudo pacman -S lzip
### Debian and Ubuntu based distributions:
### Debian and Ubuntu-based distributions:
sudo apt install lzip sudo apt install lzip
### RHEL, Fedora and Rocky based distributions:
### RHEL, Fedora, and Rocky-based distributions:
sudo dnf install lzip sudo dnf install lzip
### openSUSE based distributions:
### openSUSE-based distributions:
sudo zypper install lzip sudo zypper install lzip
## Install Open GApps ## Install OpenGapps
![](assets/1.png) ![](assets/1.png)
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to the directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install gapps sudo venv/bin/python3 main.py install gapps
Then launch Waydroid with: Then launch waydroid with:
waydroid show-full-ui waydroid show-full-ui
After Waydroid has finished booting, open the terminal and switch to the directory where "main.py" is located, then run: After waydroid has finished booting, open terminal and switch to directory where "main.py" is located then run:
sudo python3 main.py google sudo python3 main.py google
Copy the returned numeric ID, then open ["https://google.com/android/uncertified/?pli=1"](https://google.com/android/uncertified/?pli=1). Enter the ID and register it. Wait 10-20 minutes for device to get registered. Then clear Google Play Service's cache and try logging in!
Copy the returned numeric ID, then
open ["https://google.com/android/uncertified/?pli=1"](https://google.com/android/uncertified/?pli=1). Enter the ID and
register it. Wait 10–20 minutes for the device to get registered. Then clear Google Play Service's cache and try logging
in!
## Install Magisk ## Install Magisk
![](assets/2.png) ![](assets/2.png)
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install magisk sudo venv/bin/python3 main.py install magisk
Magisk will be installed on next boot! Magisk will be installed on next boot!
Zygisk and modules like LSPosed should work now. Zygisk and modules like LSPosed should work now.
If you want to update Magisk, Please use `Direct Install into system partition` or run this script again. If you want to update Magisk, Please use `Direct Install into system partition` or run this sript again.
This script only focuses on Magisk installation, if you need more management, please This script only focuses on Magisk installation, if you need more management, please check https://github.com/nitanmarcel/waydroid-magisk
check https://github.com/nitanmarcel/waydroid-magisk
## Install libndk ARM translation ## Install libndk arm translation
libndk_translation from guybrush firmware. libndk_translation from guybrush firmware.
libndk seems to have better performance than libhoudini on AMD. libndk seems to have better performance than libhoudini on AMD.
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install libndk sudo venv/bin/python3 main.py install libndk
## Install libhoudini ARM translation ## Install libhoudini arm translation
Intel's libhoudini for intel/AMD x86 CPU, pulled from Microsoft's WSA 11 image Intel's libhoudini for intel/AMD x86 CPU, pulled from Microsoft's WSA 11 image
@@ -113,7 +103,7 @@ houdini version: 11.0.1b_y.38765.m
houdini64 version: 11.0.1b_z.38765.m houdini64 version: 11.0.1b_z.38765.m
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install libhoudini sudo venv/bin/python3 main.py install libhoudini
@@ -121,7 +111,7 @@ Open the terminal and switch to the directory where "main.py" is located, then r
![](assets/3.png) ![](assets/3.png)
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install widevine sudo venv/bin/python3 main.py install widevine
@@ -130,38 +120,34 @@ Open the terminal and switch to the directory where "main.py" is located, then r
![](assets/4.png) ![](assets/4.png)
![](assets/5.png) ![](assets/5.png)
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install smartdock sudo venv/bin/python3 main.py install smartdock
## Install a self-signed CA certificate ## Install a self-signed CA certificate
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
sudo venv/bin/python3 main.py install mitm --ca-cert mycert.pem sudo venv/bin/python3 main.py install mitm --ca-cert mycert.pem
## Granting full permission for apps data (HACK) ## Granting full permission for apps data (HACK)
This is a temporary hack to combat against the apps permission issue on Android 11. Whenever an app is open, it will
always enable a property (persist.sys.nodataperm) to make it execute a script to grant the data full permissions (777).
The **correct** way is to use `sdcardfs` or `esdfs`, both need to recompile the kernel or WayDroid image.
Arknights, PUNISHING: GRAY RAVEN, and other games won't freeze on the black screen. This is a temporary hack to combat against the apps permission issue on Android 11. Whenever an app is open it will always enable a property (persist.sys.nodataperm) to make it execute a script to grant the data full permissions (777). The **correct** way is to use `sdcardfs` or `esdfs`, both need to recompile the kernel or WayDroid image.
Arknights, PUNISHING: GRAY RAVEN and other games won't freeze on the black screen.
![](assets/6.png) ![](assets/6.png)
Open the terminal and switch to the directory where "main.py" is located, then run: Open terminal and switch to directory where "main.py" is located then run:
``` ```
sudo venv/bin/python3 main.py hack nodataperm sudo venv/bin/python3 main.py hack nodataperm
``` ```
**WARNING**: Tested on `lineage-18.1-20230128-VANILLA-waydroid_x86_64.img`. This script will replace `/system/framework/service.jar`, which may prevent WayDroid from booting. If so, run `sudo venv/bin/python3 main.py uninstall nodataperm` to remove it.
**WARNING**: Tested on `lineage-18.1-20230128-VANILLA-waydroid_x86_64.img`. This script will
replace `/system/framework/service.jar`, which may prevent Waydroid from booting. If so,
run `sudo venv/bin/python3 main.py uninstall nodataperm` to remove it.
Or you can run the following commands directly in `sudo waydroid shell`. In this way, every time a new game is Or you can run the following commands directly in `sudo waydroid shell`. In this way, every time a new game is installed, you need to run it again, but it's much less risky.
installed, you need to run it again, but it is much less risky.
``` ```
chmod 777 -R /sdcard/Android chmod 777 -R /sdcard/Android
@@ -172,10 +158,10 @@ chmod 777 -R /mnt/*/*/*/*/Android/data
chmod 777 -R /mnt/*/*/*/*/Android/obb chmod 777 -R /mnt/*/*/*/*/Android/obb
``` ```
- https://github.com/supremegamers/device_generic_common/commit/2d47891376c96011b2ee3c1ccef61cb48e15aed6 - https://github.com/supremegamers/device_generic_common/commit/2d47891376c96011b2ee3c1ccef61cb48e15aed6
- https://github.com/supremegamers/android_frameworks_base/commit/24a08bf800b2e461356a9d67d04572bb10b0e819 - https://github.com/supremegamers/android_frameworks_base/commit/24a08bf800b2e461356a9d67d04572bb10b0e819
## Install microG, Aurora Store, and Aurora Droid ## Install microG, Aurora Store and Aurora Droid
![](assets/7.png) ![](assets/7.png)
@@ -183,8 +169,7 @@ chmod 777 -R /mnt/*/*/*/*/Android/obb
sudo venv/bin/python3 main.py install microg sudo venv/bin/python3 main.py install microg
``` ```
## Hide status bar ## Hide Status Bar
Before Before
![Before](assets/8.png) ![Before](assets/8.png)
@@ -195,27 +180,26 @@ After
sudo venv/bin/python3 main.py hack hidestatusbar sudo venv/bin/python3 main.py hack hidestatusbar
``` ```
## Get Android ID for device registration ## Get Android ID for device registration
You need to register your device with its ID before being able to use GApps, this will print out your Android ID, which You need to register you device with its it before being able to use gapps, this will print out your Android ID which you can use for device registration required for Google apps:
you can use for device registration required for Google apps: Open terminal and switch to directory where "main.py" is located then run:
Open the terminal and switch to the directory where "main.py" is located, then run:
sudo venv/bin/python3 main.py certified sudo venv/bin/python3 main.py certified
Star this repository if you find this useful, if you encounter a problem, create an issue on GitHub! Star this repository if you find this useful, if you encounter problem create an issue on GitHub!
## Error handling ## Error handling
- Magisk installed: N/A - Magisk installed: N/A
Check [waydroid-magisk](https://github.com/nitanmarcel/waydroid-magisk) Check [waydroid-magisk](https://github.com/nitanmarcel/waydroid-magisk)
## Credits ## Credits
- [WayDroid](https://github.com/waydroid/waydroid)
- [Waydroid](https://github.com/waydroid/waydroid) - [Magisk Delta](https://huskydg.github.io/magisk-files/)
- [Magisk Delta](https://huskydg.github.io/magisk-files)
- [microG Project](https://microg.org) - [microG Project](https://microg.org)
- [Open GApps](https://opengapps.org) - [Open GApps](https://opengapps.org)
- [Smart Dock](https://github.com/axel358/smartdock) - [Smart Dock](https://github.com/axel358/smartdock)
- [wd-scripts](https://github.com/electrikjesus/wd-scripts) - [wd-scripts](https://github.com/electrikjesus/wd-scripts/)
+4 -22
View File
@@ -1,22 +1,4 @@
with (import <nixpkgs> {}); let
pkgs = import <nixpkgs> {};
stdenv.mkDerivation { in
name = "waydroid_script"; pkgs.callPackage ./package.nix { }
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
'';
}
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;
});
};
}
+29 -21
View File
@@ -1,14 +1,11 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from InquirerPy import inquirer
from InquirerPy.base.control import Choice
from InquirerPy.separator import Separator
import argparse import argparse
import os import os
from typing import List from typing import List
from InquirerPy import inquirer
from InquirerPy.base.control import Choice
import tools.helper as helper
from stuff.android_id import AndroidId from stuff.android_id import AndroidId
from stuff.fdroidpriv import FDroidPriv
from stuff.gapps import Gapps from stuff.gapps import Gapps
from stuff.general import General from stuff.general import General
from stuff.hidestatusbar import HideStatusBar from stuff.hidestatusbar import HideStatusBar
@@ -20,8 +17,14 @@ from stuff.ndk import Ndk
from stuff.nodataperm import Nodataperm from stuff.nodataperm import Nodataperm
from stuff.smartdock import Smartdock from stuff.smartdock import Smartdock
from stuff.widevine import Widevine from stuff.widevine import Widevine
from stuff.fdroidpriv import FDroidPriv
from stuff.tflitefix import TfliteFix
import tools.helper as helper
from tools import container from tools import container
from tools import images from tools import images
import argparse
from tools.logger import Logger from tools.logger import Logger
@@ -30,7 +33,7 @@ def get_certified(args):
def mount(partition, copy_dir): def mount(partition, copy_dir):
img = os.path.join(images.get_image_dir(), partition + ".img") img = os.path.join(images.get_image_dir(), partition+".img")
mount_point = "" mount_point = ""
if partition == "system": if partition == "system":
mount_point = os.path.join(copy_dir) mount_point = os.path.join(copy_dir)
@@ -41,9 +44,9 @@ def mount(partition, copy_dir):
def resize(partition): def resize(partition):
img = os.path.join(images.get_image_dir(), partition + ".img") img = os.path.join(images.get_image_dir(), partition+".img")
img_size = int(os.path.getsize(img) / (1024 * 1024)) img_size = int(os.path.getsize(img)/(1024*1024))
new_size = "{}M".format(img_size + 500) new_size = "{}M".format(img_size+500)
Logger.info("Resizing {} to {}".format(img, new_size)) Logger.info("Resizing {} to {}".format(img, new_size))
images.resize(img, new_size) images.resize(img, new_size)
@@ -142,6 +145,8 @@ def remove_app(args):
remove_list.append(Nodataperm(args.android_version)) remove_list.append(Nodataperm(args.android_version))
if "hidestatusbar" in app: if "hidestatusbar" in app:
remove_list.append(HideStatusBar()) remove_list.append(HideStatusBar())
if "tflitefix" in app:
remove_list.append(TfliteFix())
if not container.use_overlayfs(): if not container.use_overlayfs():
copy_dir = "/tmp/waydroid" copy_dir = "/tmp/waydroid"
@@ -167,6 +172,8 @@ def hack_option(args):
hack_list.append(Nodataperm()) hack_list.append(Nodataperm())
if "hidestatusbar" in options: if "hidestatusbar" in options:
hack_list.append(HideStatusBar()) hack_list.append(HideStatusBar())
if "tflitefix" in options:
hack_list.append(TfliteFix())
if not container.use_overlayfs(): if not container.use_overlayfs():
copy_dir = "/tmp/waydroid" copy_dir = "/tmp/waydroid"
@@ -202,7 +209,7 @@ def interact():
args = argparse.Namespace() args = argparse.Namespace()
android_version = inquirer.select( android_version = inquirer.select(
message="Select Android version", message="Select Android version",
instruction="(\u2191\u2193 Select Item)", instruction="(↑↓ Select Item)",
choices=[ choices=[
Choice(name="Android 11", value="11"), Choice(name="Android 11", value="11"),
Choice(name="Android 13", value="13"), Choice(name="Android 13", value="13"),
@@ -228,7 +235,7 @@ def interact():
exit() exit()
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine",] install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine",]
hack_choices = [] hack_choices = ["tflitefix"]
if android_version=="11": if android_version=="11":
hack_choices.extend(["nodataperm", "hidestatusbar"]) hack_choices.extend(["nodataperm", "hidestatusbar"])
@@ -260,7 +267,7 @@ def interact():
choices=[*install_choices, *hack_choices] choices=[*install_choices, *hack_choices]
).execute() ).execute()
args.app = apps args.app = apps
args.microg_variant = "Standard" args.microg_variant="Standard"
remove_app(args) remove_app(args)
elif action == "Hack": elif action == "Hack":
apps = inquirer.checkbox( apps = inquirer.checkbox(
@@ -277,8 +284,9 @@ def interact():
def main(): def main():
parser = argparse.ArgumentParser(description='''Does stuff like installing Aapps, installing Magisk, installing parser = argparse.ArgumentParser(description='''
NDK Translation, and getting Android ID for device registration. Use -h flag for help!''') Does stuff like installing Gapps, installing Magisk, installing NDK Translation and getting Android ID for device registration.
Use -h flag for help!''')
subparsers = parser.add_subparsers(title="coomand", dest='command') subparsers = parser.add_subparsers(title="coomand", dest='command')
parser.add_argument('-a', '--android-version', parser.add_argument('-a', '--android-version',
@@ -294,7 +302,7 @@ def main():
install_choices = ["gapps", "microg", "libndk", "libhoudini", install_choices = ["gapps", "microg", "libndk", "libhoudini",
"magisk", "mitm", "smartdock", "widevine"] "magisk", "mitm", "smartdock", "widevine"]
hack_choices = ["nodataperm", "hidestatusbar"] hack_choices = ["nodataperm", "hidestatusbar", "tflitefix"]
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"] micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
remove_choices = install_choices remove_choices = install_choices
@@ -307,10 +315,10 @@ def main():
install_help = """ install_help = """
gapps: Install Open GApps (Android 11) or MindTheGapps (Android 13) gapps: Install Open GApps (Android 11) or MindTheGapps (Android 13)
microg: Add microG, Aurora Store, and Aurora Droid to WayDroid microg: Add microG, Aurora Store and Aurora Droid to WayDriod
libndk: Add libndk ARM translation, better for AMD CPUs libndk: Add libndk arm translation, better for AMD CPUs
libhoudini: Add libhoudini ARM translation, better for Intel CPUs libhoudini: Add libhoudini arm translation, better for Intel CPUs
magisk: Install Magisk Delta to Waydroid magisk: Install Magisk Delta to WayDroid
mitm -c CA_CERT_FILE: Install root CA cert into system trust store mitm -c CA_CERT_FILE: Install root CA cert into system trust store
smartdock: A desktop mode launcher for Android smartdock: A desktop mode launcher for Android
widevine: Add support for widevine DRM L3 widevine: Add support for widevine DRM L3
@@ -330,7 +338,7 @@ widevine: Add support for widevine DRM L3
remove_parser = subparsers.add_parser( remove_parser = subparsers.add_parser(
'remove', aliases=["uninstall"], help='Remove an app') 'remove', aliases=["uninstall"], help='Remove an app')
remove_parser.add_argument( remove_parser.add_argument(
**arg_template, choices=[*remove_choices, *hack_choices], help='Name of app to remove') **arg_template, choices=[*remove_choices, * hack_choices], help='Name of app to remove')
remove_parser.set_defaults(func=remove_app) remove_parser.set_defaults(func=remove_app)
# hack and its aliases # hack and its aliases
+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}"
'';
}
+1 -1
View File
@@ -4,7 +4,7 @@ from tools.logger import Logger
class AndroidId: class AndroidId:
def get_id(self): def get_id(self):
if container.is_running(): if container.is_running():
try: try:
queryout = shell( queryout = shell(
+4 -5
View File
@@ -1,6 +1,5 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
@@ -23,11 +22,10 @@ class FDroidPriv(General):
"priv-app/F-DroidPrivilegedExtension/F-DroidPrivilegedExtension.apk" "priv-app/F-DroidPrivilegedExtension/F-DroidPrivilegedExtension.apk"
] ]
file_map = { file_map = {
"permissions_org.fdroid.fdroid.privileged.xml": "etc/permissions/permissions_org.fdroid.fdroid.privileged.xml", "permissions_org.fdroid.fdroid.privileged.xml": "etc/permissions/permissions_org.fdroid.fdroid.privileged.xml",
"F-Droid.apk": "app/F-Droid/F-Droid.apk", "F-Droid.apk": "app/F-Droid/F-Droid.apk",
"F-DroidPrivilegedExtension.apk": "priv-app/F-DroidPrivilegedExtension/F-DroidPrivilegedExtension.apk", "F-DroidPrivilegedExtension.apk": "priv-app/F-DroidPrivilegedExtension/F-DroidPrivilegedExtension.apk",
} }
def __init__(self, android_version="11") -> None: def __init__(self, android_version="11") -> None:
super().__init__() super().__init__()
self.dl_link = self.dl_links[android_version][0] self.dl_link = self.dl_links[android_version][0]
@@ -41,3 +39,4 @@ class FDroidPriv(General):
if not os.path.exists(rro_dir): if not os.path.exists(rro_dir):
os.makedirs(rro_dir) os.makedirs(rro_dir)
shutil.copyfile(os.path.join(self.extract_to, f), rro_file) shutil.copyfile(os.path.join(self.extract_to, f), rro_file)
+13 -33
View File
@@ -1,6 +1,5 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.helper import run from tools.helper import run
@@ -10,32 +9,16 @@ class Gapps(General):
partition = "system" partition = "system"
dl_links = { dl_links = {
"11": { "11": {
"x86_64": [ "x86_64": ["https://sourceforge.net/projects/opengapps/files/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip", "5a6d242be34ad1acf92899c7732afa1b"],
"https://sourceforge.net/projects/opengapps/files/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip", "x86": ["https://sourceforge.net/projects/opengapps/files/x86/20220503/open_gapps-x86-11.0-pico-20220503.zip", "efda4943076016d00b40e0874b12ddd3"],
"5a6d242be34ad1acf92899c7732afa1b"], "arm64-v8a": ["https://sourceforge.net/projects/opengapps/files/arm64/20220503/open_gapps-arm64-11.0-pico-20220503.zip", "7790055d34bbfc6fe610b0cd263a7add"],
"x86": [ "armeabi-v7a": ["https://sourceforge.net/projects/opengapps/files/arm/20220215/open_gapps-arm-11.0-pico-20220215.zip", "8719519fa32ae83a62621c6056d32814"]
"https://sourceforge.net/projects/opengapps/files/x86/20220503/open_gapps-x86-11.0-pico-20220503.zip",
"efda4943076016d00b40e0874b12ddd3"],
"arm64-v8a": [
"https://sourceforge.net/projects/opengapps/files/arm64/20220503/open_gapps-arm64-11.0-pico-20220503.zip",
"7790055d34bbfc6fe610b0cd263a7add"],
"armeabi-v7a": [
"https://sourceforge.net/projects/opengapps/files/arm/20220215/open_gapps-arm-11.0-pico-20220215.zip",
"8719519fa32ae83a62621c6056d32814"]
}, },
"13": { "13": {
"x86_64": [ "x86_64": ["https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-x86_64-20231028.zip", "63ccebbf93d45c384f58d7c40049d398"],
"https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-x86_64-20231028.zip", "x86": ["https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-x86-20231028.zip", "f12b6a8ed14eedbb4b5b3c932a865956"],
"63ccebbf93d45c384f58d7c40049d398"], "arm64-v8a": ["https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-arm64-20231028.zip", "11180da0a5d9f2ed2863882c30a8d556"],
"x86": [ "armeabi-v7a": ["https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-arm-20231028.zip", "d525c980bac427844aa4cb01628f8a8f"]
"https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-x86-20231028.zip",
"f12b6a8ed14eedbb4b5b3c932a865956"],
"arm64-v8a": [
"https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-arm64-20231028.zip",
"11180da0a5d9f2ed2863882c30a8d556"],
"armeabi-v7a": [
"https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-arm-20231028.zip",
"d525c980bac427844aa4cb01628f8a8f"]
} }
} }
android_version = ... android_version = ...
@@ -141,8 +124,7 @@ class Gapps(General):
print(" Processing app package : " + print(" Processing app package : " +
os.path.join(self.extract_to, "Core", lz_file)) os.path.join(self.extract_to, "Core", lz_file))
run(["tar", "--lzip", "-xvf", os.path.join(self.extract_to, "Core", run(["tar", "--lzip", "-xvf", os.path.join(self.extract_to, "Core",
lz_file), "-C", lz_file), "-C", os.path.join(self.extract_to, "appunpack")])
os.path.join(self.extract_to, "appunpack")])
app_name = os.listdir(os.path.join( app_name = os.listdir(os.path.join(
self.extract_to, "appunpack"))[0] self.extract_to, "appunpack"))[0]
xx_dpi = os.listdir(os.path.join( xx_dpi = os.listdir(os.path.join(
@@ -163,16 +145,14 @@ class Gapps(General):
print(" Processing extra package : " + print(" Processing extra package : " +
os.path.join(self.extract_to, "Core", lz_file)) os.path.join(self.extract_to, "Core", lz_file))
run(["tar", "--lzip", "-xvf", os.path.join(self.extract_to, "Core", run(["tar", "--lzip", "-xvf", os.path.join(self.extract_to, "Core",
lz_file), "-C", lz_file), "-C", os.path.join(self.extract_to, "appunpack")])
os.path.join(self.extract_to, "appunpack")])
app_name = os.listdir(os.path.join( app_name = os.listdir(os.path.join(
self.extract_to, "appunpack"))[0] self.extract_to, "appunpack"))[0]
common_content_dirs = os.listdir(os.path.join( common_content_dirs = os.listdir(os.path.join(
self.extract_to, "appunpack", app_name, "common")) self.extract_to, "appunpack", app_name, "common"))
for ccdir in common_content_dirs: for ccdir in common_content_dirs:
shutil.copytree(os.path.join(self.extract_to, "appunpack", app_name, "common", ccdir), shutil.copytree(os.path.join(self.extract_to, "appunpack", app_name, "common", ccdir), os.path.join(
os.path.join( self.copy_dir, self.partition, ccdir), dirs_exist_ok=True)
self.copy_dir, self.partition, ccdir), dirs_exist_ok=True)
def copy_13(self): def copy_13(self):
src_dir = os.path.join(self.extract_to, "system") src_dir = os.path.join(self.extract_to, "system")
@@ -183,7 +163,7 @@ class Gapps(General):
for file in files: for file in files:
src_file_path = os.path.join(root, file) src_file_path = os.path.join(root, file)
dst_file_path = os.path.join(dst_dir, os.path.relpath( dst_file_path = os.path.join(dst_dir, os.path.relpath(
src_file_path, src_dir)) src_file_path, src_dir))
if not os.path.exists(os.path.dirname(dst_file_path)): if not os.path.exists(os.path.dirname(dst_file_path)):
os.makedirs(os.path.dirname(dst_file_path)) os.makedirs(os.path.dirname(dst_file_path))
# Logger.info(f"{src_file_path} -> {dst_file_path}") # Logger.info(f"{src_file_path} -> {dst_file_path}")
+3 -4
View File
@@ -1,12 +1,11 @@
import configparser import configparser
import glob import glob
import hashlib
import os import os
import shutil import shutil
import zipfile import zipfile
import hashlib
from tools import container
from tools.helper import download_file, get_download_dir, host from tools.helper import download_file, get_download_dir, host
from tools import container
from tools.logger import Logger from tools.logger import Logger
@@ -75,7 +74,7 @@ class General:
if not os.path.exists(bin_dir): if not os.path.exists(bin_dir):
os.makedirs(bin_dir) os.makedirs(bin_dir)
shutil.copy(os.path.join(os.path.join(os.path.dirname(__file__), "..", "bin", shutil.copy(os.path.join(os.path.join(os.path.dirname(__file__), "..", "bin",
self.arch[0], "resetprop")), bin_dir) self.arch[0], "resetprop")), bin_dir)
os.chmod(os.path.join(bin_dir, "resetprop"), 0o755) os.chmod(os.path.join(bin_dir, "resetprop"), 0o755)
if not os.path.isfile(os.path.join(bin_dir, "resetprop.sh")): if not os.path.isfile(os.path.join(bin_dir, "resetprop.sh")):
with open(os.path.join(bin_dir, "resetprop.sh"), "w") as f: with open(os.path.join(bin_dir, "resetprop.sh"), "w") as f:
+1 -3
View File
@@ -1,6 +1,5 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
@@ -13,9 +12,8 @@ class HideStatusBar(General):
dl_link = ... dl_link = ...
act_md5 = ... act_md5 = ...
files = [ files = [
"product/overlay/" + dl_file_name "product/overlay/"+dl_file_name
] ]
def __init__(self, android_version="11") -> None: def __init__(self, android_version="11") -> None:
super().__init__() super().__init__()
self.dl_link = self.dl_links[android_version][0] self.dl_link = self.dl_links[android_version][0]
+2 -3
View File
@@ -1,7 +1,6 @@
import os import os
import re import re
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.logger import Logger from tools.logger import Logger
@@ -11,7 +10,7 @@ class Houdini(General):
partition = "system" partition = "system"
dl_links = { dl_links = {
"11": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/81f2a51ef539a35aead396ab7fce2adf89f46e88.zip", "fbff756612b4144797fbc99eadcb6653"], "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 = ... act_md5 = ...
dl_link = ... dl_link = ...
@@ -58,7 +57,7 @@ on property:ro.enable.native.bridge.exec=1
Logger.info("Copying libhoudini library files ...") Logger.info("Copying libhoudini library files ...")
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0] name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
shutil.copytree(os.path.join(self.extract_to, "vendor_intel_proprietary_houdini-" + name, shutil.copytree(os.path.join(self.extract_to, "vendor_intel_proprietary_houdini-" + name,
"prebuilts"), os.path.join(self.copy_dir, self.partition), dirs_exist_ok=True) "prebuilts"), os.path.join(self.copy_dir, self.partition), dirs_exist_ok=True)
init_path = os.path.join( init_path = os.path.join(
self.copy_dir, self.partition, "etc", "init", "houdini.rc") self.copy_dir, self.partition, "etc", "init", "houdini.rc")
if not os.path.isfile(init_path): if not os.path.isfile(init_path):
+13 -16
View File
@@ -1,13 +1,11 @@
import gzip import gzip
import os import os
import re
import shutil import shutil
import re
from stuff.general import General from stuff.general import General
from tools import container from tools.helper import download_file, get_data_dir, host
from tools.helper import download_file, get_data_dir
from tools.logger import Logger from tools.logger import Logger
from tools import container
class Magisk(General): class Magisk(General):
id = "magisk delta" id = "magisk delta"
@@ -77,17 +75,16 @@ on property:init.svc.zygote=stopped
os.makedirs(os.path.join(self.copy_dir, "sbin"), exist_ok=True) os.makedirs(os.path.join(self.copy_dir, "sbin"), exist_ok=True)
Logger.info("Copying magisk libs now ...") Logger.info("Copying magisk libs now ...")
lib_dir = os.path.join(self.extract_to, "lib", self.arch[0]) lib_dir = os.path.join(self.extract_to, "lib", self.arch[0])
for parent, dirnames, filenames in os.walk(lib_dir): for parent, dirnames, filenames in os.walk(lib_dir):
for filename in filenames: for filename in filenames:
o_path = os.path.join(lib_dir, filename) o_path = os.path.join(lib_dir, filename)
filename = re.search('lib(.*)\.so', filename) filename = re.search('lib(.*)\.so', filename)
n_path = os.path.join(magisk_absolute_dir, filename.group(1)) n_path = os.path.join(magisk_absolute_dir, filename.group(1))
shutil.copyfile(o_path, n_path) shutil.copyfile(o_path, n_path)
shutil.copyfile(self.download_loc, os.path.join(magisk_absolute_dir, "magisk.apk")) shutil.copyfile(self.download_loc, os.path.join(magisk_absolute_dir,"magisk.apk") )
shutil.copytree(os.path.join(self.extract_to, "assets", "chromeos"), shutil.copytree(os.path.join(self.extract_to, "assets", "chromeos"), os.path.join(magisk_absolute_dir, "chromeos"), dirs_exist_ok=True)
os.path.join(magisk_absolute_dir, "chromeos"), dirs_exist_ok=True)
assets_files = [ assets_files = [
"addon.d.sh", "addon.d.sh",
"boot_patch.sh", "boot_patch.sh",
@@ -100,11 +97,11 @@ on property:init.svc.zygote=stopped
# Updating Magisk from Magisk manager will modify bootanim.rc, # Updating Magisk from Magisk manager will modify bootanim.rc,
# So it is necessary to backup the original bootanim.rc. # So it is necessary to backup the original bootanim.rc.
bootanim_path = os.path.join(self.copy_dir, self.partition, "etc", "init", "bootanim.rc") bootanim_path = os.path.join(self.copy_dir, self.partition, "etc", "init", "bootanim.rc")
gz_filename = os.path.join(bootanim_path) + ".gz" gz_filename = os.path.join(bootanim_path)+".gz"
with gzip.open(gz_filename, 'wb') as f_gz: with gzip.open(gz_filename,'wb') as f_gz:
f_gz.write(self.oringinal_bootanim.encode('utf-8')) f_gz.write(self.oringinal_bootanim.encode('utf-8'))
with open(bootanim_path, "w") as initfile: with open(bootanim_path, "w") as initfile:
initfile.write(self.oringinal_bootanim + self.bootanim_component) initfile.write(self.oringinal_bootanim+self.bootanim_component)
def set_path_perm(self, path): def set_path_perm(self, path):
if "magisk" in path.split("/"): if "magisk" in path.split("/"):
@@ -125,7 +122,7 @@ on property:init.svc.zygote=stopped
def extra1(self): def extra1(self):
self.delete_upper() self.delete_upper()
self.setup() self.setup()
# Delete the contents of upperdir # Delete the contents of upperdir
def delete_upper(self): def delete_upper(self):
if container.use_overlayfs(): if container.use_overlayfs():
@@ -133,7 +130,7 @@ on property:init.svc.zygote=stopped
files = [ files = [
"system/system/etc/init/bootanim.rc", "system/system/etc/init/bootanim.rc",
"system/system/etc/init/bootanim.rc.gz", "system/system/etc/init/bootanim.rc.gz",
"system/system/etc/init/magisk", "system/system/etc/init/magisk",
"system/system/addon.d/99-magisk.sh", "system/system/addon.d/99-magisk.sh",
"vendor/etc/selinux/precompiled_sepolicy" "vendor/etc/selinux/precompiled_sepolicy"
] ]
@@ -144,7 +141,7 @@ on property:init.svc.zygote=stopped
shutil.rmtree(file) shutil.rmtree(file)
elif os.path.isfile(file) or os.path.exists(file): elif os.path.isfile(file) or os.path.exists(file):
os.remove(file) os.remove(file)
def extra2(self): def extra2(self):
self.delete_upper() self.delete_upper()
data_dir = get_data_dir() data_dir = get_data_dir()
+4 -6
View File
@@ -1,6 +1,5 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.logger import Logger from tools.logger import Logger
@@ -16,7 +15,7 @@ class MicroG(General):
"org.microg.nlp.backend.ichnaea_20036.apk": "0b3cb65f8458d1a5802737c7392df903", "org.microg.nlp.backend.ichnaea_20036.apk": "0b3cb65f8458d1a5802737c7392df903",
"org.microg.nlp.backend.nominatim_20042.apk": "88e7397cbb9e5c71c8687d3681a23383", "org.microg.nlp.backend.nominatim_20042.apk": "88e7397cbb9e5c71c8687d3681a23383",
} }
microg_apks = { microg_apks= {
"com.google.android.gms-223616054.apk": "a945481ca5d33a03bc0f9418263c3228", "com.google.android.gms-223616054.apk": "a945481ca5d33a03bc0f9418263c3228",
"com.google.android.gsf-8.apk": "b2b4ea3642df6158e14689a4b2a246d4", "com.google.android.gsf-8.apk": "b2b4ea3642df6158e14689a4b2a246d4",
"com.android.vending-22.apk": "6815d191433ffcd8fa65923d5b0b0573", "com.android.vending-22.apk": "6815d191433ffcd8fa65923d5b0b0573",
@@ -108,7 +107,7 @@ service microg_service /system/bin/sh /system/bin/npem
super().__init__() super().__init__()
self.dl_link = self.dl_links[variant][0] self.dl_link = self.dl_links[variant][0]
self.act_md5 = self.dl_links[variant][1] self.act_md5 = self.dl_links[variant][1]
self.id = self.id + f"-{variant}" self.id = self.id+f"-{variant}"
self.dl_file_name = f'MinMicroG-{variant}.zip' self.dl_file_name = f'MinMicroG-{variant}.zip'
if android_version == "11": if android_version == "11":
self.sdk = 30 self.sdk = 30
@@ -124,7 +123,7 @@ service microg_service /system/bin/sh /system/bin/npem
else: else:
sub_arch = "x86" sub_arch = "x86"
if 64 == self.arch[1]: if 64 == self.arch[1]:
arch = f"{sub_arch}{'' if sub_arch == 'arm' else '_'}64" arch = f"{sub_arch}{'' if sub_arch=='arm' else '_'}64"
for root, dirs, files in os.walk(src_dir): for root, dirs, files in os.walk(src_dir):
flag = False flag = False
dir_name = os.path.basename(root) dir_name = os.path.basename(root)
@@ -136,8 +135,7 @@ service microg_service /system/bin/sh /system/bin/npem
sdks.append(i) sdks.append(i)
elif i: elif i:
archs.append(i) archs.append(i)
if len(archs) != 0 and arch not in archs and sub_arch not in archs or len(sdks) != 0 and str( if len(archs) != 0 and arch not in archs and sub_arch not in archs or len(sdks) != 0 and str(self.sdk) not in sdks:
self.sdk) not in sdks:
continue continue
else: else:
flag = True flag = True
+1 -3
View File
@@ -1,16 +1,14 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.helper import run from tools.helper import run
from tools.logger import Logger from tools.logger import Logger
class Mitm(General): class Mitm(General):
id = "mitm" id = "mitm"
partition = "system" partition = "system"
def __init__(self, ca_cert_file: str = None) -> None: def __init__(self, ca_cert_file: str=None) -> None:
super().__init__() super().__init__()
self.ca_cert_file = ca_cert_file self.ca_cert_file = ca_cert_file
+13 -15
View File
@@ -1,11 +1,9 @@
import os import os
import re import re
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.logger import Logger from tools.logger import Logger
class Ndk(General): class Ndk(General):
id = "libndk" id = "libndk"
partition = "system" partition = "system"
@@ -28,19 +26,19 @@ class Ndk(General):
"ro.dalvik.vm.isa.arm64": "x86_64" "ro.dalvik.vm.isa.arm64": "x86_64"
} }
files = [ files = [
"bin/arm", "bin/arm",
"bin/arm64", "bin/arm64",
"bin/ndk_translation_program_runner_binfmt_misc", "bin/ndk_translation_program_runner_binfmt_misc",
"bin/ndk_translation_program_runner_binfmt_misc_arm64", "bin/ndk_translation_program_runner_binfmt_misc_arm64",
"etc/binfmt_misc", "etc/binfmt_misc",
"etc/ld.config.arm.txt", "etc/ld.config.arm.txt",
"etc/ld.config.arm64.txt", "etc/ld.config.arm64.txt",
"etc/init/ndk_translation.rc", "etc/init/ndk_translation.rc",
"lib/arm", "lib/arm",
"lib64/arm64", "lib64/arm64",
"lib/libndk*", "lib/libndk*",
"lib64/libndk*" "lib64/libndk*"
] ]
def __init__(self, android_version="11") -> None: def __init__(self, android_version="11") -> None:
super().__init__() super().__init__()
+20 -13
View File
@@ -1,29 +1,32 @@
import os import os
import re import re
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools import container
from tools.helper import backup, restore from tools.helper import backup, restore
from tools.logger import Logger from tools.logger import Logger
from tools import container
class Nodataperm(General): class Nodataperm(General):
id = "nodataperm" id = "nodataperm"
dl_links = { dl_links = {
"11": "11": {
{ "x86_64": [
"x86_64": [ "https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip",
"https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip", "b0e3908ffcf5df8ea62f4929aa680f1a"
"b0e3908ffcf5df8ea62f4929aa680f1a" ],
], },
}, "13": {
"13": {} "x86_64": [
"https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip",
"b0e3908ffcf5df8ea62f4929aa680f1a"
],
},
} }
dl_file_name = "nodataperm.zip" dl_file_name = "nodataperm.zip"
extract_to = "/tmp/nodataperm" extract_to = "/tmp/nodataperm"
dl_link = ... dl_link = None
act_md5 = ... act_md5 = None
partition = "system" partition = "system"
files = [ files = [
"etc/nodataperm.sh", "etc/nodataperm.sh",
@@ -37,11 +40,15 @@ class Nodataperm(General):
super().__init__() super().__init__()
print("ok") print("ok")
arch = self.arch[0] 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.dl_link = self.dl_links[android_version][arch][0]
self.act_md5 = self.dl_links[android_version][arch][1] self.act_md5 = self.dl_links[android_version][arch][1]
def copy(self): 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( extract_path = os.path.join(
self.extract_to, f"hack_full_data_permission-{name}") self.extract_to, f"hack_full_data_permission-{name}")
if not container.use_overlayfs(): if not container.use_overlayfs():
+7 -11
View File
@@ -1,16 +1,14 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
class Smartdock(General): class Smartdock(General):
id = "smartdock" id = "smartdock"
dl_link = "https://f-droid.org/repo/cu.axel.smartdock_1100.apk" dl_link = "https://f-droid.org/repo/cu.axel.smartdock_1100.apk"
partition = "system" partition = "system"
dl_file_name = "smartdock.apk" dl_file_name = "smartdock.apk"
act_md5 = "f4087d34218eac902a5cca98ee03d215" act_md5 = "f4087d34218eac902a5cca98ee03d215"
apply_props = {"qemu.hw.mainkeys": "1"} apply_props = { "qemu.hw.mainkeys" : "1" }
skip_extract = True skip_extract = True
permissions = """<?xml version="1.0" encoding="utf-8"?> permissions = """<?xml version="1.0" encoding="utf-8"?>
<permissions> <permissions>
@@ -36,10 +34,10 @@ class Smartdock(General):
</permissions> </permissions>
""" """
files = [ files = [
"etc/permissions/permissions_cu.axel.smartdock.xml", "etc/permissions/permissions_cu.axel.smartdock.xml",
"priv-app/SmartDock", "priv-app/SmartDock",
"etc/init/smartdock.rc" "etc/init/smartdock.rc"
] ]
rc_content = ''' rc_content = '''
on property:sys.boot_completed=1 on property:sys.boot_completed=1
start set_home_activity start set_home_activity
@@ -57,10 +55,8 @@ service set_home_activity /system/bin/sh -c "cmd package set-home-activity cu.ax
os.makedirs(os.path.join(self.copy_dir, self.partition, "etc", "permissions")) os.makedirs(os.path.join(self.copy_dir, self.partition, "etc", "permissions"))
shutil.copyfile(os.path.join(self.download_loc), shutil.copyfile(os.path.join(self.download_loc),
os.path.join(self.copy_dir, self.partition, "priv-app/SmartDock/smartdock.apk")) os.path.join(self.copy_dir, self.partition, "priv-app/SmartDock/smartdock.apk"))
with open( with open(os.path.join(self.copy_dir, self.partition, "etc", "permissions", "permissions_cu.axel.smartdock.xml"), "w") as f:
os.path.join(self.copy_dir, self.partition, "etc", "permissions", "permissions_cu.axel.smartdock.xml"),
"w") as f:
f.write(self.permissions) f.write(self.permissions)
rc_dir = os.path.join(self.copy_dir, self.partition, "etc/init/smartdock.rc") rc_dir = os.path.join(self.copy_dir, self.partition, "etc/init/smartdock.rc")
+78
View File
@@ -0,0 +1,78 @@
import glob
import os
import shutil
from stuff.general import General
from tools.logger import Logger
class TfliteFix(General):
id = "tflitefix"
partition = "system"
TARGET_OFFSET = 0x2E9204
PATCH_BYTES = b"\xc0\x03\x5f\xd6" # ret in AArch64 little-endian
def __init__(self, android_version="13") -> None:
super().__init__()
def download(self):
pass
@property
def skip_extract(self):
return True
def copy(self):
pass
def extra1(self):
"""Applies binary patch to libtensorflowlite.so in installed apps"""
search_paths = [
os.path.expanduser("~/.local/share/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so"),
"/var/lib/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so",
]
found = []
for p in search_paths:
found.extend(glob.glob(p))
if not found:
Logger.warning("No installed apps with libtensorflowlite.so found in Waydroid data.")
return
for lib_path in found:
try:
with open(lib_path, "rb") as f:
data = bytearray(f.read())
if len(data) > self.TARGET_OFFSET + 4:
if bytes(data[self.TARGET_OFFSET:self.TARGET_OFFSET+4]) == self.PATCH_BYTES:
Logger.info(f"Patch already applied to {lib_path}")
continue
backup = lib_path + ".orig"
if not os.path.exists(backup):
shutil.copy2(lib_path, backup)
data[self.TARGET_OFFSET:self.TARGET_OFFSET+4] = self.PATCH_BYTES
with open(lib_path, "wb") as f:
f.write(data)
os.chmod(lib_path, 0o755)
Logger.info(f"Successfully patched {lib_path}")
except Exception as e:
Logger.error(f"Failed to patch {lib_path}: {e}")
def extra2(self):
"""Restores original libtensorflowlite.so from backup"""
search_paths = [
os.path.expanduser("~/.local/share/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so.orig"),
"/var/lib/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so.orig",
]
for p in search_paths:
for orig in glob.glob(p):
target = orig[:-5]
try:
shutil.copy2(orig, target)
os.remove(orig)
os.chmod(target, 0o755)
Logger.info(f"Restored {target}")
except Exception as e:
Logger.error(f"Failed to restore {target}: {e}")
+2 -4
View File
@@ -1,7 +1,6 @@
import os import os
import re import re
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.logger import Logger from tools.logger import Logger
@@ -19,9 +18,8 @@ class Widevine(General):
}, },
# "armeabi-v7a": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip", "fed6898b5cfd2a908cb134df97802554"], # "armeabi-v7a": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip", "fed6898b5cfd2a908cb134df97802554"],
"arm64-v8a": { "arm64-v8a": {
"11": [ "11": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip",
"https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip", "fed6898b5cfd2a908cb134df97802554"]
"fed6898b5cfd2a908cb134df97802554"]
} }
} }
dl_file_name = "widevine.zip" dl_file_name = "widevine.zip"
+4 -7
View File
@@ -1,12 +1,10 @@
import configparser import configparser
import os import os
import sys import sys
# import dbus # import dbus
from tools.helper import run from tools.helper import run
from tools.logger import Logger from tools.logger import Logger
# def DBusContainerService(object_path="/ContainerManager", intf="id.waydro.ContainerManager"): # def DBusContainerService(object_path="/ContainerManager", intf="id.waydro.ContainerManager"):
# return dbus.Interface(dbus.SystemBus().get_object("id.waydro.Container", object_path), intf) # return dbus.Interface(dbus.SystemBus().get_object("id.waydro.Container", object_path), intf)
@@ -31,7 +29,7 @@ def use_overlayfs():
Logger.error("Required entry in config was not found, Cannot continue!") Logger.error("Required entry in config was not found, Cannot continue!")
if "mount_overlays" not in cfg["waydroid"]: if "mount_overlays" not in cfg["waydroid"]:
return False return False
if cfg["waydroid"]["mount_overlays"] == "True": if cfg["waydroid"]["mount_overlays"]=="True":
return True return True
return False return False
@@ -45,12 +43,11 @@ def stop():
# if session: # if session:
# DBusContainerService().Stop(False) # DBusContainerService().Stop(False)
# else: # else:
run(["waydroid", "container", "stop"]) run(["waydroid", "container", "stop"])
def is_running(): def is_running():
return "Session:\tRUNNING" in run(["waydroid", "status"]).stdout.decode() return "Session:\tRUNNING" in run(["waydroid", "status"]).stdout.decode()
def upgrade(): def upgrade():
run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container") run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
+13 -23
View File
@@ -1,16 +1,15 @@
import gzip import gzip
import hashlib
import os import os
import re
import platform import platform
import re import re
import subprocess import subprocess
import sys import sys
from typing import Optional
import requests import requests
from tqdm import tqdm
from tools.logger import Logger from tools.logger import Logger
from tqdm import tqdm
import hashlib
from typing import Optional
def get_download_dir(): def get_download_dir():
@@ -18,7 +17,7 @@ def get_download_dir():
if os.environ.get("XDG_CACHE_HOME", None) is None: if os.environ.get("XDG_CACHE_HOME", None) is None:
download_loc = os.path.join('/', "home", os.environ.get( download_loc = os.path.join('/', "home", os.environ.get(
"SUDO_USER", os.environ["USER"]), ".cache", "waydroid-script", "downloads" "SUDO_USER", os.environ["USER"]), ".cache", "waydroid-script", "downloads"
) )
else: else:
download_loc = os.path.join( download_loc = os.path.join(
os.environ["XDG_CACHE_HOME"], "waydroid-script", "downloads" os.environ["XDG_CACHE_HOME"], "waydroid-script", "downloads"
@@ -27,19 +26,16 @@ def get_download_dir():
os.makedirs(download_loc) os.makedirs(download_loc)
return download_loc return download_loc
# not good # not good
def get_data_dir(): def get_data_dir():
return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", "data")
"data")
# execute on host # execute on host
def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None): def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
result = subprocess.run( result = subprocess.run(
args=args, args=args,
env=env, env=env,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE stderr=subprocess.PIPE
) )
@@ -56,7 +52,6 @@ def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
) )
return result return result
# execute on waydroid shell # execute on waydroid shell
def shell(arg: str, env: Optional[str] = None): def shell(arg: str, env: Optional[str] = None):
a = subprocess.Popen( a = subprocess.Popen(
@@ -66,8 +61,7 @@ def shell(arg: str, env: Optional[str] = None):
stderr=subprocess.PIPE stderr=subprocess.PIPE
) )
subprocess.Popen( subprocess.Popen(
args=["echo", 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"],
"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, stdout=a.stdin,
stdin=subprocess.PIPE stdin=subprocess.PIPE
).communicate() ).communicate()
@@ -95,7 +89,6 @@ def shell(arg: str, env: Optional[str] = None):
) )
return a.stdout.read().decode("utf-8") return a.stdout.read().decode("utf-8")
def download_file(url, f_name): def download_file(url, f_name):
md5 = "" md5 = ""
response = requests.get(url, stream=True) response = requests.get(url, stream=True)
@@ -114,7 +107,6 @@ def download_file(url, f_name):
raise ValueError("Something went wrong while downloading") raise ValueError("Something went wrong while downloading")
return md5 return md5
def host(): def host():
machine = platform.machine() machine = platform.machine()
@@ -133,7 +125,7 @@ def host():
return ("x86", 32) return ("x86", 32)
return mapping[machine] return mapping[machine]
raise ValueError("platform.machine '" + machine + "'" raise ValueError("platform.machine '" + machine + "'"
" architecture is not supported") " architecture is not supported")
def check_root(): def check_root():
@@ -141,16 +133,14 @@ def check_root():
Logger.error("This script must be run as root. Aborting.") Logger.error("This script must be run as root. Aborting.")
sys.exit(1) sys.exit(1)
def backup(path): def backup(path):
gz_filename = path + ".gz" gz_filename = path+".gz"
with gzip.open(gz_filename, 'wb') as f_gz: with gzip.open(gz_filename, 'wb') as f_gz:
with open(path, "rb") as f: with open(path, "rb") as f:
f_gz.write(f.read()) f_gz.write(f.read())
def restore(path): def restore(path):
gz_filename = path + ".gz" gz_filename = path+".gz"
with gzip.GzipFile(gz_filename) as f_gz: with gzip.GzipFile(gz_filename) as f_gz:
with open(path, "wb") as f: with open(path, "wb") as f:
f.writelines(f_gz) f.writelines(f_gz)
+2 -6
View File
@@ -1,18 +1,16 @@
import configparser import configparser
import os import os
import subprocess
import sys import sys
from tools.helper import run from tools.helper import run
from tools.logger import Logger from tools.logger import Logger
def mount(image, mount_point): def mount(image, mount_point):
umount(mount_point, False) umount(mount_point, False)
if not os.path.exists(mount_point): if not os.path.exists(mount_point):
os.makedirs(mount_point) os.makedirs(mount_point)
run(["mount", "-o", "rw", image, mount_point]) run(["mount", "-o", "rw", image, mount_point])
def umount(mount_point, exists=True): def umount(mount_point, exists=True):
if not os.path.exists(mount_point): if not os.path.exists(mount_point):
if not exists: if not exists:
@@ -25,12 +23,10 @@ def umount(mount_point, exists=True):
Logger.warning("{} is not a mount point".format( Logger.warning("{} is not a mount point".format(
mount_point)) mount_point))
def resize(img_file, size): def resize(img_file, size):
run(["sudo", "e2fsck", "-y", "-f", img_file], ignore="^e2fsck \d+\.\d+\.\d (.+)\n$") run(["sudo", "e2fsck", "-y", "-f", img_file], ignore="^e2fsck \d+\.\d+\.\d (.+)\n$")
run(["sudo", "resize2fs", img_file, size], ignore="^resize2fs \d+\.\d+\.\d (.+)\n$") run(["sudo", "resize2fs", img_file, size], ignore="^resize2fs \d+\.\d+\.\d (.+)\n$")
def get_image_dir(): def get_image_dir():
# Read waydroid config to get image location # Read waydroid config to get image location
cfg = configparser.ConfigParser() cfg = configparser.ConfigParser()
@@ -40,6 +36,6 @@ def get_image_dir():
sys.exit(1) sys.exit(1)
cfg.read(cfg_file) cfg.read(cfg_file)
if "waydroid" not in cfg: 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!") #magisk
sys.exit(1) sys.exit(1)
return cfg["waydroid"]["images_path"] return cfg["waydroid"]["images_path"]
+3 -3
View File
@@ -2,12 +2,12 @@ class Logger:
@staticmethod @staticmethod
def error(str): def error(str):
print("\033[31m" + "ERROR: " + str + "\033[0m") print("\033[31m"+"ERROR: "+str+"\033[0m")
@staticmethod @staticmethod
def info(str): def info(str):
print("\033[32m" + "INFO: " + "\033[0m" + str) print("\033[32m"+"INFO: "+"\033[0m"+str)
@staticmethod @staticmethod
def warning(str): def warning(str):
print("\033[33m" + "WARN: " + str + "\033[0m") print("\033[33m"+"WARN: "+str+"\033[0m")