Compare commits
48
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb81832e4f | ||
|
|
fcb15624db | ||
|
|
db43c7c9cf | ||
|
|
3e344b360f | ||
|
|
5527d390eb | ||
|
|
6f44d95070 | ||
|
|
32d21c8074 | ||
|
|
eb337a1351 | ||
|
|
48186df8af | ||
|
|
c14650010e | ||
|
|
5bf33e6415 | ||
|
|
8a94de00be | ||
|
|
1436ea2f4b | ||
|
|
1a2d3ad643 | ||
|
|
7cccf2b56d | ||
|
|
d31988a829 | ||
|
|
b12c06568c | ||
|
|
e0de64c047 | ||
|
|
bc3efd48c2 | ||
|
|
cd6239737a | ||
|
|
97293f3cc1 | ||
|
|
76caf7e1d7 | ||
|
|
3527282950 | ||
|
|
d2502086ed | ||
|
|
c5110830f7 | ||
|
|
d81b72fed7 | ||
|
|
bd8d53906a | ||
|
|
acbb764ac5 | ||
|
|
45602d27c8 | ||
|
|
6706f4b9d7 | ||
|
|
b1c88db1ce | ||
|
|
688c84fd58 | ||
|
|
367697d59e | ||
|
|
77e222fb16 | ||
|
|
821c7c0bc2 | ||
|
|
854b4b0a6c | ||
|
|
6d5af57ebc | ||
|
|
a80ff8e855 | ||
|
|
3e51f7f56e | ||
|
|
e1ee7f0b0c | ||
|
|
337d066eeb | ||
|
|
4db9bb3cba | ||
|
|
489159c5f9 | ||
|
|
9c2d8fcd83 | ||
|
|
098036cca9 | ||
|
|
212135d3c8 | ||
|
|
7b5c7f64c0 | ||
|
|
b80dcf171f |
+4
-1
@@ -105,4 +105,7 @@ venv.bak/
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
|
||||
test.py
|
||||
# nix
|
||||
result*
|
||||
|
||||
test.py
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# Waydroid Extras Script
|
||||
Script to add gapps and other stuff to waydroid !
|
||||
|
||||
Script to add GApps and other stuff to Waydroid!
|
||||
|
||||
# Installation/Usage
|
||||
|
||||
@@ -8,8 +9,9 @@ Script to add gapps and other stuff to waydroid !
|
||||
```
|
||||
git clone https://github.com/casualsnek/waydroid_script
|
||||
cd waydroid_script
|
||||
sudo python3 -m pip install -r
|
||||
sudo python main.py
|
||||
python3 -m venv venv
|
||||
venv/bin/pip install -r requirements.txt
|
||||
sudo venv/bin/python3 main.py
|
||||
```
|
||||
|
||||

|
||||
@@ -18,78 +20,92 @@ sudo python main.py
|
||||
|
||||

