Compare commits

...
Author SHA1 Message Date
Kazevic cb81832e4f Merge branch 'main' into patch-1 2025-10-15 17:33:13 -03:00
Alessandro Astone fcb15624db Fix A13 widevine
Closes: https://github.com/casualsnek/waydroid_script/issues/236
2025-08-31 22:56:59 +02:00
Alessandro Astone db43c7c9cf main: Default to A13
Following Waydroid which now defaults to A13
2025-08-18 12:41:31 +02:00
Mio 3e344b360f fix https://github.com/casualsnek/waydroid_script/issues/229 2025-07-13 09:11:10 +02:00
金雄镕 5527d390eb Reorder ro.product.cpu.abilist to prioritize 64-bit ABIs 2025-07-11 19:43:32 +02:00
MasterKia 6f44d95070 Fix microg installation guide
The previous command returns an error ("ModuleNotFoundError: No module named 'InquirerPy'") even after installing the InquirerPy module using pip.
2025-07-04 10:43:21 +02:00
Alessandro Astone 32d21c8074 Change ndk_translation for A13 2025-05-30 18:36:04 +02:00
Alessandro Astone eb337a1351 Change houdini for A13
Even though this is extracted from an Android 14 image, it works better
including on AMD CPUs

Closes: #224
2025-05-21 21:40:38 +02:00
Alessandro Astone 48186df8af A13 ndk_translation 2025-05-20 00:02:29 +02:00
Alessandro Astone c14650010e A13 houdini 2025-05-20 00:02:29 +02:00
Kazevic 5bf33e6415 Reformat and clean up code, fix typos 2024-07-01 01:24:49 -03:00
Kazevic 8a94de00be Fix one more typo 2024-06-27 02:41:32 -03:00
Kazevic 1436ea2f4b Fix typos, reformat Markdown, and use sentence case consistently 2024-06-27 02:40:32 -03:00
Casu Al Snek 1a2d3ad643 Merge pull request #143 from mistrmochov/patch-2
Update to Magisk Delta 26.3
2024-01-20 19:29:28 +05:45
mistrmochov 7cccf2b56d Maintainer of Magisk Delta, just deleted the repo for older Magisk Delta, so I put it on my repo 2024-01-10 19:16:24 +01:00
mistrmochov d31988a829 Update to Magisk Delta 26.3
Your script works fine with last Magisk Delta (before Kitsune Mask update).

Also with modified setup for bootanim
2024-01-09 16:44:57 +01:00
Casu Al Snek b12c06568c Merge pull request #132 from mkg20001/nix
Add nixos derivation
2024-01-09 09:12:53 +05:45
Casu Al Snek e0de64c047 Merge pull request #133 from mkg20001/fdroidpriv
Add fdroidpriv for installing f-droid privleged extension
2024-01-09 09:12:10 +05:45
Casu Al Snek bc3efd48c2 Merge pull request #131 from linyinfeng/fix-houdini
Fix binfmt_misc mounting for libhoudini
2024-01-09 09:11:33 +05:45
Casu Al Snek cd6239737a Downgrade magisk to Magisk_Delta_25210_canary_fdac22ba 2024-01-09 09:09:14 +05:45
Casu Al Snek 97293f3cc1 Merge pull request #140 from s1204IT/main
Update MindTheGapps package
2024-01-03 18:24:03 +05:45
Syuugo 76caf7e1d7 Fix filename 2023-12-22 12:49:35 +09:00
Syuugo 3527282950 Redirect user 2023-12-22 08:39:07 +09:00
Syuugo d2502086ed Update MTG package 2023-12-22 08:37:26 +09:00
Maciej Krüger c5110830f7 Add fdroidpriv for installing f-droid privleged extension 2023-11-20 03:35:08 +01:00
Maciej Krüger d81b72fed7 Add nixos derivation 2023-11-20 03:34:03 +01:00
Lin Yinfeng bd8d53906a Fix binfmt_misc mounting for libhoudini 2023-10-23 20:17:25 +08:00
Casu Al Snek acbb764ac5 Merge pull request #94 from mak448a/patch-1
Various grammar fixes
2023-09-26 19:06:34 +05:45
Casu Al Snek 45602d27c8 Merge pull request #122 from claui/mitm
Install self-signed CA cert into trust store
2023-09-25 19:47:04 +05:45
mak448a 6706f4b9d7 Merge branch 'main' into patch-1 2023-09-24 20:50:18 -05:00
Claudia b1c88db1ce Feature: install self-signed cacert to trust store
For analysis and reverse engineering, it can be helpful to insert a
custom CA certificate into Waydroid’s system-wide trust store.
Users used to be able to do that via Android’s settings but not anymore.

The `install mitm` command accepts a path to a file that contains a
– typically self-signed – CA certificate in PEM format.
It then renames [1] and copies the file into the overlay file system,
placing it into Waydroid’s trust store.

As a usage example, the following command lines enable your host to use
mitmproxy [2] to act as a proxy and to intercept [3] HTTP(S) connections
that come from the Waydroid container:

