Make InquirerPy module optional #179
@@ -7,27 +7,26 @@ Script to add GApps and other stuff to Waydroid!
|
||||
## Interactive terminal interface
|
||||
|
||||
```
|
||||
git clone https://github.com/casualsnek/waydroid_script
|
||||
git clone --depth 1 --single-branch https://github.com/huakim/waydroid_script
|
||||
cd waydroid_script
|
||||
python3 -m venv venv
|
||||
venv/bin/pip install -r requirements.txt
|
||||
sudo venv/bin/python3 main.py
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
## Command Line
|
||||
|
||||
```bash
|
||||
git clone https://github.com/casualsnek/waydroid_script
|
||||
git clone --depth 1 --single-branch https://github.com/huakim/waydroid_script
|
||||
cd waydroid_script
|
||||
python3 -m venv venv
|
||||
venv/bin/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}
|
||||
@@ -42,18 +41,18 @@ 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:
|
||||
### openSUSE, Gecko based distributions:
|
||||
sudo zypper install lzip
|
||||
### RHEL, Fedora and Rocky based distributions:
|
||||
sudo dnf install lzip
|
||||
### Arch, Manjaro and EndeavourOS based distributions:
|
||||
sudo pacman -S lzip
|
||||
### Debian and Ubuntu based distributions:
|
||||
sudo apt install lzip
|
||||
### RHEL, Fedora and Rocky based distributions:
|
||||
sudo dnf install lzip
|
||||
### openSUSE based distributions:
|
||||
sudo zypper install lzip
|
||||
|
||||
## Install OpenGapps
|
||||
|
||||

|
||||