|
||||
|
||||
## Command line
|
||||
|
||||
|
||||
## Command Line
|
||||
|
||||
git clone https://github.com/casualsnek/waydroid_script
|
||||
cd waydroid_script
|
||||
sudo python3 -m pip install -r requirements.txt
|
||||
# install something
|
||||
sudo python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg}
|
||||
# uninstall something
|
||||
sudo python3 main.py uninstall {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg}
|
||||
# get Android device ID
|
||||
sudo python main.py certified
|
||||
# some hacks
|
||||
sudo python3 hack {nodataperm, hidestatusbar}
|
||||
```bash
|
||||
git clone https://github.com/casualsnek/waydroid_script
|
||||
cd waydroid_script
|
||||
python3 -m venv venv
|
||||
venv/bin/pip install -r requirements.txt
|
||||
# install something
|
||||
sudo venv/bin/python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg, mitm}
|
||||
# uninstall something
|
||||
sudo venv/bin/python3 main.py uninstall {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg}
|
||||
# get Android device ID
|
||||
sudo venv/bin/python3 main.py certified
|
||||
# some hacks
|
||||
sudo venv/bin/python3 main.py hack {nodataperm, hidestatusbar}
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
"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
|
||||
### Debian and Ubuntu based distributions:
|
||||
|
||||
### Debian and Ubuntu-based distributions:
|
||||
|
||||
sudo apt install lzip
|
||||
### RHEL, Fedora and Rocky based distributions:
|
||||
|
||||
### RHEL, Fedora, and Rocky-based distributions:
|
||||
|
||||
sudo dnf install lzip
|
||||
### openSUSE based distributions:
|
||||
|
||||
### openSUSE-based distributions:
|
||||
|
||||
sudo zypper install lzip
|
||||
|
||||
## Install OpenGapps
|
||||
## Install Open GApps
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
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
|
||||
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
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
@@ -97,45 +113,55 @@ houdini version: 11.0.1b_y.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)
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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)
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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
|
||||
@@ -146,18 +172,19 @@ chmod 777 -R /mnt/*/*/*/*/Android/data
|
||||
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
|
||||
|
||||
## Install microG, Aurora Store and Aurora Droid
|
||||
## Install microG, Aurora Store, and Aurora Droid
|
||||
|
||||

|
||||
|
||||
```
|
||||
sudo python main.py install microg
|
||||
sudo venv/bin/python3 main.py install microg
|
||||
```
|
||||
|
||||
## Hide Status Bar
|
||||
## Hide status bar
|
||||
|
||||
Before
|
||||

|
||||
|
||||
@@ -165,29 +192,30 @@ After
|
||||

|
||||
|
||||
```
|
||||
sudo python3 main.py hack hidestatusbar
|
||||
sudo venv/bin/python3 main.py hack hidestatusbar
|
||||
```
|
||||
|
||||
|
||||
## 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:
|
||||
Open terminal and switch to directory where "main.py" is located then run:
|
||||
You need to register your device with its ID before being able to use GApps, this will print out your Android ID, which
|
||||
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
|
||||
|
||||
- Magisk installed: N/A
|
||||
|
||||
Check [waydroid-magisk](https://github.com/nitanmarcel/waydroid-magisk)
|
||||
|
||||
## 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)
|
||||
- [Open GApps](https://opengapps.org)
|
||||
- [Smart Dock](https://github.com/axel358/smartdock)
|
||||
- [wd-scripts](https://github.com/electrikjesus/wd-scripts/)
|
||||
- [wd-scripts](https://github.com/electrikjesus/wd-scripts)
|
||||
|
||||
+22
@@ -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
|
||||
'';
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
from InquirerPy import inquirer
|
||||
from InquirerPy.base.control import Choice
|
||||
from InquirerPy.separator import Separator
|
||||
import argparse
|
||||
import os
|
||||
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.fdroidpriv import FDroidPriv
|
||||
from stuff.gapps import Gapps
|
||||
from stuff.general import General
|
||||
from stuff.hidestatusbar import HideStatusBar
|
||||
from stuff.houdini import Houdini
|
||||
from stuff.magisk import Magisk
|
||||
from stuff.microg import MicroG
|
||||
from stuff.mitm import Mitm
|
||||
from stuff.ndk import Ndk
|
||||
from stuff.nodataperm import Nodataperm
|
||||
from stuff.smartdock import Smartdock
|
||||
from stuff.widevine import Widevine
|
||||
import tools.helper as helper
|
||||
from tools import container
|
||||
from tools import images
|
||||
|
||||
import argparse
|
||||
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ def get_certified(args):
|
||||
|
||||
|
||||
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 = ""
|
||||
if partition == "system":
|
||||
mount_point = os.path.join(copy_dir)
|
||||
@@ -41,9 +41,9 @@ def mount(partition, copy_dir):
|
||||
|
||||
|
||||
def resize(partition):
|
||||
img = os.path.join(images.get_image_dir(), partition+".img")
|
||||
img_size = int(os.path.getsize(img)/(1024*1024))
|
||||
new_size = "{}M".format(img_size+500)
|
||||
img = os.path.join(images.get_image_dir(), partition + ".img")
|
||||
img_size = int(os.path.getsize(img) / (1024 * 1024))
|
||||
new_size = "{}M".format(img_size + 500)
|
||||
Logger.info("Resizing {} to {}".format(img, new_size))
|
||||
images.resize(img, new_size)
|
||||
|
||||
@@ -82,7 +82,11 @@ def install_app(args):
|
||||
if "smartdock" in app:
|
||||
install_list.append(Smartdock())
|
||||
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():
|
||||
copy_dir = "/tmp/waydroid"
|
||||
@@ -130,6 +134,10 @@ def remove_app(args):
|
||||
remove_list.append(Smartdock())
|
||||
if "microg" in app:
|
||||
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:
|
||||
remove_list.append(Nodataperm(args.android_version))
|
||||
if "hidestatusbar" in app:
|
||||
@@ -200,7 +208,7 @@ def interact():
|
||||
Choice(name="Android 13", value="13"),
|
||||
Choice(name="Exit", value=None)
|
||||
],
|
||||
default="11",
|
||||
default="13",
|
||||
).execute()
|
||||
if not android_version:
|
||||
exit()
|
||||
@@ -219,10 +227,9 @@ def interact():
|
||||
if not action:
|
||||
exit()
|
||||
|
||||
install_choices = ["gapps", "microg", "libndk", "magisk", "smartdock",]
|
||||
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv", "widevine",]
|
||||
hack_choices = []
|
||||
if android_version=="11":
|
||||
install_choices.extend(["libhoudini", "widevine"])
|
||||
hack_choices.extend(["nodataperm", "hidestatusbar"])
|
||||
|
||||
if action == "Install":
|
||||
@@ -235,7 +242,7 @@ def interact():
|
||||
).execute()
|
||||
microg_variants = ["Standard", "NoGoolag",
|
||||
"UNLP", "Minimal", "MinimalIAP"]
|
||||
if "MicroG" in apps:
|
||||
if "microg" in apps:
|
||||
microg_variant = inquirer.select(
|
||||
message="Select MicroG variant",
|
||||
choices=microg_variants,
|
||||
@@ -253,7 +260,7 @@ def interact():
|
||||
choices=[*install_choices, *hack_choices]
|
||||
).execute()
|
||||
args.app = apps
|
||||
args.microg_variant="Standard"
|
||||
args.microg_variant = "Standard"
|
||||
remove_app(args)
|
||||
elif action == "Hack":
|
||||
apps = inquirer.checkbox(
|
||||
@@ -270,15 +277,14 @@ def interact():
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='''
|
||||
Does stuff like installing Gapps, installing Magisk, installing NDK Translation and getting Android ID for device registration.
|
||||
Use -h flag for help!''')
|
||||
parser = argparse.ArgumentParser(description='''Does stuff like installing Aapps, 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')
|
||||
parser.add_argument('-a', '--android-version',
|
||||
dest='android_version',
|
||||
help='Specify the Android version',
|
||||
default="11",
|
||||
default="13",
|
||||
choices=["11", "13"])
|
||||
|
||||
# android command
|
||||
@@ -286,8 +292,8 @@ def main():
|
||||
'certified', help='Get device ID to obtain Play Store certification')
|
||||
certified.set_defaults(func=get_certified)
|
||||
|
||||
install_choices = ["gapps", "microg", "libndk",
|
||||
"libhoudini", "magisk", "smartdock", "widevine"]
|
||||
install_choices = ["gapps", "microg", "libndk", "libhoudini",
|
||||
"magisk", "mitm", "smartdock", "widevine"]
|
||||
hack_choices = ["nodataperm", "hidestatusbar"]
|
||||
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
|
||||
remove_choices = install_choices
|
||||
@@ -301,10 +307,11 @@ def main():
|
||||
|
||||
install_help = """
|
||||
gapps: Install Open GApps (Android 11) or MindTheGapps (Android 13)
|
||||
microg: Add microG, Aurora Store and Aurora Droid to WayDriod
|
||||
libndk: Add libndk arm translation, better for AMD CPUs
|
||||
libhoudini: Add libhoudini arm translation, better for Intel CPUs
|
||||
magisk: Install Magisk Delta to WayDroid
|
||||
microg: Add microG, Aurora Store, and Aurora Droid to WayDroid
|
||||
libndk: Add libndk ARM translation, better for AMD CPUs
|
||||
libhoudini: Add libhoudini ARM translation, better for Intel CPUs
|
||||
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
|
||||
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_parser.add_argument(
|
||||
**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)
|
||||
|
||||
# remove and its aliases
|
||||
remove_parser = subparsers.add_parser(
|
||||
'remove', aliases=["uninstall"], help='Remove an app')
|
||||
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)
|
||||
|
||||
# hack and its aliases
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@ from tools.logger import Logger
|
||||
|
||||
|
||||
class AndroidId:
|
||||
def get_id(self):
|
||||
def get_id(self):
|
||||
if container.is_running():
|
||||
try:
|
||||
queryout = shell(
|
||||
@@ -14,7 +14,7 @@ class AndroidId:
|
||||
except:
|
||||
return
|
||||
else:
|
||||
Logger.error("WayDroid isn't running !")
|
||||
Logger.error("Please make sure Waydroid is running and Gapps has been installed!")
|
||||
return
|
||||
print(queryout.replace("android_id|", "").strip())
|
||||
print(" ^----- Open https://google.com/android/uncertified/?pli=1")
|
||||
|
||||
@@ -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)
|
||||
+33
-13
@@ -1,5 +1,6 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
from tools.helper import run
|
||||
|
||||
@@ -9,16 +10,32 @@ class Gapps(General):
|
||||
partition = "system"
|
||||
dl_links = {
|
||||
"11": {
|
||||
"x86_64": ["https://sourceforge.net/projects/opengapps/files/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip", "5a6d242be34ad1acf92899c7732afa1b"],
|
||||
"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"]
|
||||
"x86_64": [
|
||||
"https://sourceforge.net/projects/opengapps/files/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip",
|
||||
"5a6d242be34ad1acf92899c7732afa1b"],
|
||||
"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": {
|
||||
"x86_64": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-x86_64-20230323.zip", "aba427be1ddd0963121c87a4eda80299"],
|
||||
"x86": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-x86-20230323.zip", "f02d2f1a3f0a084f13ab4c1b58ad7554"],
|
||||
"arm64-v8a": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-arm64-20230323.zip", "18484a5622eeccffcea2b43205655d8a"],
|
||||
"armeabi-v7a": ["https://github.com/Howard20181/MindTheGappsBuilder/releases/download/20230323/MindTheGapps-13.0.0-arm-20230323.zip", "e4c00a7eb1e4dfca0fc6a3e447710264"]
|
||||
"x86_64": [
|
||||
"https://github.com/s1204IT/MindTheGappsBuilder/releases/download/20231028/MindTheGapps-13.0.0-x86_64-20231028.zip",
|
||||
"63ccebbf93d45c384f58d7c40049d398"],
|
||||
"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 = ...
|
||||
@@ -124,7 +141,8 @@ class Gapps(General):
|
||||
print(" Processing app package : " +
|
||||
os.path.join(self.extract_to, "Core", lz_file))
|
||||
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(
|
||||
self.extract_to, "appunpack"))[0]
|
||||
xx_dpi = os.listdir(os.path.join(
|
||||
@@ -145,14 +163,16 @@ class Gapps(General):
|
||||
print(" Processing extra package : " +
|
||||
os.path.join(self.extract_to, "Core", lz_file))
|
||||
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(
|
||||
self.extract_to, "appunpack"))[0]
|
||||
common_content_dirs = os.listdir(os.path.join(
|
||||
self.extract_to, "appunpack", app_name, "common"))
|
||||
for ccdir in common_content_dirs:
|
||||
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)
|
||||
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)
|
||||
|
||||
def copy_13(self):
|
||||
src_dir = os.path.join(self.extract_to, "system")
|
||||
@@ -163,7 +183,7 @@ class Gapps(General):
|
||||
for file in files:
|
||||
src_file_path = os.path.join(root, file)
|
||||
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)):
|
||||
os.makedirs(os.path.dirname(dst_file_path))
|
||||
# Logger.info(f"{src_file_path} -> {dst_file_path}")
|
||||
|
||||
+5
-4
@@ -1,11 +1,12 @@
|
||||
import configparser
|
||||
import glob
|
||||
import hashlib
|
||||
import os
|
||||
import shutil
|
||||
import zipfile
|
||||
import hashlib
|
||||
from tools.helper import download_file, get_download_dir, host
|
||||
|
||||
from tools import container
|
||||
from tools.helper import download_file, get_download_dir, host
|
||||
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.exists(bin_dir):
|
||||
os.makedirs(bin_dir)
|
||||
shutil.copy(os.path.join(
|
||||
"./bin", self.arch[0], "resetprop"), bin_dir)
|
||||
shutil.copy(os.path.join(os.path.join(os.path.dirname(__file__), "..", "bin",
|
||||
self.arch[0], "resetprop")), bin_dir)
|
||||
os.chmod(os.path.join(bin_dir, "resetprop"), 0o755)
|
||||
if not os.path.isfile(os.path.join(bin_dir, "resetprop.sh")):
|
||||
with open(os.path.join(bin_dir, "resetprop.sh"), "w") as f:
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
|
||||
|
||||
class HideStatusBar(General):
|
||||
id = "hide status bar"
|
||||
dl_links = {"11": ["https://github.com/ayasa520/hide-status-bar/releases/download/v0.0.1/app-release.apk",
|
||||
"ae6c4cc567d6f3de77068e54e43818e2"]}
|
||||
dl_links = {"11": ["https://github.com/ayasa520/hide-status-bar/releases/download/v0.0.2/app-release.apk",
|
||||
"ff2fe63ddfb4b035e6720a1b195b2355"]}
|
||||
partition = "system"
|
||||
dl_file_name = "hidestatusbar.apk"
|
||||
dl_link = ...
|
||||
act_md5 = ...
|
||||
files = [
|
||||
"product/overlay/"+dl_file_name
|
||||
"product/overlay/" + dl_file_name
|
||||
]
|
||||
|
||||
def __init__(self, android_version="11") -> None:
|
||||
super().__init__()
|
||||
self.dl_link = self.dl_links[android_version][0]
|
||||
|
||||
+4
-3
@@ -1,6 +1,7 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
@@ -10,7 +11,7 @@ class Houdini(General):
|
||||
partition = "system"
|
||||
dl_links = {
|
||||
"11": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/81f2a51ef539a35aead396ab7fce2adf89f46e88.zip", "fbff756612b4144797fbc99eadcb6653"],
|
||||
# "13": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/978d8cba061a08837b7e520cd03b635af643ba08.zip", "1e139054c05034648fae58a1810573b4"]
|
||||
"13": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/7e21ea3f63bd89e9e8af54e32da41bd8b65c93a1.zip", "f8cf5db10e5fdb9b77e98e515a9b08c9"]
|
||||
}
|
||||
act_md5 = ...
|
||||
dl_link = ...
|
||||
@@ -18,7 +19,7 @@ class Houdini(General):
|
||||
extract_to = "/tmp/houdiniunpack"
|
||||
init_rc_component = """
|
||||
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
|
||||
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"
|
||||
@@ -57,7 +58,7 @@ on property:ro.enable.native.bridge.exec=1
|
||||
Logger.info("Copying libhoudini library files ...")
|
||||
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,
|
||||
"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(
|
||||
self.copy_dir, self.partition, "etc", "init", "houdini.rc")
|
||||
if not os.path.isfile(init_path):
|
||||
|
||||
+31
-30
@@ -1,16 +1,18 @@
|
||||
import gzip
|
||||
import os
|
||||
import shutil
|
||||
import re
|
||||
import shutil
|
||||
|
||||
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.helper import download_file, get_data_dir
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class Magisk(General):
|
||||
id = "magisk delta"
|
||||
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"
|
||||
extract_to = "/tmp/magisk_unpack"
|
||||
magisk_dir = os.path.join(partition, "etc", "init", "magisk")
|
||||
@@ -29,30 +31,28 @@ service bootanim /system/bin/bootanimation
|
||||
bootanim_component = f"""
|
||||
on post-fs-data
|
||||
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 "allow * magisk_file lnk_file *"
|
||||
mkdir /sbin/.magisk 700
|
||||
mkdir /sbin/.magisk/mirror 700
|
||||
mkdir /sbin/.magisk/block 700
|
||||
copy /system/etc/init/magisk/config /sbin/.magisk/config
|
||||
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
|
||||
exec u:r:su:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
|
||||
exec u:r:magisk:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
|
||||
exec u:r:update_engine:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk
|
||||
mkdir /dev/magisk_iqeoVo2mDrO 700
|
||||
exec u:r:su:s0 root root -- /system/etc/init/magisk/magisk64 --auto-selinux --setup-sbin /system/etc/init/magisk /dev/magisk_iqeoVo2mDrO
|
||||
exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --post-fs-data
|
||||
|
||||
on zygote-start
|
||||
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --service
|
||||
on nonencrypted
|
||||
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
|
||||
mkdir /data/adb/magisk 755
|
||||
exec u:r:su:s0 root root -- /sbin/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"
|
||||
exec u:r:su:s0 root root -- /dev/magisk_iqeoVo2mDrO/magisk --auto-selinux --boot-complete
|
||||
|
||||
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
|
||||
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):
|
||||
@@ -77,16 +77,17 @@ on property:init.svc.zygote=stopped
|
||||
os.makedirs(os.path.join(self.copy_dir, "sbin"), exist_ok=True)
|
||||
|
||||
Logger.info("Copying magisk libs now ...")
|
||||
|
||||
|
||||
lib_dir = os.path.join(self.extract_to, "lib", self.arch[0])
|
||||
for parent, dirnames, filenames in os.walk(lib_dir):
|
||||
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)
|
||||
n_path = os.path.join(magisk_absolute_dir, filename.group(1))
|
||||
shutil.copyfile(o_path, n_path)
|
||||
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.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)
|
||||
assets_files = [
|
||||
"addon.d.sh",
|
||||
"boot_patch.sh",
|
||||
@@ -99,11 +100,11 @@ on property:init.svc.zygote=stopped
|
||||
# Updating Magisk from Magisk manager will modify 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")
|
||||
gz_filename = os.path.join(bootanim_path)+".gz"
|
||||
with gzip.open(gz_filename,'wb') as f_gz:
|
||||
gz_filename = os.path.join(bootanim_path) + ".gz"
|
||||
with gzip.open(gz_filename, 'wb') as f_gz:
|
||||
f_gz.write(self.oringinal_bootanim.encode('utf-8'))
|
||||
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):
|
||||
if "magisk" in path.split("/"):
|
||||
@@ -124,7 +125,7 @@ on property:init.svc.zygote=stopped
|
||||
def extra1(self):
|
||||
self.delete_upper()
|
||||
self.setup()
|
||||
|
||||
|
||||
# Delete the contents of upperdir
|
||||
def delete_upper(self):
|
||||
if container.use_overlayfs():
|
||||
@@ -132,7 +133,7 @@ on property:init.svc.zygote=stopped
|
||||
files = [
|
||||
"system/system/etc/init/bootanim.rc",
|
||||
"system/system/etc/init/bootanim.rc.gz",
|
||||
"system/system/etc/init/magisk",
|
||||
"system/system/etc/init/magisk",
|
||||
"system/system/addon.d/99-magisk.sh",
|
||||
"vendor/etc/selinux/precompiled_sepolicy"
|
||||
]
|
||||
@@ -143,7 +144,7 @@ on property:init.svc.zygote=stopped
|
||||
shutil.rmtree(file)
|
||||
elif os.path.isfile(file) or os.path.exists(file):
|
||||
os.remove(file)
|
||||
|
||||
|
||||
def extra2(self):
|
||||
self.delete_upper()
|
||||
data_dir = get_data_dir()
|
||||
|
||||
+6
-4
@@ -1,5 +1,6 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
@@ -15,7 +16,7 @@ class MicroG(General):
|
||||
"org.microg.nlp.backend.ichnaea_20036.apk": "0b3cb65f8458d1a5802737c7392df903",
|
||||
"org.microg.nlp.backend.nominatim_20042.apk": "88e7397cbb9e5c71c8687d3681a23383",
|
||||
}
|
||||
microg_apks= {
|
||||
microg_apks = {
|
||||
"com.google.android.gms-223616054.apk": "a945481ca5d33a03bc0f9418263c3228",
|
||||
"com.google.android.gsf-8.apk": "b2b4ea3642df6158e14689a4b2a246d4",
|
||||
"com.android.vending-22.apk": "6815d191433ffcd8fa65923d5b0b0573",
|
||||
@@ -107,7 +108,7 @@ service microg_service /system/bin/sh /system/bin/npem
|
||||
super().__init__()
|
||||
self.dl_link = self.dl_links[variant][0]
|
||||
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'
|
||||
if android_version == "11":
|
||||
self.sdk = 30
|
||||
@@ -123,7 +124,7 @@ service microg_service /system/bin/sh /system/bin/npem
|
||||
else:
|
||||
sub_arch = "x86"
|
||||
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):
|
||||
flag = False
|
||||
dir_name = os.path.basename(root)
|
||||
@@ -135,7 +136,8 @@ service microg_service /system/bin/sh /system/bin/npem
|
||||
sdks.append(i)
|
||||
elif 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
|
||||
else:
|
||||
flag = True
|
||||
|
||||
@@ -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()
|
||||
+18
-16
@@ -1,20 +1,22 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class Ndk(General):
|
||||
id = "libndk"
|
||||
partition = "system"
|
||||
dl_links = {
|
||||
"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"
|
||||
extract_to = "/tmp/libndkunpack"
|
||||
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.abilist64": "x86_64,arm64-v8a",
|
||||
"ro.dalvik.vm.native.bridge": "libndk_translation.so",
|
||||
@@ -26,19 +28,19 @@ class Ndk(General):
|
||||
"ro.dalvik.vm.isa.arm64": "x86_64"
|
||||
}
|
||||
files = [
|
||||
"bin/arm",
|
||||
"bin/arm64",
|
||||
"bin/ndk_translation_program_runner_binfmt_misc",
|
||||
"bin/ndk_translation_program_runner_binfmt_misc_arm64",
|
||||
"etc/binfmt_misc",
|
||||
"etc/ld.config.arm.txt",
|
||||
"etc/ld.config.arm64.txt",
|
||||
"etc/init/ndk_translation.rc",
|
||||
"lib/arm",
|
||||
"lib64/arm64",
|
||||
"lib/libndk*",
|
||||
"lib64/libndk*"
|
||||
]
|
||||
"bin/arm",
|
||||
"bin/arm64",
|
||||
"bin/ndk_translation_program_runner_binfmt_misc",
|
||||
"bin/ndk_translation_program_runner_binfmt_misc_arm64",
|
||||
"etc/binfmt_misc",
|
||||
"etc/ld.config.arm.txt",
|
||||
"etc/ld.config.arm64.txt",
|
||||
"etc/init/ndk_translation.rc",
|
||||
"lib/arm",
|
||||
"lib64/arm64",
|
||||
"lib/libndk*",
|
||||
"lib64/libndk*"
|
||||
]
|
||||
|
||||
def __init__(self, android_version="11") -> None:
|
||||
super().__init__()
|
||||
@@ -49,4 +51,4 @@ class Ndk(General):
|
||||
Logger.info("Copying libndk library files ...")
|
||||
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
|
||||
shutil.copytree(os.path.join(self.extract_to, "vendor_google_proprietary_ndk_translation-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)
|
||||
|
||||
+37
-18
@@ -1,17 +1,24 @@
|
||||
import gzip
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
from tools import container
|
||||
from tools.helper import backup, restore
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class Nodataperm(General):
|
||||
id = "nodataperm"
|
||||
dl_links = {
|
||||
"11": ["https://github.com/ayasa520/hack_full_data_permission/archive/refs/heads/main.zip",
|
||||
"eafd7b0986f3edaebaf1dd89f19d49bf"],
|
||||
"13": ["", ""]
|
||||
"11":
|
||||
{
|
||||
"x86_64": [
|
||||
"https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip",
|
||||
"b0e3908ffcf5df8ea62f4929aa680f1a"
|
||||
],
|
||||
},
|
||||
"13": {}
|
||||
}
|
||||
dl_file_name = "nodataperm.zip"
|
||||
extract_to = "/tmp/nodataperm"
|
||||
@@ -21,25 +28,34 @@ class Nodataperm(General):
|
||||
files = [
|
||||
"etc/nodataperm.sh",
|
||||
"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:
|
||||
super().__init__()
|
||||
self.dl_link = self.dl_links[android_version][0]
|
||||
self.act_md5 = self.dl_links[android_version][1]
|
||||
print("ok")
|
||||
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):
|
||||
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
|
||||
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():
|
||||
services_jar = os.path.join(
|
||||
self.copy_dir, self.partition, "framework", "services.jar")
|
||||
gz_filename = services_jar+".gz"
|
||||
with gzip.open(gz_filename, 'wb') as f_gz:
|
||||
with open(services_jar, "rb") as f:
|
||||
f_gz.write(f.read())
|
||||
Logger.info("Copying widevine library files ...")
|
||||
services_jar_prof = os.path.join(
|
||||
self.copy_dir, self.partition, "framework", "services.jar.prof")
|
||||
services_jar_bprof = os.path.join(
|
||||
self.copy_dir, self.partition, "framework", "services.jar.bprof")
|
||||
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(
|
||||
self.copy_dir, self.partition), dirs_exist_ok=True)
|
||||
|
||||
@@ -47,7 +63,10 @@ class Nodataperm(General):
|
||||
if not container.use_overlayfs():
|
||||
services_jar = os.path.join(
|
||||
self.copy_dir, self.partition, "framework", "services.jar")
|
||||
gz_filename = services_jar+".gz"
|
||||
with gzip.GzipFile(gz_filename) as f_gz:
|
||||
with open(services_jar, "wb") as f:
|
||||
f.writelines(f_gz)
|
||||
services_jar_prof = os.path.join(
|
||||
self.copy_dir, self.partition, "framework", "services.jar.prof")
|
||||
services_jar_bprof = os.path.join(
|
||||
self.copy_dir, self.partition, "framework", "services.jar.bprof")
|
||||
restore(services_jar)
|
||||
restore(services_jar_prof)
|
||||
restore(services_jar_bprof)
|
||||
|
||||
+13
-9
@@ -1,14 +1,16 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
|
||||
|
||||
class Smartdock(General):
|
||||
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"
|
||||
dl_file_name = "smartdock.apk"
|
||||
act_md5 = "a8ce0bca5e1772796404602e0fa250a4"
|
||||
apply_props = { "qemu.hw.mainkeys" : "1" }
|
||||
act_md5 = "f4087d34218eac902a5cca98ee03d215"
|
||||
apply_props = {"qemu.hw.mainkeys": "1"}
|
||||
skip_extract = True
|
||||
permissions = """<?xml version="1.0" encoding="utf-8"?>
|
||||
<permissions>
|
||||
@@ -34,10 +36,10 @@ class Smartdock(General):
|
||||
</permissions>
|
||||
"""
|
||||
files = [
|
||||
"etc/permissions/permissions_cu.axel.smartdock.xml",
|
||||
"priv-app/SmartDock",
|
||||
"etc/init/smartdock.rc"
|
||||
]
|
||||
"etc/permissions/permissions_cu.axel.smartdock.xml",
|
||||
"priv-app/SmartDock",
|
||||
"etc/init/smartdock.rc"
|
||||
]
|
||||
rc_content = '''
|
||||
on property:sys.boot_completed=1
|
||||
start set_home_activity
|
||||
@@ -55,8 +57,10 @@ 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"))
|
||||
shutil.copyfile(os.path.join(self.download_loc),
|
||||
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)
|
||||
|
||||
rc_dir = os.path.join(self.copy_dir, self.partition, "etc/init/smartdock.rc")
|
||||
|
||||
+17
-4
@@ -1,6 +1,7 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
@@ -13,13 +14,14 @@ class Widevine(General):
|
||||
"x86_64": {
|
||||
"11": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/48d1076a570837be6cdce8252d5d143363e37cc1.zip",
|
||||
"f587b8859f9071da4bca6cea1b9bed6a"],
|
||||
"13": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a8524d608431573ef1c9313822d271f78728f9a6.zip",
|
||||
"5c55df61da5c012b4e43746547ab730f"]
|
||||
"13": ["https://github.com/WayDroid-ATV/vendor_google_proprietary_widevine-prebuilt/archive/679552343d8b2e8d7a19b6df61c7a03963d0c75b.zip",
|
||||
"80ab79ea85c7b2556baedb371a54e01c"]
|
||||
},
|
||||
# "armeabi-v7a": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip", "fed6898b5cfd2a908cb134df97802554"],
|
||||
"arm64-v8a": {
|
||||
"11": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip",
|
||||
"fed6898b5cfd2a908cb134df97802554"]
|
||||
"11": [
|
||||
"https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/a1a19361d36311bee042da8cf4ced798d2c76d98.zip",
|
||||
"fed6898b5cfd2a908cb134df97802554"]
|
||||
}
|
||||
}
|
||||
dl_file_name = "widevine.zip"
|
||||
@@ -30,7 +32,10 @@ class Widevine(General):
|
||||
"etc/init/*widevine.rc",
|
||||
"etc/vintf/manifest/*widevine.xml",
|
||||
"lib/libwvhidl.so",
|
||||
"lib/libwvaidl.so",
|
||||
"lib/mediadrm",
|
||||
"lib64/libwvhidl.so",
|
||||
"lib64/libwvaidl.so",
|
||||
"lib64/mediadrm"
|
||||
]
|
||||
|
||||
@@ -38,9 +43,17 @@ class Widevine(General):
|
||||
super().__init__()
|
||||
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.android_version = android_version
|
||||
self.libdir = "lib64" if self.arch[1] == 64 else "lib"
|
||||
|
||||
def copy(self):
|
||||
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
|
||||
Logger.info("Copying widevine library files ...")
|
||||
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)
|
||||
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
|
||||
|
||||
+7
-4
@@ -1,10 +1,12 @@
|
||||
import configparser
|
||||
import os
|
||||
import sys
|
||||
|
||||
# import dbus
|
||||
from tools.helper import run
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
# def DBusContainerService(object_path="/ContainerManager", intf="id.waydro.ContainerManager"):
|
||||
# return dbus.Interface(dbus.SystemBus().get_object("id.waydro.Container", object_path), intf)
|
||||
|
||||
@@ -29,7 +31,7 @@ def use_overlayfs():
|
||||
Logger.error("Required entry in config was not found, Cannot continue!")
|
||||
if "mount_overlays" not in cfg["waydroid"]:
|
||||
return False
|
||||
if cfg["waydroid"]["mount_overlays"]=="True":
|
||||
if cfg["waydroid"]["mount_overlays"] == "True":
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -43,11 +45,12 @@ def stop():
|
||||
# if session:
|
||||
# DBusContainerService().Stop(False)
|
||||
# else:
|
||||
run(["waydroid", "container", "stop"])
|
||||
run(["waydroid", "container", "stop"])
|
||||
|
||||
|
||||
def is_running():
|
||||
return "Session:\tRUNNING" in run(["waydroid", "status"]).stdout.decode()
|
||||
return "Session:\tRUNNING" in run(["waydroid", "status"]).stdout.decode()
|
||||
|
||||
|
||||
def upgrade():
|
||||
run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
|
||||
run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
|
||||
|
||||
+35
-12
@@ -1,22 +1,24 @@
|
||||
import gzip
|
||||
import hashlib
|
||||
import os
|
||||
import re
|
||||
import platform
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import requests
|
||||
from tools.logger import Logger
|
||||
from tqdm import tqdm
|
||||
import hashlib
|
||||
from typing import Optional
|
||||
|
||||
import requests
|
||||
from tqdm import tqdm
|
||||
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
def get_download_dir():
|
||||
download_loc = ""
|
||||
if os.environ.get("XDG_CACHE_HOME", None) is None:
|
||||
download_loc = os.path.join('/', "home", os.environ.get(
|
||||
"SUDO_USER", os.environ["USER"]), ".cache", "waydroid-script", "downloads"
|
||||
)
|
||||
)
|
||||
else:
|
||||
download_loc = os.path.join(
|
||||
os.environ["XDG_CACHE_HOME"], "waydroid-script", "downloads"
|
||||
@@ -25,16 +27,19 @@ def get_download_dir():
|
||||
os.makedirs(download_loc)
|
||||
return download_loc
|
||||
|
||||
|
||||
# not good
|
||||
def get_data_dir():
|
||||
return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", "data")
|
||||
return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid",
|
||||
"data")
|
||||
|
||||
|
||||
# execute on host
|
||||
def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
|
||||
result = subprocess.run(
|
||||
args=args,
|
||||
env=env,
|
||||
stdout=subprocess.PIPE,
|
||||
args=args,
|
||||
env=env,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE
|
||||
)
|
||||
|
||||
@@ -51,6 +56,7 @@ def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None):
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
# execute on waydroid shell
|
||||
def shell(arg: str, env: Optional[str] = None):
|
||||
a = subprocess.Popen(
|
||||
@@ -60,7 +66,8 @@ def shell(arg: str, env: Optional[str] = None):
|
||||
stderr=subprocess.PIPE
|
||||
)
|
||||
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,
|
||||
stdin=subprocess.PIPE
|
||||
).communicate()
|
||||
@@ -88,6 +95,7 @@ def shell(arg: str, env: Optional[str] = None):
|
||||
)
|
||||
return a.stdout.read().decode("utf-8")
|
||||
|
||||
|
||||
def download_file(url, f_name):
|
||||
md5 = ""
|
||||
response = requests.get(url, stream=True)
|
||||
@@ -106,6 +114,7 @@ def download_file(url, f_name):
|
||||
raise ValueError("Something went wrong while downloading")
|
||||
return md5
|
||||
|
||||
|
||||
def host():
|
||||
machine = platform.machine()
|
||||
|
||||
@@ -124,10 +133,24 @@ def host():
|
||||
return ("x86", 32)
|
||||
return mapping[machine]
|
||||
raise ValueError("platform.machine '" + machine + "'"
|
||||
" architecture is not supported")
|
||||
" architecture is not supported")
|
||||
|
||||
|
||||
def check_root():
|
||||
if os.geteuid() != 0:
|
||||
Logger.error("This script must be run as root. Aborting.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def backup(path):
|
||||
gz_filename = path + ".gz"
|
||||
with gzip.open(gz_filename, 'wb') as f_gz:
|
||||
with open(path, "rb") as f:
|
||||
f_gz.write(f.read())
|
||||
|
||||
|
||||
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
@@ -1,16 +1,18 @@
|
||||
import configparser
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from tools.helper import run
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
def mount(image, mount_point):
|
||||
umount(mount_point, False)
|
||||
if not os.path.exists(mount_point):
|
||||
os.makedirs(mount_point)
|
||||
run(["mount", "-o", "rw", image, mount_point])
|
||||
|
||||
|
||||
def umount(mount_point, exists=True):
|
||||
if not os.path.exists(mount_point):
|
||||
if not exists:
|
||||
@@ -23,10 +25,12 @@ def umount(mount_point, exists=True):
|
||||
Logger.warning("{} is not a mount point".format(
|
||||
mount_point))
|
||||
|
||||
|
||||
def resize(img_file, size):
|
||||
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$")
|
||||
|
||||
|
||||
def get_image_dir():
|
||||
# Read waydroid config to get image location
|
||||
cfg = configparser.ConfigParser()
|
||||
@@ -36,6 +40,6 @@ def get_image_dir():
|
||||
sys.exit(1)
|
||||
cfg.read(cfg_file)
|
||||
if "waydroid" not in cfg:
|
||||
Logger.error("Required entry in config was not found, Cannot continue!") #magisk
|
||||
Logger.error("Required entry in config was not found, Cannot continue!") # magisk
|
||||
sys.exit(1)
|
||||
return cfg["waydroid"]["images_path"]
|
||||
|
||||
+3
-3
@@ -2,12 +2,12 @@ class Logger:
|
||||
|
||||
@staticmethod
|
||||
def error(str):
|
||||
print("\033[31m"+"ERROR: "+str+"\033[0m")
|
||||
print("\033[31m" + "ERROR: " + str + "\033[0m")
|
||||
|
||||
@staticmethod
|
||||
def info(str):
|
||||
print("\033[32m"+"INFO: "+"\033[0m"+str)
|
||||
print("\033[32m" + "INFO: " + "\033[0m" + str)
|
||||
|
||||
@staticmethod
|
||||
def warning(str):
|
||||
print("\033[33m"+"WARN: "+str+"\033[0m")
|
||||
print("\033[33m" + "WARN: " + str + "\033[0m")
|
||||
|
||||
Reference in New Issue
Block a user