```sh
$ timeout --preserve-status 2 mitmdump -n                           # creates a CA cert in ~/.mitmproxy
$ sudo venv/bin/python3 main.py install mitm --ca-cert ~/.mitmproxy/mitmproxy-ca-cert.pem
INFO: Creating directory: /system/etc/security/cacerts
INFO: Copying /home/yourname/.mitmproxy/mitmproxy-ca-cert.pem to system trust store
INFO: Target file: /system/etc/security/cacerts/6320a7db.0
INFO: mitm installation finished
$ sudo waydroid shell -- ls -l /system/etc/security/cacerts         # double-check that it worked
[…]
-rw-r--r-- 1 root root 1191 2024-01-01 00:00 6320a7db.0
[…]
$ adb shell settings put global http_proxy ${YOUR_IP_HERE?}:3128    # tell Waydroid to use the proxy
                                                                    #     for all connections
$ mitmproxy -p 3128                                                 # start proxy and display a TUI
                                                                    #     with HTTP(S) connections
                                                                    #     coming from Waydroid
```

[1]: https://docs.mitmproxy.org/stable/howto-install-system-trusted-ca-android/#2-rename-certificate

[2]: https://mitmproxy.org/

[3]: https://docs.mitmproxy.org/stable/mitmproxytutorial-interceptrequests/
2023-09-23 18:34:14 +02:00
Casu Al Snek 688c84fd58 Merge pull request #124 from Benjamin-Loison/main
Add `bash` syntax highlighting to `README.md`
2023-09-23 20:54:44 +05:45
Benjamin Loison 367697d59e Add bash syntax highlighting to README.md 2023-09-17 02:26:48 +02:00
Casu Al Snek 77e222fb16 Merge pull request #118 from ayasa520/main
Fix some issues that prevented scripts from working properly
2023-08-25 14:47:59 +05:45
Rikka 821c7c0bc2 Update prompt 2023-08-24 23:33:10 +08:00
Rikka 854b4b0a6c Use venv to avoid breaking Python installation or OS 2023-08-24 23:33:04 +08:00
Rikka 6d5af57ebc fix: Fix simlink path issue
https://github.com/casualsnek/waydroid_script/issues/101
Relative path fails when using symlink. Replace it with absolute path.
2023-08-24 23:22:20 +08:00
Rikka a80ff8e855 update hidestatusbar link 2023-08-24 23:22:16 +08:00
Rikka 3e51f7f56e update smartdock link 2023-08-24 23:22:05 +08:00
Rikka e1ee7f0b0c Fix capitalization of MicroG and update nodataperm 2023-08-24 23:21:53 +08:00
ayasa520 337d066eeb fix(microg): typos 2023-08-24 23:17:14 +08:00
Casu Al Snek 4db9bb3cba Merge pull request #110 from axolotlek/main
fix cli commands mistakes in readme
2023-08-19 00:13:01 +05:45
Casu Al Snek 489159c5f9 Merge pull request #111 from SUFandom/patch-1
[URGENT] Update nodataperm.py by changing MD5SUM hash to updated state
2023-07-25 23:48:31 +05:45
SUFandom 9c2d8fcd83 [URGENT] Update nodataperm.py
Change the MD5Sum Because trying it spams error because its invalid