|
||||
|
||||
Open terminal and switch to the directory where "main.py" is located then run:
|
||||
|
||||
@@ -65,13 +64,13 @@ Then launch waydroid with:
|
||||
|
||||
After waydroid has finished booting, open terminal and switch to directory where "main.py" is located then run:
|
||||
|
||||
sudo python3 main.py google
|
||||
sudo venv/bin/python3 main.py certified
|
||||
Copy the returned numeric ID, then open ["https://google.com/android/uncertified/?pli=1"](https://google.com/android/uncertified/?pli=1). Enter the ID and register it. Wait 10-20 minutes for device to get registered. Then clear Google Play Service's cache and try logging in!
|
||||
|
||||
|
||||
## Install Magisk
|
||||
|
||||

|
||||

|
||||
|
||||
Open terminal and switch to directory where "main.py" is located then run:
|
||||
|
||||
@@ -81,7 +80,7 @@ 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
|
||||
|
||||
@@ -109,7 +108,7 @@ Open terminal and switch to directory where "main.py" is located then run:
|
||||
|
||||
## Integrate Widevine DRM (L3)
|
||||
|
||||

|
||||

|
||||
|
||||
Open terminal and switch to directory where "main.py" is located then run:
|
||||
|
||||
@@ -117,8 +116,8 @@ Open terminal and switch to directory where "main.py" is located then run:
|
||||
|
||||
## Install Smart Dock
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Open terminal and switch to directory where "main.py" is located then run:
|
||||
|
||||
@@ -137,7 +136,7 @@ This is a temporary hack to combat against the apps permission issue on Android
|
||||
|
||||
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:
|
||||
|
||||
@@ -163,7 +162,7 @@ chmod 777 -R /mnt/*/*/*/*/Android/obb
|
||||
|
||||
## Install microG, Aurora Store and Aurora Droid
|
||||
|
||||

|
||||

|
||||
|
||||
```
|
||||
sudo venv/bin/python3 main.py install microg
|
||||
@@ -171,10 +170,10 @@ sudo venv/bin/python3 main.py install microg
|
||||
|
||||
## Hide Status Bar
|
||||
Before
|
||||

|
||||

|
||||
|
||||
After
|
||||

|
||||

|
||||
|
||||
```
|
||||
sudo venv/bin/python3 main.py hack hidestatusbar
|
||||
@@ -186,7 +185,7 @@ sudo venv/bin/python3 main.py hack hidestatusbar
|
||||
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:
|
||||
|
||||
sudo venv/bin/python3 main.py certified
|
||||
sudo python3 main.py certified
|
||||
|
||||
Star this repository if you find this useful, if you encounter problem create an issue on GitHub!
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 321 KiB |
|
Before Width: | Height: | Size: 348 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 590 KiB |
|
Before Width: | Height: | Size: 665 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 43 KiB |
@@ -1,22 +1,4 @@
|
||||
with (import <nixpkgs> {});
|
||||
|
||||
stdenv.mkDerivation {
|
||||
name = "waydroid_script";
|
||||
|
||||
buildInputs = [
|
||||
(python3.withPackages(ps: with ps; [ tqdm requests inquirerpy ]))
|
||||
];
|
||||
|
||||
src = ./.;
|
||||
|
||||
postPatch = ''
|
||||
patchShebangs main.py
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/libexec
|
||||
cp -r . $out/libexec/waydroid_script
|
||||
mkdir -p $out/bin
|
||||
ln -s $out/libexec/waydroid_script/main.py $out/bin/waydroid_script
|
||||
'';
|
||||
}
|
||||
let
|
||||
pkgs = import <nixpkgs> {};
|
||||
in
|
||||
pkgs.callPackage ./package.nix { }
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1707650010,
|
||||
"narHash": "sha256-dOhphIA4MGrH4ElNCy/OlwmN24MsnEqFjRR6+RY7jZw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "809cca784b9f72a5ad4b991e0e7bcf8890f9c3a6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs",
|
||||
"systems": "systems"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
description = "Waydroid Extras Script";
|
||||
inputs = {
|
||||
systems.url = "github:nix-systems/default";
|
||||
};
|
||||
outputs = { self, nixpkgs, systems }:
|
||||
let
|
||||
inherit (nixpkgs) lib;
|
||||
eachSystem = lib.genAttrs (import systems);
|
||||
mkApp = program: { type = "app"; inherit program; };
|
||||
in {
|
||||
packages = eachSystem (system: rec {
|
||||
waydroid_script = nixpkgs.legacyPackages."${system}".callPackage ./package.nix { };
|
||||
default = waydroid_script;
|
||||
});
|
||||
apps = eachSystem (system: rec {
|
||||
waydroid_script = mkApp "${self.outputs.packages.${system}.waydroid_script}/bin/waydroid_script";
|
||||
default = waydroid_script;
|
||||
});
|
||||
};
|
||||
}
|
||||
@@ -1,7 +1,10 @@
|
||||
#!/usr/bin/env python3
|
||||
from InquirerPy import inquirer
|
||||
from InquirerPy.base.control import Choice
|
||||
from InquirerPy.separator import Separator
|
||||
try:
|
||||
from InquirerPy import inquirer
|
||||
from InquirerPy.base.control import Choice
|
||||
from InquirerPy.separator import Separator
|
||||
except ModuleNotFoundError:
|
||||
inquirer = None
|
||||
import argparse
|
||||
import os
|
||||
from typing import List
|
||||
@@ -18,48 +21,33 @@ from stuff.nodataperm import Nodataperm
|
||||
from stuff.smartdock import Smartdock
|
||||
from stuff.widevine import Widevine
|
||||
from stuff.fdroidpriv import FDroidPriv
|
||||
from stuff.gps import GPS
|
||||
import tools.helper as helper
|
||||
from tools import container
|
||||
from tools import images
|
||||
|
||||
import argparse
|
||||
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
def get_certified(args):
|
||||
def get_certified():
|
||||
AndroidId().get_id()
|
||||
|
||||
|
||||
def mount(partition, copy_dir):
|
||||
img = os.path.join(images.get_image_dir(), partition+".img")
|
||||
mount_point = ""
|
||||
if partition == "system":
|
||||
mount_point = os.path.join(copy_dir)
|
||||
else:
|
||||
mount_point = os.path.join(copy_dir, partition)
|
||||
Logger.info("Mounting {} to {}".format(img, mount_point))
|
||||
img = os.path.join(images.get_image_dir(), f"{partition}.img")
|
||||
mount_point = os.path.join(copy_dir) if partition == "system" else os.path.join(copy_dir, partition)
|
||||
Logger.info(f"Mounting {img} to {mount_point}")
|
||||
images.mount(img, mount_point)
|
||||
|
||||
|
||||
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)
|
||||
Logger.info("Resizing {} to {}".format(img, new_size))
|
||||
img = os.path.join(images.get_image_dir(), f"{partition}.img")
|
||||
img_size = int(os.path.getsize(img) / (1024 * 1024))
|
||||
new_size = f"{img_size + 500}M"
|
||||
Logger.info(f"Resizing {img} to {new_size}")
|
||||
images.resize(img, new_size)
|
||||
|
||||
|
||||
def umount(partition, copy_dir):
|
||||
mount_point = ""
|
||||
if partition == "system":
|
||||
mount_point = os.path.join(copy_dir)
|
||||
else:
|
||||
mount_point = os.path.join(copy_dir, partition)
|
||||
Logger.info("Umounting {}".format(mount_point))
|
||||
mount_point = os.path.join(copy_dir) if partition == "system" else os.path.join(copy_dir, partition)
|
||||
Logger.info(f"Unmounting {mount_point}")
|
||||
images.umount(mount_point)
|
||||
|
||||
|
||||
def install_app(args):
|
||||
install_list: List[General] = []
|
||||
app = args.app
|
||||
@@ -89,7 +77,8 @@ def install_app(args):
|
||||
install_list.append(Mitm(args.ca_cert_file))
|
||||
if "fdroidpriv" in app:
|
||||
install_list.append(FDroidPriv(args.android_version))
|
||||
|
||||
if "gps" in app:
|
||||
install_list.append(GPS(args.android_version, args.gps_host, args.baud_rate))
|
||||
if not container.use_overlayfs():
|
||||
copy_dir = "/tmp/waydroid"
|
||||
container.stop()
|
||||
@@ -115,10 +104,8 @@ def install_app(args):
|
||||
if not container.use_overlayfs():
|
||||
umount("vendor", copy_dir)
|
||||
umount("system", copy_dir)
|
||||
|
||||
container.upgrade()
|
||||
|
||||
|
||||
def remove_app(args):
|
||||
remove_list: List[General] = []
|
||||
app = args.app
|
||||
@@ -144,7 +131,8 @@ def remove_app(args):
|
||||
remove_list.append(Nodataperm(args.android_version))
|
||||
if "hidestatusbar" in app:
|
||||
remove_list.append(HideStatusBar())
|
||||
|
||||
if "gps" in app:
|
||||
remove_list.append(GPS())
|
||||
if not container.use_overlayfs():
|
||||
copy_dir = "/tmp/waydroid"
|
||||
container.stop()
|
||||
@@ -158,10 +146,8 @@ def remove_app(args):
|
||||
|
||||
container.upgrade()
|
||||
|
||||
|
||||
def hack_option(args):
|
||||
Logger.warning(
|
||||
"If these hacks cause any problems, run `sudo python main.py remove <hack_option>` to remove")
|
||||
Logger.warning("If these hacks cause any problems, run `sudo python main.py remove <hack_option>` to remove")
|
||||
|
||||
hack_list: List[General] = []
|
||||
options = args.option_name
|
||||
@@ -169,7 +155,6 @@ def hack_option(args):
|
||||
hack_list.append(Nodataperm())
|
||||
if "hidestatusbar" in options:
|
||||
hack_list.append(HideStatusBar())
|
||||
|
||||
if not container.use_overlayfs():
|
||||
copy_dir = "/tmp/waydroid"
|
||||
container.stop()
|
||||
@@ -198,10 +183,11 @@ def hack_option(args):
|
||||
|
||||
container.upgrade()
|
||||
|
||||
|
||||
def interact():
|
||||
if inquirer is None:
|
||||
print('Please, install InquirerPy module first')
|
||||
return
|
||||
os.system("clear")
|
||||
args = argparse.Namespace()
|
||||
android_version = inquirer.select(
|
||||
message="Select Android version",
|
||||
instruction="(\u2191\u2193 Select Item)",
|
||||
@@ -214,24 +200,22 @@ def interact():
|
||||
).execute()
|
||||
if not android_version:
|
||||
exit()
|
||||
args.android_version = android_version
|
||||
|
||||
args = argparse.Namespace(android_version=android_version, microg_variant="Standard")
|
||||
|
||||
action = inquirer.select(
|
||||
message="Please select an action",
|
||||
choices=[
|
||||
"Install",
|
||||
"Remove",
|
||||
"Hack",
|
||||
"Get Google Device ID to Get Certified"
|
||||
],
|
||||
choices=["Install", "Remove", "Hack", "Get Google Device ID to Get Certified"],
|
||||
instruction="([↑↓]: Select Item)",
|
||||
default=None,
|
||||
).execute()
|
||||
if not action:
|
||||
exit()
|
||||
|
||||
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv",]
|
||||
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "smartdock", "fdroidpriv","gps"]
|
||||
baud_rate_choices = ["9600", "19200", "38400", "57600", "115200"]
|
||||
hack_choices = []
|
||||
if android_version=="11":
|
||||
if android_version == "11":
|
||||
install_choices.extend(["widevine"])
|
||||
hack_choices.extend(["nodataperm", "hidestatusbar"])
|
||||
|
||||
@@ -243,8 +227,7 @@ def interact():
|
||||
invalid_message="should be at least 1 selection",
|
||||
choices=install_choices
|
||||
).execute()
|
||||
microg_variants = ["Standard", "NoGoolag",
|
||||
"UNLP", "Minimal", "MinimalIAP"]
|
||||
microg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
|
||||
if "microg" in apps:
|
||||
microg_variant = inquirer.select(
|
||||
message="Select MicroG variant",
|
||||
@@ -252,6 +235,19 @@ def interact():
|
||||
default="Standard",
|
||||
).execute()
|
||||
args.microg_variant = microg_variant
|
||||
if "gps" in apps:
|
||||
gps_host = inquirer.text(
|
||||
message="Enter GPS host (default: /dev/ttyGPSD)",
|
||||
default="/dev/ttyGPSD",
|
||||
).execute()
|
||||
args.gps_host = gps_host
|
||||
baud_rate = inquirer.select(
|
||||
message="Enter baud rate (default: 9600)",
|
||||
instruction="([\u2191\u2193]: [Enter]: Confirm",
|
||||
default="9600",
|
||||
choices=baud_rate_choices
|
||||
).execute()
|
||||
args.baud_rate = baud_rate
|
||||
args.app = apps
|
||||
install_app(args)
|
||||
elif action == "Remove":
|
||||
@@ -263,7 +259,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(
|
||||
@@ -276,15 +272,14 @@ def interact():
|
||||
args.option_name = apps
|
||||
hack_option(args)
|
||||
elif action == "Get Google Device ID to Get Certified":
|
||||
AndroidId().get_id()
|
||||
|
||||
get_certified()
|
||||
|
||||
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!''')
|
||||
|
||||
subparsers = parser.add_subparsers(title="coomand", dest='command')
|
||||
subparsers = parser.add_subparsers(title="command", dest='command')
|
||||
parser.add_argument('-a', '--android-version',
|
||||
dest='android_version',
|
||||
help='Specify the Android version',
|
||||
@@ -296,8 +291,7 @@ 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", "mitm", "smartdock", "widevine"]
|
||||
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "mitm", "smartdock", "widevine", "gps"]
|
||||
hack_choices = ["nodataperm", "hidestatusbar"]
|
||||
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
|
||||
remove_choices = install_choices
|
||||
@@ -305,8 +299,7 @@ def main():
|
||||
arg_template = {
|
||||
"dest": "app",
|
||||
"type": str,
|
||||
"nargs": '+',
|
||||
# "metavar":"",
|
||||
"nargs": '+'
|
||||
}
|
||||
|
||||
install_help = """
|
||||
@@ -344,15 +337,15 @@ widevine: Add support for widevine DRM L3
|
||||
hack_parser.set_defaults(func=hack_option)
|
||||
|
||||
args = parser.parse_args()
|
||||
args.microg_variant = "Standard"
|
||||
args.microg_variant = os.environ.get("MICROG_VARIANT", "Standard")
|
||||
args.gps_host = os.environ.get("GPS_HOST", "/dev/ttyGPSD")
|
||||
args.baud_rate = os.environ.get("BAUD_RATE", "9600")
|
||||
if hasattr(args, 'func'):
|
||||
args_dict = vars(args)
|
||||
helper.check_root()
|
||||
args.func(args)
|
||||
else:
|
||||
helper.check_root()
|
||||
interact()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
{ lib,
|
||||
stdenvNoCC,
|
||||
lzip,
|
||||
python3,
|
||||
makeWrapper }:
|
||||
let
|
||||
wrappedPath = lib.makeBinPath [ lzip ];
|
||||
in stdenvNoCC.mkDerivation {
|
||||
name = "waydroid_script";
|
||||
|
||||
buildInputs = [
|
||||
(python3.withPackages(ps: with ps; [ tqdm requests inquirerpy ]))
|
||||
];
|
||||
|
||||
nativeBuildInputs = [
|
||||
makeWrapper
|
||||
];
|
||||
|
||||
src = ./.;
|
||||
|
||||
postPatch = ''
|
||||
patchShebangs main.py
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/libexec
|
||||
cp -r . $out/libexec/waydroid_script
|
||||
mkdir -p $out/bin
|
||||
makeShellWrapper $out/libexec/waydroid_script/main.py $out/bin/waydroid_script \
|
||||
--prefix PATH : "${wrappedPath}"
|
||||
'';
|
||||
}
|
||||
@@ -1,3 +1,2 @@
|
||||
tqdm
|
||||
requests
|
||||
InquirerPy
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
import os
|
||||
from xml.dom import minidom
|
||||
import xml.etree.ElementTree as ET
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
import tools.images as images
|
||||
from tools.helper import run, host
|
||||
from tools import container
|
||||
|
||||
class GPS(General):
|
||||
id = "gps"
|
||||
partition = "vendor"
|
||||
dl_links = ["https://github.com/Lolmc0587/android_gps_libraries/archive/refs/tags/2.1.zip","f84c369c7cebd9dbb8987ca15c6aa856"]
|
||||
act_md5 = ...
|
||||
dl_link = ...
|
||||
dl_file_name = "android_gps_libraries-2.1.zip"
|
||||
extract_to = "/tmp/android_gps_libraries-2.1"
|
||||
|
||||
files = [
|
||||
"lib/hw/android.hardware.gnss@1.0-impl.so",
|
||||
"lib64/hw/android.hardware.gnss@1.0-impl.so",
|
||||
"lib/hw/gps.default.so",
|
||||
"lib64/hw/gps.default.so",
|
||||
"etc/init/android.hardware.gnss@1.0-service.rc",
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, android_version="11", gps_host="/dev/ttyGPSD", baud_rate=9600) -> None:
|
||||
super().__init__()
|
||||
self.host_arch = host()
|
||||
# Set for arm 32 bit support from file downloaded
|
||||
self.host = "arm64-v8a" if "arm" in self.host_arch[0] else self.host_arch[0]
|
||||
self.gps_host = gps_host
|
||||
self.baud_rate = baud_rate
|
||||
self.android_version = android_version
|
||||
self.usb_name = self.gps_host.split("/")[-1]
|
||||
self.files_vendor = [
|
||||
"bin/hw/android.hardware.gnss@1.0-service",
|
||||
]
|
||||
self.config_files = {
|
||||
"11": [
|
||||
"etc/vintf/compatibility_matrix.legacy.xml",
|
||||
"etc/vintf/manifest.xml",
|
||||
"build.prop",
|
||||
],
|
||||
"13": [
|
||||
"etc/vintf/compatibility_matrix.7.xml",
|
||||
"etc/vintf/manifest.xml",
|
||||
"build.prop",
|
||||
],
|
||||
}
|
||||
|
||||
self.compatibility_files = {
|
||||
"11": "etc/vintf/compatibility_matrix.legacy.xml",
|
||||
"13": "etc/vintf/compatibility_matrix.7.xml",
|
||||
}
|
||||
|
||||
self.dl_link = self.dl_links[0]
|
||||
self.act_md5 = self.dl_links[1]
|
||||
|
||||
def update_manifest(self, manifest_path, data):
|
||||
"""
|
||||
Update the manifest file by inserting data into the <manifest> tag and format the XML.
|
||||
"""
|
||||
tree = ET.parse(manifest_path)
|
||||
root = tree.getroot()
|
||||
|
||||
root.append(ET.fromstring(data))
|
||||
tree.write(manifest_path, encoding="utf-8", xml_declaration=True)
|
||||
|
||||
with open(manifest_path, "r") as f:
|
||||
content = f.read()
|
||||
formatted_content = minidom.parseString(content).toprettyxml(indent=" ")
|
||||
|
||||
formatted_content = "\n".join(
|
||||
[line for line in formatted_content.split("\n") if line.strip()]
|
||||
)
|
||||
|
||||
with open(manifest_path, "w") as f:
|
||||
f.write(formatted_content)
|
||||
|
||||
def copy(self):
|
||||
Logger.info("Copying gps library files ...")
|
||||
if self.android_version == "11":
|
||||
shutil.copytree(os.path.join(self.extract_to, self.dl_file_name.replace(".zip", ""), self.android_version,
|
||||
self.host, "system"), os.path.join(self.copy_dir, "system"), dirs_exist_ok=True)
|
||||
self.partition = "system"
|
||||
if self.android_version == "13":
|
||||
shutil.copytree(os.path.join(self.extract_to, self.dl_file_name.replace(".zip", ""), self.android_version,
|
||||
self.host, "system"), os.path.join(self.copy_dir, "vendor"), dirs_exist_ok=True)
|
||||
self.partition = "vendor"
|
||||
shutil.copytree(os.path.join(self.extract_to, self.dl_file_name.replace(".zip", ""), self.android_version,
|
||||
self.host, "vendor"), os.path.join(self.copy_dir, "vendor"), dirs_exist_ok=True)
|
||||
|
||||
def extra1(self):
|
||||
Logger.info("Setting extra permissions ...")
|
||||
# set permissions for vendor files
|
||||
path = os.path.join(self.copy_dir, "vendor", self.files_vendor[0])
|
||||
self.set_perm2(path, recursive=True)
|
||||
|
||||
# Copy nessessary files to the overlayfs
|
||||
container.stop()
|
||||
copy_dir = "/tmp/waydroid"
|
||||
if container.use_overlayfs():
|
||||
img = os.path.join(images.get_image_dir(), "system.img")
|
||||
# images.mount(img, copy_dir)
|
||||
if not os.path.exists(copy_dir):
|
||||
os.makedirs(copy_dir)
|
||||
run(["sudo", "mount", img, copy_dir])
|
||||
|
||||
for file in self.config_files[self.android_version]:
|
||||
file_dir = os.path.join(self.copy_dir, "system", file)
|
||||
if not os.path.exists(os.path.dirname(file_dir)):
|
||||
os.makedirs(os.path.dirname(file_dir))
|
||||
shutil.copyfile(os.path.join(copy_dir, "system", file), file_dir)
|
||||
self.set_perm2(file_dir, recursive=True)
|
||||
|
||||
if self.android_version == "13":
|
||||
# Copy missing libraries file for android 13 vendor partition from system partition
|
||||
if not os.path.exists(os.path.join(self.copy_dir, "vendor", "lib64", "hw")):
|
||||
os.makedirs(os.path.join(self.copy_dir, "vendor", "lib64", "hw"))
|
||||
|
||||
copy_ = True
|
||||
if "arm" in self.host and self.host_arch[1] == 32:
|
||||
copy_ = False
|
||||
if copy_:
|
||||
shutil.copyfile(os.path.join(copy_dir, "system", "lib64/android.hardware.gnss@1.0.so"),
|
||||
os.path.join(self.copy_dir, "vendor", "lib64/hw/android.hardware.gnss@1.0.so"))
|
||||
|
||||
if not os.path.exists(os.path.join(self.copy_dir, "vendor", "lib", "hw")):
|
||||
os.makedirs(os.path.join(self.copy_dir, "vendor", "lib", "hw"))
|
||||
|
||||
shutil.copyfile(os.path.join(copy_dir, "system", "lib/android.hardware.gnss@1.0.so"),
|
||||
os.path.join(self.copy_dir, "vendor", "lib/hw/android.hardware.gnss@1.0.so"))
|
||||
|
||||
images.umount(copy_dir)
|
||||
|
||||
# Update manifest files
|
||||
container.upgrade()
|
||||
|
||||
manifest_entry_1 = """
|
||||
<hal format="hidl" optional="true">
|
||||
<name>android.hardware.gnss</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IGnss</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
"""
|
||||
self.update_manifest(
|
||||
os.path.join(self.copy_dir, "system", self.compatibility_files[self.android_version]),
|
||||
data=manifest_entry_1,
|
||||
)
|
||||
|
||||
manifest_entry_2 = """
|
||||
<hal format="hidl">
|
||||
<name>android.hardware.gnss</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IGnss</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
<fqname>@1.0::IGnss/default</fqname>
|
||||
</hal>
|
||||
"""
|
||||
self.update_manifest(os.path.join(self.copy_dir, "system", "etc", "vintf", "manifest.xml"), data=manifest_entry_2)
|
||||
config_nodes = "/var/lib/waydroid/lxc/waydroid/config_nodes"
|
||||
# lxc.mount.entry = /dev/ttyGPSD dev/ttyGPSD none bind,create=file,optional 0 0
|
||||
|
||||
with open(config_nodes, "a") as f:
|
||||
f.write(f"lxc.mount.entry = {self.gps_host} dev/{self.usb_name} none bind,create=file,optional 0 0\n")
|
||||
|
||||
with open(os.path.join(self.copy_dir, "system", "build.prop"), "a") as f:
|
||||
f.write("ro.factory.hasGPS=true\n")
|
||||
f.write(f"ro.kernel.android.gps={self.usb_name}\n")
|
||||
f.write(f"ro.kernel.android.gps.speed={self.baud_rate}\n")
|
||||
Logger.warning(
|
||||
"You need to add user to the 'dialout' group to access the GPS device."
|
||||
"\nYou can do this by running: sudo usermod -aG dialout <your_username>"
|
||||
"\nand then reboot your system."
|
||||
)
|
||||
def extra2(self):
|
||||
# Remove vendor files from system partition
|
||||
self.files = self.files_vendor
|
||||
self.partition = "vendor"
|
||||
self.remove()
|
||||
|
||||
# Remove config files from system partition
|
||||
self.files = self.config_files[self.android_version]
|
||||
self.partition = "system"
|
||||
self.remove()
|
||||
|
||||
container.upgrade()
|
||||
|
||||
@@ -36,11 +36,11 @@ class MicroG(General):
|
||||
"6136b383153c2a6797d14fb4d7ca3f97"
|
||||
],
|
||||
"Minimal": [
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-Minimal-2.11.1-20230429100521.zip"
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-Minimal-2.11.1-20230429100521.zip",
|
||||
"afb87eb64e7749cfd72c4760d85849da"
|
||||
],
|
||||
"MinimalIAP": [
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-MinimalIAP-2.11.1-20230429100556.zip"
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-MinimalIAP-2.11.1-20230429100556.zip",
|
||||
"cc071f4f776cbc16c4c1f707aff1f7fa"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class Nodataperm(General):
|
||||
self.act_md5 = self.dl_links[android_version][arch][1]
|
||||
|
||||
def copy(self):
|
||||
name = re.findall("([a-zA-Z0-9]+)\.zip", self.dl_link)[0]
|
||||
name = re.findall("([a-zA-Z0-9]+)\\.zip", self.dl_link)[0]
|
||||
extract_path = os.path.join(
|
||||
self.extract_to, f"hack_full_data_permission-{name}")
|
||||
if not container.use_overlayfs():
|
||||
|
||||
@@ -4,32 +4,34 @@ from stuff.general import General
|
||||
|
||||
class Smartdock(General):
|
||||
id = "smartdock"
|
||||
dl_link = "https://f-droid.org/repo/cu.axel.smartdock_1100.apk"
|
||||
dl_link = "https://f-droid.org/repo/cu.axel.smartdock_1130.apk"
|
||||
partition = "system"
|
||||
dl_file_name = "smartdock.apk"
|
||||
act_md5 = "f4087d34218eac902a5cca98ee03d215"
|
||||
act_md5 = "6bfedb959ef5855c3782e8001cb67f86"
|
||||
apply_props = { "qemu.hw.mainkeys" : "1" }
|
||||
skip_extract = True
|
||||
permissions = """<?xml version="1.0" encoding="utf-8"?>
|
||||
<permissions>
|
||||
<privapp-permissions package="cu.axel.smartdock">
|
||||
<permission name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<permission name="android.permission.GET_TASKS"/>
|
||||
<permission name="android.permission.REORDER_TASKS"/>
|
||||
<permission name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<permission name="android.permission.GET_TASKS" />
|
||||
<permission name="android.permission.REORDER_TASKS" />
|
||||
<permission name="android.permission.REMOVE_TASKS" />
|
||||
<permission name="android.permission.ACCESS_WIFI_STATE"/>
|
||||
<permission name="android.permission.CHANGE_WIFI_STATE"/>
|
||||
<permission name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<permission name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<permission name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<permission name="android.permission.MANAGE_USERS"/>
|
||||
<permission name="android.permission.BLUETOOTH_ADMIN"/>
|
||||
<permission name="android.permission.BLUETOOTH_CONNECT"/>
|
||||
<permission name="android.permission.BLUETOOTH"/>
|
||||
<permission name="android.permission.REQUEST_DELETE_PACKAGES"/>
|
||||
<permission name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<permission name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<permission name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<permission name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<permission name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<permission name="android.permission.MANAGE_USERS" />
|
||||
<permission name="android.permission.BLUETOOTH_ADMIN" />
|
||||
<permission name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<permission name="android.permission.BLUETOOTH" />
|
||||
<permission name="android.permission.REQUEST_DELETE_PACKAGES" />
|
||||
<permission name="android.permission.ACCESS_SUPERUSER"/>
|
||||
<permission name="android.permission.PACKAGE_USAGE_STATS" />
|
||||
<permission name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
<permission name="android.permission.WRITE_SECURE_SETTINGS" />
|
||||
<permission name="android.permission.WRITE_SETTINGS" />
|
||||
</privapp-permissions>
|
||||
</permissions>
|
||||
"""
|
||||
|
||||
@@ -40,7 +40,7 @@ class Widevine(General):
|
||||
self.act_md5 = self.dl_links[self.arch[0]][android_version][1]
|
||||
|
||||
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 ...")
|
||||
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)
|
||||
|
||||
@@ -22,7 +22,7 @@ def use_overlayfs():
|
||||
cfg = configparser.ConfigParser()
|
||||
cfg_file = os.environ.get("WAYDROID_CONFIG", "/var/lib/waydroid/waydroid.cfg")
|
||||
if not os.path.isfile(cfg_file):
|
||||
Logger.error("Cannot locate waydroid config file, reinit wayland and try again!")
|
||||
Logger.error("Cannot locate waydroid config file, reinit waydroid and try again!")
|
||||
sys.exit(1)
|
||||
cfg.read(cfg_file)
|
||||
if "waydroid" not in cfg:
|
||||
@@ -50,4 +50,4 @@ def is_running():
|
||||
return "Session:\tRUNNING" in run(["waydroid", "status"]).stdout.decode()
|
||||
|
||||
def upgrade():
|
||||
run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
|
||||
run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container")
|
||||
|
||||
@@ -32,7 +32,7 @@ def get_image_dir():
|
||||
cfg = configparser.ConfigParser()
|
||||
cfg_file = os.environ.get("WAYDROID_CONFIG", "/var/lib/waydroid/waydroid.cfg")
|
||||
if not os.path.isfile(cfg_file):
|
||||
Logger.error("Cannot locate waydroid config file, reinit wayland and try again!")
|
||||
Logger.error("Cannot locate waydroid config file, reinit waydroid and try again!")
|
||||
sys.exit(1)
|
||||
cfg.read(cfg_file)
|
||||
if "waydroid" not in cfg:
|
||||
|
||||