diff --git a/README.md b/README.md index 0ba2d73..e279e4f 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ This is a temporary hack to combat against the apps permission issue on Android always enable a property (persist.sys.nodataperm) to make it execute a script to grant the data full permissions (777). The **correct** way is to use `sdcardfs` or `esdfs`, both need to recompile the kernel or WayDroid image. -Arknights, PUNISHING: GRAY RAVEN and other games won't freeze on the black screen. +Arknights, PUNISHING: GRAY RAVEN, and other games won't freeze on the black screen. ![](assets/6.png) diff --git a/main.py b/main.py index 600ff8d..ac28f39 100755 --- a/main.py +++ b/main.py @@ -1,11 +1,14 @@ #!/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 @@ -17,13 +20,8 @@ from stuff.ndk import Ndk from stuff.nodataperm import Nodataperm from stuff.smartdock import Smartdock from stuff.widevine import Widevine -from stuff.fdroidpriv import FDroidPriv -import tools.helper as helper from tools import container from tools import images - -import argparse - from tools.logger import Logger @@ -32,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) @@ -43,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) @@ -229,9 +227,9 @@ def interact(): if not action: exit() - install_choices = ["gapps", "microg", "libndk", "magisk", "smartdock", "fdroidpriv",] + install_choices = ["gapps", "microg", "libndk", "magisk", "smartdock", "fdroidpriv", ] hack_choices = [] - if android_version=="11": + if android_version == "11": install_choices.extend(["libhoudini", "widevine"]) hack_choices.extend(["nodataperm", "hidestatusbar"]) @@ -263,7 +261,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( @@ -280,9 +278,8 @@ 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', @@ -311,10 +308,10 @@ 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 @@ -334,7 +331,7 @@ widevine: Add support for widevine DRM L3 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 diff --git a/stuff/android_id.py b/stuff/android_id.py index db3c1d8..7f274fd 100644 --- a/stuff/android_id.py +++ b/stuff/android_id.py @@ -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( diff --git a/stuff/fdroidpriv.py b/stuff/fdroidpriv.py index 1258738..131fa52 100644 --- a/stuff/fdroidpriv.py +++ b/stuff/fdroidpriv.py @@ -1,5 +1,6 @@ import os import shutil + from stuff.general import General @@ -20,10 +21,11 @@ class FDroidPriv(General): "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", + "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] @@ -37,4 +39,3 @@ class FDroidPriv(General): if not os.path.exists(rro_dir): os.makedirs(rro_dir) shutil.copyfile(os.path.join(self.extract_to, f), rro_file) - diff --git a/stuff/gapps.py b/stuff/gapps.py index 851b8ce..8a72833 100644 --- a/stuff/gapps.py +++ b/stuff/gapps.py @@ -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/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"] + "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}") diff --git a/stuff/general.py b/stuff/general.py index 3dc0962..a1041a3 100644 --- a/stuff/general.py +++ b/stuff/general.py @@ -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 @@ -74,7 +75,7 @@ class General: if not os.path.exists(bin_dir): os.makedirs(bin_dir) shutil.copy(os.path.join(os.path.join(os.path.dirname(__file__), "..", "bin", - self.arch[0], "resetprop")), bin_dir) + self.arch[0], "resetprop")), bin_dir) os.chmod(os.path.join(bin_dir, "resetprop"), 0o755) if not os.path.isfile(os.path.join(bin_dir, "resetprop.sh")): with open(os.path.join(bin_dir, "resetprop.sh"), "w") as f: diff --git a/stuff/hidestatusbar.py b/stuff/hidestatusbar.py index 1953cd3..e88adeb 100644 --- a/stuff/hidestatusbar.py +++ b/stuff/hidestatusbar.py @@ -1,5 +1,6 @@ import os import shutil + from stuff.general import General @@ -12,8 +13,9 @@ class HideStatusBar(General): 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] diff --git a/stuff/houdini.py b/stuff/houdini.py index da29f9c..b34622a 100644 --- a/stuff/houdini.py +++ b/stuff/houdini.py @@ -1,6 +1,7 @@ import os import re import shutil + from stuff.general import General from tools.logger import Logger @@ -9,7 +10,9 @@ class Houdini(General): id = "libhoudini" partition = "system" dl_links = { - "11": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/81f2a51ef539a35aead396ab7fce2adf89f46e88.zip", "fbff756612b4144797fbc99eadcb6653"], + "11": [ + "https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/81f2a51ef539a35aead396ab7fce2adf89f46e88.zip", + "fbff756612b4144797fbc99eadcb6653"], # "13": ["https://github.com/supremegamers/vendor_intel_proprietary_houdini/archive/978d8cba061a08837b7e520cd03b635af643ba08.zip", "1e139054c05034648fae58a1810573b4"] } act_md5 = ... @@ -57,7 +60,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): diff --git a/stuff/magisk.py b/stuff/magisk.py index 86f8084..24383d6 100644 --- a/stuff/magisk.py +++ b/stuff/magisk.py @@ -1,11 +1,13 @@ 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" @@ -75,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", @@ -97,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("/"): @@ -122,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(): @@ -130,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" ] @@ -141,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() diff --git a/stuff/microg.py b/stuff/microg.py index 78faf87..863e54e 100644 --- a/stuff/microg.py +++ b/stuff/microg.py @@ -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 diff --git a/stuff/mitm.py b/stuff/mitm.py index 8468a9a..f8f83c0 100644 --- a/stuff/mitm.py +++ b/stuff/mitm.py @@ -1,14 +1,16 @@ 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: + def __init__(self, ca_cert_file: str = None) -> None: super().__init__() self.ca_cert_file = ca_cert_file diff --git a/stuff/ndk.py b/stuff/ndk.py index 727b351..0376651 100644 --- a/stuff/ndk.py +++ b/stuff/ndk.py @@ -1,15 +1,21 @@ 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"] + "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"] } dl_file_name = "libndktranslation.zip" extract_to = "/tmp/libndkunpack" @@ -26,19 +32,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 +55,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) \ No newline at end of file + "prebuilts"), os.path.join(self.copy_dir, self.partition), dirs_exist_ok=True) diff --git a/stuff/nodataperm.py b/stuff/nodataperm.py index 4f140db..91fe479 100644 --- a/stuff/nodataperm.py +++ b/stuff/nodataperm.py @@ -1,22 +1,23 @@ import os import re import shutil + from stuff.general import General +from tools import container from tools.helper import backup, restore from tools.logger import Logger -from tools import container class Nodataperm(General): id = "nodataperm" dl_links = { "11": - { - "x86_64": [ - "https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip", - "b0e3908ffcf5df8ea62f4929aa680f1a" - ], - }, + { + "x86_64": [ + "https://github.com/ayasa520/hack_full_data_permission/archive/d4beab7780eb792059d33e77d865579c9ee41546.zip", + "b0e3908ffcf5df8ea62f4929aa680f1a" + ], + }, "13": {} } dl_file_name = "nodataperm.zip" diff --git a/stuff/smartdock.py b/stuff/smartdock.py index 5b2e8ae..a29aea7 100644 --- a/stuff/smartdock.py +++ b/stuff/smartdock.py @@ -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_1100.apk" partition = "system" dl_file_name = "smartdock.apk" act_md5 = "f4087d34218eac902a5cca98ee03d215" - apply_props = { "qemu.hw.mainkeys" : "1" } + apply_props = {"qemu.hw.mainkeys": "1"} skip_extract = True permissions = """ @@ -34,10 +36,10 @@ class Smartdock(General): """ 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") diff --git a/stuff/widevine.py b/stuff/widevine.py index 316a4a5..61bcd95 100644 --- a/stuff/widevine.py +++ b/stuff/widevine.py @@ -1,6 +1,7 @@ import os import re import shutil + from stuff.general import General from tools.logger import Logger @@ -11,15 +12,18 @@ class Widevine(General): dl_links = { # "x86": ["https://github.com/supremegamers/vendor_google_proprietary_widevine-prebuilt/archive/94c9ee172e3d78fecc81863f50a59e3646f7a2bd.zip", "a31f325453c5d239c21ecab8cfdbd878"], "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"] + "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"] }, # "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" @@ -42,5 +46,5 @@ class Widevine(General): 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) + 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) diff --git a/tools/container.py b/tools/container.py index 7dd2f7c..6eb0ac8 100644 --- a/tools/container.py +++ b/tools/container.py @@ -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") \ No newline at end of file + run(["waydroid", "upgrade", "-o"], ignore=r"\[.*\] Stopping container\n\[.*\] Starting container") diff --git a/tools/helper.py b/tools/helper.py index a4dd78b..95a24c7 100644 --- a/tools/helper.py +++ b/tools/helper.py @@ -1,15 +1,16 @@ import gzip +import hashlib import os -import re import platform import re import subprocess import sys +from typing import Optional + import requests -from tools.logger import Logger from tqdm import tqdm -import hashlib -from typing import Optional + +from tools.logger import Logger def get_download_dir(): @@ -17,7 +18,7 @@ def get_download_dir(): 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" @@ -26,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 ) @@ -52,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( @@ -61,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() @@ -89,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) @@ -107,6 +114,7 @@ def download_file(url, f_name): raise ValueError("Something went wrong while downloading") return md5 + def host(): machine = platform.machine() @@ -125,7 +133,7 @@ def host(): return ("x86", 32) return mapping[machine] raise ValueError("platform.machine '" + machine + "'" - " architecture is not supported") + " architecture is not supported") def check_root(): @@ -133,14 +141,16 @@ def check_root(): Logger.error("This script must be run as root. Aborting.") sys.exit(1) + def backup(path): - gz_filename = path+".gz" + 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" + gz_filename = path + ".gz" with gzip.GzipFile(gz_filename) as f_gz: with open(path, "wb") as f: f.writelines(f_gz) diff --git a/tools/images.py b/tools/images.py index 9d6cd92..677b7b7 100644 --- a/tools/images.py +++ b/tools/images.py @@ -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"] diff --git a/tools/logger.py b/tools/logger.py index 358c0b0..fd856fa 100644 --- a/tools/logger.py +++ b/tools/logger.py @@ -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")