Suggestion: Just add the main.zip to the Releases tag and let The script grab the 'stable' version there an just change it alongside with the python script library for update to not add issues
2023-07-25 20:09:05 +08:00
axolotlek 098036cca9 fixed mistakes in readme 2023-07-25 14:46:43 +03:00
axolotlek 212135d3c8 fixed mistakes in readme 2023-07-25 13:59:51 +03:00
mak448a 7b5c7f64c0 Update README.md 2023-06-15 13:53:47 -05:00
mak448a b80dcf171f Update README.md 2023-06-15 13:38:56 -05:00
21 changed files with 464 additions and 220 deletions
+3
View File
@@ -105,4 +105,7 @@ venv.bak/
# mypy # mypy
.mypy_cache/ .mypy_cache/
# nix
result*
test.py test.py
+89 -61
View File
@@ -1,5 +1,6 @@
# Waydroid Extras Script # Waydroid Extras Script
Script to add gapps and other stuff to waydroid !
Script to add GApps and other stuff to Waydroid!
# Installation/Usage # Installation/Usage
@@ -8,8 +9,9 @@ Script to add gapps and other stuff to waydroid !
``` ```
git clone https://github.com/casualsnek/waydroid_script git clone https://github.com/casualsnek/waydroid_script
cd waydroid_script cd waydroid_script
sudo python3 -m pip install -r python3 -m venv venv
sudo python main.py venv/bin/pip install -r requirements.txt
sudo venv/bin/python3 main.py
``` ```
![image-20230430013103883](assets/img/README/image-20230430013103883.png) ![image-20230430013103883](assets/img/README/image-20230430013103883.png)
@@ -18,78 +20,92 @@ sudo python main.py
![image-20230430013148814](assets/img/README/image-20230430013148814.png) ![image-20230430013148814](assets/img/README/image-20230430013148814.png)
## Command line
```bash
## Command Line git clone https://github.com/casualsnek/waydroid_script
cd waydroid_script
git clone https://github.com/casualsnek/waydroid_script python3 -m venv venv
cd waydroid_script venv/bin/pip install -r requirements.txt
sudo python3 -m pip install -r requirements.txt # install something
# install something sudo venv/bin/python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg, mitm}
sudo python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg} # uninstall something
# uninstall something sudo venv/bin/python3 main.py uninstall {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg}
sudo python3 main.py uninstall {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg} # get Android device ID
# get Android device ID sudo venv/bin/python3 main.py certified
sudo python main.py certified # some hacks
# some hacks sudo venv/bin/python3 main.py hack {nodataperm, hidestatusbar}
sudo python3 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 OpenGapps ## Install Open GApps
![](assets/1.png) ![](assets/1.png)
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 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 terminal and switch to directory where "main.py" is located then run: After Waydroid has finished booting, open the terminal and switch to the directory where "main.py" is located, then run:
sudo python3 main.py google sudo python3 main.py google
Copy the returned numeric ID open ["https://google.com/android/uncertified/?pli=1"](https://google.com/android/uncertified/?pli=1) enter the id and register it, you may need to wait upto 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 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 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 sript again. If you want to update Magisk, Please use `Direct Install into system partition` or run this script again.
This script only focuses on Magisk installation, if you need more management, please check https://github.com/nitanmarcel/waydroid-magisk This script only focuses on Magisk installation, if you need more management, please
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 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 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
@@ -97,45 +113,55 @@ 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 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 python3 main.py install libhoudini sudo venv/bin/python3 main.py install libhoudini
## Integrate Widevine DRM (L3) ## Integrate Widevine DRM (L3)
![](assets/3.png) ![](assets/3.png)
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 python3 main.py install widevine sudo venv/bin/python3 main.py install widevine
## Install Smart Dock ## Install Smart Dock
![](assets/4.png) ![](assets/4.png)
![](assets/5.png) ![](assets/5.png)
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 python3 main.py install smartdock sudo venv/bin/python3 main.py install smartdock
## Install a self-signed CA certificate
Open the terminal and switch to the directory where "main.py" is located, then run:
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.
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.
Arknights, PUNISHING: GRAY RAVEN and other games won't freeze on the black screen.
![](assets/6.png) ![](assets/6.png)
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 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 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 installed, you need to run it again, but it's much less risky. 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 is much less risky.
``` ```
chmod 777 -R /sdcard/Android chmod 777 -R /sdcard/Android
@@ -149,15 +175,16 @@ 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)
``` ```
sudo python 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)
@@ -165,18 +192,18 @@ After
![After](assets/9.png) ![After](assets/9.png)
``` ```
sudo 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 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 need to register your device with its ID before being able to use GApps, this will print out your Android ID, which
Open terminal and switch to directory where "main.py" is located then run: you can use for device registration required for Google apps:
Open the terminal and switch to the directory where "main.py" is located, then run:
sudo python3 main.py google sudo venv/bin/python3 main.py certified
Star this repository if you find this useful, if you encounter problem create a issue on github ! Star this repository if you find this useful, if you encounter a problem, create an issue on GitHub!
## Error handling ## Error handling
@@ -185,9 +212,10 @@ Star this repository if you find this useful, if you encounter problem create 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)
- [Magisk Delta](https://huskydg.github.io/magisk-files/) - [Waydroid](https://github.com/waydroid/waydroid)
- [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)
+22
View File
@@ -0,0 +1,22 @@
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
'';
}
+39 -28
View File
@@ -1,27 +1,27 @@
#!/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
from stuff.houdini import Houdini from stuff.houdini import Houdini
from stuff.magisk import Magisk from stuff.magisk import Magisk
from stuff.microg import MicroG from stuff.microg import MicroG
from stuff.mitm import Mitm
from stuff.ndk import Ndk 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
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 +30,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 +41,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)
@@ -82,7 +82,11 @@ def install_app(args):
if "smartdock" in app: if "smartdock" in app:
install_list.append(Smartdock()) install_list.append(Smartdock())
if "microg" in app: if "microg" in app:
install_list.append(MicroG(args.android_version)) install_list.append(MicroG(args.android_version, args.microg_variant))
if "mitm" in app:
install_list.append(Mitm(args.ca_cert_file))
if "fdroidpriv" in app:
install_list.append(FDroidPriv(args.android_version))
if not container.use_overlayfs(): if not container.use_overlayfs():
copy_dir = "/tmp/waydroid" copy_dir = "/tmp/waydroid"
@@ -130,6 +134,10 @@ def remove_app(args):
remove_list.append(Smartdock()) remove_list.append(Smartdock())
if "microg" in app: if "microg" in app:
remove_list.append(MicroG(args.android_version, args.microg_variant)) remove_list.append(MicroG(args.android_version, args.microg_variant))
if "mitm" in app:
remove_list.append(Mitm())
if "fdroidpriv" in app:
remove_list.append(FDroidPriv(args.android_version))
if "nodataperm" in app: if "nodataperm" in app:
remove_list.append(Nodataperm(args.android_version)) remove_list.append(Nodataperm(args.android_version))
if "hidestatusbar" in app: if "hidestatusbar" in app:
@@ -200,7 +208,7 @@ def interact():
Choice(name="Android 13", value="13"), Choice(name="Android 13", value="13"),
Choice(name="Exit", value=None) Choice(name="Exit", value=None)
], ],
default="11", default="13",
).execute() ).execute()
if not android_version: if not android_version:
exit() exit()
@@ -219,10 +227,9 @@ def interact():
if not action: if not action:
exit() exit()
install_choices = ["gapps", "microg", "libndk", "magisk", "smartdock",] install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine",]
hack_choices = [] hack_choices = []
if android_version=="11": if android_version=="11":
install_choices.extend(["libhoudini", "widevine"])
hack_choices.extend(["nodataperm", "hidestatusbar"]) hack_choices.extend(["nodataperm", "hidestatusbar"])
if action == "Install": if action == "Install":
@@ -235,7 +242,7 @@ def interact():
).execute() ).execute()
microg_variants = ["Standard", "NoGoolag", microg_variants = ["Standard", "NoGoolag",
"UNLP", "Minimal", "MinimalIAP"] "UNLP", "Minimal", "MinimalIAP"]
if "MicroG" in apps: if "microg" in apps:
microg_variant = inquirer.select( microg_variant = inquirer.select(
message="Select MicroG variant", message="Select MicroG variant",
choices=microg_variants, choices=microg_variants,
@@ -253,7 +260,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(
@@ -270,15 +277,14 @@ def interact():
def main(): def main():
parser = argparse.ArgumentParser(description=''' parser = argparse.ArgumentParser(description='''Does stuff like installing Aapps, installing Magisk, installing
Does stuff like installing Gapps, installing Magisk, installing NDK Translation and getting Android ID for device registration. NDK Translation, and getting Android ID for device registration. Use -h flag for help!''')
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',
dest='android_version', dest='android_version',
help='Specify the Android version', help='Specify the Android version',
default="11", default="13",
choices=["11", "13"]) choices=["11", "13"])
# android command # android command
@@ -286,8 +292,8 @@ def main():
'certified', help='Get device ID to obtain Play Store certification') 'certified', help='Get device ID to obtain Play Store certification')
certified.set_defaults(func=get_certified) certified.set_defaults(func=get_certified)
install_choices = ["gapps", "microg", "libndk", install_choices = ["gapps", "microg", "libndk", "libhoudini",
"libhoudini", "magisk", "smartdock", "widevine"] "magisk", "mitm", "smartdock", "widevine"]
hack_choices = ["nodataperm", "hidestatusbar"] hack_choices = ["nodataperm", "hidestatusbar"]
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"] micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
remove_choices = install_choices remove_choices = install_choices
@@ -301,10 +307,11 @@ 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 WayDriod microg: Add microG, Aurora Store, and Aurora Droid to WayDroid
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
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
""" """
@@ -313,13 +320,17 @@ widevine: Add support for widevine DRM L3
'install', formatter_class=argparse.RawTextHelpFormatter, help='Install an app') 'install', formatter_class=argparse.RawTextHelpFormatter, help='Install an app')
install_parser.add_argument( install_parser.add_argument(
**arg_template, choices=install_choices, help=install_help) **arg_template, choices=install_choices, help=install_help)
install_parser.add_argument('-c', '--ca-cert',
dest='ca_cert_file',
help='[for mitm only] The CA certificate file (*.pem) to install',
default=None)
install_parser.set_defaults(func=install_app) install_parser.set_defaults(func=install_app)
# remove and its aliases # remove and its aliases
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
+1 -1
View File
@@ -14,7 +14,7 @@ class AndroidId:
except: except:
return return
else: else:
Logger.error("WayDroid isn't running !") Logger.error("Please make sure Waydroid is running and Gapps has been installed!")
return return
print(queryout.replace("android_id|", "").strip()) print(queryout.replace("android_id|", "").strip())
print(" ^----- Open https://google.com/android/uncertified/?pli=1") print(" ^----- Open https://google.com/android/uncertified/?pli=1")
+43
View File
@@ -0,0 +1,43 @@
import os
import shutil
from stuff.general import General
class FDroidPriv(General):
id = "fdroid priv"
dl_links = {"11": ["https://f-droid.org/repo/org.fdroid.fdroid.privileged.ota_2130.zip",
"6242cab56d197d80c598593a46da62e4"],
"13": ["https://f-droid.org/repo/org.fdroid.fdroid.privileged.ota_2130.zip",
"6242cab56d197d80c598593a46da62e4"]}
partition = "system"
dl_file_name = "org.fdroid.fdroid.privileged.ota_2130.zip"
dl_link = ...
act_md5 = ...
extract_to = "/tmp/fdroid_ota_2130"
files = [
"app/F-Droid.apk"
"app/F-Droid/F-Droid.apk"
"etc/permissions/permissions_org.fdroid.fdroid.privileged.xml"
"priv-app/F-DroidPrivilegedExtension.apk"
"priv-app/F-DroidPrivilegedExtension/F-DroidPrivilegedExtension.apk"
]
file_map = {
"permissions_org.fdroid.fdroid.privileged.xml": "etc/permissions/permissions_org.fdroid.fdroid.privileged.xml",
"F-Droid.apk": "app/F-Droid/F-Droid.apk",
"F-DroidPrivilegedExtension.apk": "priv-app/F-DroidPrivilegedExtension/F-DroidPrivilegedExtension.apk",
}
def __init__(self, android_version="11") -> None:
super().__init__()
self.dl_link = self.dl_links[android_version][0]
self.act_md5 = self.dl_links[android_version][1]
def copy(self):
for f, d in self.file_map.items():
rro_file = os.path.join(
self.copy_dir, self.partition, d)
rro_dir = os.path.dirname(rro_file)
if not os.path.exists(rro_dir):
os.makedirs(rro_dir)
shutil.copyfile(os.path.join(self.extract_to, f), rro_file)
+31 -11
View File
@@ -1,5 +1,6 @@
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
@@ -9,16 +10,32 @@ class Gapps(General):
partition = "system" partition = "system"
dl_links = { dl_links = {
"11": { "11": {
"x86_64": ["https://sourceforge.net/projects/opengapps/files/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip", "5a6d242be34ad1acf92899c7732afa1b"], "x86_64": [
"x86": ["https://sourceforge.net/projects/opengapps/files/x86/20220503/open_gapps-x86-11.0-pico-20220503.zip", "efda4943076016d00b40e0874b12ddd3"], "https://sourceforge.net/projects/opengapps/files/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip",
"arm64-v8a": ["https://sourceforge.net/projects/opengapps/files/arm64/20220503/open_gapps-arm64-11.0-pico-20220503.zip", "7790055d34bbfc6fe610b0cd263a7add"], "5a6d242be34ad1acf92899c7732afa1b"],
"armeabi-v7a": ["https://sourceforge.net/projects/opengapps/files/arm/20220215/open_gapps-arm-11.0-pico-20220215.zip", "8719519fa32ae83a62621c6056d32814"] "x86": [
"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": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-x86_64-20230323.zip", "aba427be1ddd0963121c87a4eda80299"], "x86_64": [
"x86": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-x86-20230323.zip", "f02d2f1a3f0a084f13ab4c1b58ad7554"], "https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-x86_64-20231028.zip",
"arm64-v8a": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-arm64-20230323.zip", "18484a5622eeccffcea2b43205655d8a"], "63ccebbf93d45c384f58d7c40049d398"],
"armeabi-v7a": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-arm-20230323.zip", "e4c00a7eb1e4dfca0fc6a3e447710264"] "x86": [
"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 = ...
@@ -124,7 +141,8 @@ 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", os.path.join(self.extract_to, "appunpack")]) lz_file), "-C",
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(
@@ -145,13 +163,15 @@ 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", os.path.join(self.extract_to, "appunpack")]) lz_file), "-C",
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), os.path.join( shutil.copytree(os.path.join(self.extract_to, "appunpack", app_name, "common", ccdir),
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):
+5 -4
View File
@@ -1,11 +1,12 @@
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.helper import download_file, get_download_dir, host
from tools import container from tools import container
from tools.helper import download_file, get_download_dir, host
from tools.logger import Logger from tools.logger import Logger
@@ -73,8 +74,8 @@ class General:
if not os.path.isfile(os.path.join(bin_dir, "resetprop")): if not os.path.isfile(os.path.join(bin_dir, "resetprop")):
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( shutil.copy(os.path.join(os.path.join(os.path.dirname(__file__), "..", "bin",
"./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:
+5 -3
View File
@@ -1,19 +1,21 @@
import os import os
import shutil import shutil
from stuff.general import General from stuff.general import General
class HideStatusBar(General): class HideStatusBar(General):
id = "hide status bar" id = "hide status bar"
dl_links = {"11": ["https://github.com/ayasa520/hide-status-bar/releases/download/v0.0.1/app-release.apk", dl_links = {"11": ["https://github.com/ayasa520/hide-status-bar/releases/download/v0.0.2/app-release.apk",
"ae6c4cc567d6f3de77068e54e43818e2"]} "ff2fe63ddfb4b035e6720a1b195b2355"]}
partition = "system" partition = "system"
dl_file_name = "hidestatusbar.apk" dl_file_name = "hidestatusbar.apk"
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]
+3 -2
View File
@@ -1,6 +1,7 @@
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
@@ -10,7 +11,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/978d8cba061a08837b7e520cd03b635af643ba08.zip", "1e139054c05034648fae58a1810573b4"] "13": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/7e21ea3f63bd89e9e8af54e32da41bd8b65c93a1.zip", "f8cf5db10e5fdb9b77e98e515a9b08c9"]
} }
act_md5 = ... act_md5 = ...
dl_link = ... dl_link = ...
@@ -18,7 +19,7 @@ class Houdini(General):
extract_to = "/tmp/houdiniunpack" extract_to = "/tmp/houdiniunpack"
init_rc_component = """ init_rc_component = """
on early-init on early-init
mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc mount binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
on property:ro.enable.native.bridge.exec=1 on property:ro.enable.native.bridge.exec=1
exec -- /system/bin/sh -c "echo ':arm_exe:M::\\\\x7f\\\\x45\\\\x4c\\\\x46\\\\x01\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x02\\\\x00\\\\x28::/system/bin/houdini:P' > /proc/sys/fs/binfmt_misc/register" exec -- /system/bin/sh -c "echo ':arm_exe:M::\\\\x7f\\\\x45\\\\x4c\\\\x46\\\\x01\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x02\\\\x00\\\\x28::/system/bin/houdini:P' > /proc/sys/fs/binfmt_misc/register"
+26 -25
View File
@@ -1,16 +1,18 @@
import gzip import gzip
import os import os
import shutil
import re import re
import shutil
from stuff.general import General from stuff.general import General
from tools.helper import download_file, get_data_dir, host
from tools.logger import Logger
from tools import container from tools import container
from tools.helper import download_file, get_data_dir
from tools.logger import Logger
class Magisk(General): class Magisk(General):
id = "magisk delta" id = "magisk delta"
partition = "system" partition = "system"
dl_link = "https://huskydg.github.io/magisk-files/app-debug.apk" dl_link = "https://github.com/mistrmochov/magiskdeltaorig/raw/main/app-release.apk"
dl_file_name = "magisk.apk" dl_file_name = "magisk.apk"
extract_to = "/tmp/magisk_unpack" extract_to = "/tmp/magisk_unpack"
magisk_dir = os.path.join(partition, "etc", "init", "magisk") magisk_dir = os.path.join(partition, "etc", "init", "magisk")
@@ -29,30 +31,28 @@ service bootanim /system/bin/bootanimation
bootanim_component = f""" bootanim_component = f"""
on post-fs-data on post-fs-data
start logd start logd
exec u:r:su:s0 root root -- /system/etc/init/magisk/magisk{host()[1]} --auto-selinux --setup-sbin /system/etc/init/magisk exec u:r:su:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
exec u:r:su:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk "allow * magisk_file lnk_file *" exec u:r:magisk:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
mkdir /sbin/.magisk 700 exec u:r:update_engine:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
mkdir /sbin/.magisk/mirror 700 mkdir /dev/magisk_iqeoVo2mDrO 700
mkdir /sbin/.magisk/block 700 exec u:r:su:s0 root root -- /system/etc/init/magisk/magisk64 --auto-selinux --setup-sbin /system/etc/init/magisk /dev/magisk_iqeoVo2mDrO
copy /system/etc/init/magisk/config /sbin/.magisk/config exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --post-fs-data
rm /dev/.magisk_unblock
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --post-fs-data
wait /dev/.magisk_unblock 40
rm /dev/.magisk_unblock
on zygote-start on nonencrypted
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --service exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --service
on property:vold.decrypt=trigger_restart_framework
exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --service
on property:sys.boot_completed=1 on property:sys.boot_completed=1
mkdir /data/adb/magisk 755 mkdir /data/adb/magisk 755
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --boot-complete exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --boot-complete
exec -- /system/bin/sh -c "if [ ! -e /data/data/io.github.huskydg.magisk ] ; then pm install /system/etc/init/magisk/magisk.apk ; fi"
on property:init.svc.zygote=restarting on property:init.svc.zygote=restarting
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --zygote-restart
on property:init.svc.zygote=stopped on property:init.svc.zygote=stopped
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --zygote-restart
""" """
def download(self): def download(self):
@@ -85,8 +85,9 @@ on property:init.svc.zygote=stopped
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"), os.path.join(magisk_absolute_dir, "chromeos"), dirs_exist_ok=True) shutil.copytree(os.path.join(self.extract_to, "assets", "chromeos"),
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",
@@ -99,11 +100,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("/"):
+6 -4
View File
@@ -1,5 +1,6 @@
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
@@ -15,7 +16,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",
@@ -107,7 +108,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
@@ -123,7 +124,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)
@@ -135,7 +136,8 @@ 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(self.sdk) not in sdks: 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:
continue continue
else: else:
flag = True flag = True
+42
View File
@@ -0,0 +1,42 @@
import os
import shutil
from stuff.general import General
from tools.helper import run
from tools.logger import Logger
class Mitm(General):
id = "mitm"
partition = "system"
def __init__(self, ca_cert_file: str = None) -> None:
super().__init__()
self.ca_cert_file = ca_cert_file
def download(self):
pass
def skip_extract(self):
return True
def copy(self):
file_hash = run([
'openssl', 'x509', '-noout', '-subject_hash_old', '-in',
self.ca_cert_file,
]).stdout.decode("ascii").strip()
target_dir = os.path.join(
self.copy_dir, self.partition, "etc", "security", "cacerts")
Logger.info(f"Creating directory: {target_dir}")
os.makedirs(target_dir, exist_ok=True)
target_path = os.path.join(target_dir, f'{file_hash}.0')
Logger.info(f"Copying {self.ca_cert_file} to system trust store")
Logger.info(f"Target file: {target_path}")
shutil.copyfile(self.ca_cert_file, target_path)
os.chmod(target_path, 0o644)
def install(self):
if not self.ca_cert_file:
raise ValueError(
"This command requires the --ca-cert switch and a *.pem file")
super().install()
+4 -2
View File
@@ -1,20 +1,22 @@
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"
dl_links = { dl_links = {
"11": ["https://github.com/supremegamers/vendor_google_proprietary_ndk_translation-prebuilt/archive/9324a8914b649b885dad6f2bfd14a67e5d1520bf.zip", "c9572672d1045594448068079b34c350"], "11": ["https://github.com/supremegamers/vendor_google_proprietary_ndk_translation-prebuilt/archive/9324a8914b649b885dad6f2bfd14a67e5d1520bf.zip", "c9572672d1045594448068079b34c350"],
"13": ["https://github.com/supremegamers/vendor_google_proprietary_ndk_translation-prebuilt/archive/a090003c60df53a9eadb2df09bd4fd2fa86ea629.zip", "e6f0d9fc28ebc427b59a3942a9a4ffc0"] "13": ["https://github.com/supremegamers/vendor_google_proprietary_ndk_translation-prebuilt/archive/68734c52556d3d7a6db34c603dd9276915c29f2f.zip", "0b2207c490fcb400aa5c87fcf0d52d38"]
} }
dl_file_name = "libndktranslation.zip" dl_file_name = "libndktranslation.zip"
extract_to = "/tmp/libndkunpack" extract_to = "/tmp/libndkunpack"
apply_props = { apply_props = {
"ro.product.cpu.abilist": "x86_64,x86,armeabi-v7a,armeabi,arm64-v8a", "ro.product.cpu.abilist": "x86_64,x86,arm64-v8a,armeabi-v7a,armeabi",
"ro.product.cpu.abilist32": "x86,armeabi-v7a,armeabi", "ro.product.cpu.abilist32": "x86,armeabi-v7a,armeabi",
"ro.product.cpu.abilist64": "x86_64,arm64-v8a", "ro.product.cpu.abilist64": "x86_64,arm64-v8a",
"ro.dalvik.vm.native.bridge": "libndk_translation.so", "ro.dalvik.vm.native.bridge": "libndk_translation.so",
+37 -18
View File
@@ -1,17 +1,24 @@
import gzip
import os import os
import re
import shutil import shutil
from stuff.general import General from stuff.general import General
from tools.logger import Logger
from tools import container from tools import container
from tools.helper import backup, restore
from tools.logger import Logger
class Nodataperm(General): class Nodataperm(General):
id = "nodataperm" id = "nodataperm"
dl_links = { dl_links = {
"11": ["https://github.com/ayasa520/hack_full_data_permission/archive/refs/heads/main.zip", "11":
"eafd7b0986f3edaebaf1dd89f19d49bf"], {
"13": ["", ""] "x86_64": [
"https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip",
"b0e3908ffcf5df8ea62f4929aa680f1a"
],
},
"13": {}
} }
dl_file_name = "nodataperm.zip" dl_file_name = "nodataperm.zip"
extract_to = "/tmp/nodataperm" extract_to = "/tmp/nodataperm"
@@ -21,25 +28,34 @@ class Nodataperm(General):
files = [ files = [
"etc/nodataperm.sh", "etc/nodataperm.sh",
"etc/init/nodataperm.rc", "etc/init/nodataperm.rc",
"framework/services.jar" "framework/services.jar",
"framework/services.jar.prof",
"framework/services.jar.bprof",
] ]
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] print("ok")
self.act_md5 = self.dl_links[android_version][1] arch = self.arch[0]
self.dl_link = self.dl_links[android_version][arch][0]
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]
extract_path = os.path.join( extract_path = os.path.join(
self.extract_to, "hack_full_data_permission-main") self.extract_to, f"hack_full_data_permission-{name}")
if not container.use_overlayfs(): if not container.use_overlayfs():
services_jar = os.path.join( services_jar = os.path.join(
self.copy_dir, self.partition, "framework", "services.jar") self.copy_dir, self.partition, "framework", "services.jar")
gz_filename = services_jar+".gz" services_jar_prof = os.path.join(
with gzip.open(gz_filename, 'wb') as f_gz: self.copy_dir, self.partition, "framework", "services.jar.prof")
with open(services_jar, "rb") as f: services_jar_bprof = os.path.join(
f_gz.write(f.read()) self.copy_dir, self.partition, "framework", "services.jar.bprof")
Logger.info("Copying widevine library files ...") backup(services_jar)
backup(services_jar_prof)
backup(services_jar_bprof)
Logger.info(f"Copying {self.id} library files ...")
shutil.copytree(extract_path, os.path.join( shutil.copytree(extract_path, os.path.join(
self.copy_dir, self.partition), dirs_exist_ok=True) self.copy_dir, self.partition), dirs_exist_ok=True)
@@ -47,7 +63,10 @@ class Nodataperm(General):
if not container.use_overlayfs(): if not container.use_overlayfs():
services_jar = os.path.join( services_jar = os.path.join(
self.copy_dir, self.partition, "framework", "services.jar") self.copy_dir, self.partition, "framework", "services.jar")
gz_filename = services_jar+".gz" services_jar_prof = os.path.join(
with gzip.GzipFile(gz_filename) as f_gz: self.copy_dir, self.partition, "framework", "services.jar.prof")
with open(services_jar, "wb") as f: services_jar_bprof = os.path.join(
f.writelines(f_gz) self.copy_dir, self.partition, "framework", "services.jar.bprof")
restore(services_jar)
restore(services_jar_prof)
restore(services_jar_bprof)
+8 -4
View File
@@ -1,14 +1,16 @@
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_198.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 = "a8ce0bca5e1772796404602e0fa250a4" 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>
@@ -56,7 +58,9 @@ service set_home_activity /system/bin/sh -c "cmd package set-home-activity cu.ax
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(os.path.join(self.copy_dir, self.partition, "etc", "permissions", "permissions_cu.axel.smartdock.xml"), "w") as f: with open(
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")
+16 -3
View File
@@ -1,6 +1,7 @@
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
@@ -13,12 +14,13 @@ class Widevine(General):
"x86_64": { "x86_64": {
"11": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/48d1076a570837be6cdce8252d5d143363e37cc1.zip", "11": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/48d1076a570837be6cdce8252d5d143363e37cc1.zip",
"f587b8859f9071da4bca6cea1b9bed6a"], "f587b8859f9071da4bca6cea1b9bed6a"],
"13": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a8524d608431573ef1c9313822d271f78728f9a6.zip", "13": ["https://github.com/WayDroid-ATV/vendor_google_proprietary_widevine-prebuilt/archive/679552343d8b2e8d7a19b6df61c7a03963d0c75b.zip",
"5c55df61da5c012b4e43746547ab730f"] "80ab79ea85c7b2556baedb371a54e01c"]
}, },
# "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": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip", "11": [
"https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip",
"fed6898b5cfd2a908cb134df97802554"] "fed6898b5cfd2a908cb134df97802554"]
} }
} }
@@ -30,7 +32,10 @@ class Widevine(General):
"etc/init/*widevine.rc", "etc/init/*widevine.rc",
"etc/vintf/manifest/*widevine.xml", "etc/vintf/manifest/*widevine.xml",
"lib/libwvhidl.so", "lib/libwvhidl.so",
"lib/libwvaidl.so",
"lib/mediadrm", "lib/mediadrm",
"lib64/libwvhidl.so",
"lib64/libwvaidl.so",
"lib64/mediadrm" "lib64/mediadrm"
] ]
@@ -38,9 +43,17 @@ class Widevine(General):
super().__init__() super().__init__()
self.dl_link = self.dl_links[self.arch[0]][android_version][0] self.dl_link = self.dl_links[self.arch[0]][android_version][0]
self.act_md5 = self.dl_links[self.arch[0]][android_version][1] self.act_md5 = self.dl_links[self.arch[0]][android_version][1]
self.android_version = android_version
self.libdir = "lib64" if self.arch[1] == 64 else "lib"
def copy(self): def copy(self):
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0] name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
Logger.info("Copying widevine library files ...") Logger.info("Copying widevine library files ...")
shutil.copytree(os.path.join(self.extract_to, "vendor_google_proprietary_widevine-prebuilt-"+name, shutil.copytree(os.path.join(self.extract_to, "vendor_google_proprietary_widevine-prebuilt-"+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)
if self.android_version == "13":
try:
os.symlink("libprotobuf-cpp-lite-3.9.1.so",
os.path.join(self.copy_dir, self.partition, self.libdir, "libprotobuf-cpp-lite.so"))
except FileExistsError:
pass
+4 -1
View File
@@ -1,10 +1,12 @@
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)
@@ -29,7 +31,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
@@ -49,5 +51,6 @@ def 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")
+30 -7
View File
@@ -1,15 +1,17 @@
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
import requests
from tools.logger import Logger
from tqdm import tqdm
import hashlib
from typing import Optional from typing import Optional
import requests
from tqdm import tqdm
from tools.logger import Logger
def get_download_dir(): def get_download_dir():
download_loc = "" download_loc = ""
@@ -25,9 +27,12 @@ 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", "data") return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid",
"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):
@@ -51,6 +56,7 @@ 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(
@@ -60,7 +66,8 @@ def shell(arg: str, env: Optional[str] = None):
stderr=subprocess.PIPE stderr=subprocess.PIPE
) )
subprocess.Popen( 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"], 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, stdout=a.stdin,
stdin=subprocess.PIPE stdin=subprocess.PIPE
).communicate() ).communicate()
@@ -88,6 +95,7 @@ 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)
@@ -106,6 +114,7 @@ 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()
@@ -131,3 +140,17 @@ def check_root():
if os.geteuid() != 0: if os.geteuid() != 0:
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):
gz_filename = path + ".gz"
with gzip.open(gz_filename, 'wb') as f_gz:
with open(path, "rb") as f:
f_gz.write(f.read())
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)
+6 -2
View File
@@ -1,16 +1,18 @@
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:
@@ -23,10 +25,12 @@ 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()
@@ -36,6 +40,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")