update: README.md
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
from tools import container
|
||||
from tools.helper import shell
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class AndroidId:
|
||||
def get_id(self):
|
||||
if container.is_running():
|
||||
try:
|
||||
queryout = shell(
|
||||
arg="sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"select * from main where name = 'android_id';\"",
|
||||
env="ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n"
|
||||
)
|
||||
except:
|
||||
return
|
||||
else:
|
||||
Logger.error("WayDroid isn't running !")
|
||||
return
|
||||
print(queryout.replace("android_id|", "").strip())
|
||||
print(" ^----- Open https://google.com/android/uncertified/?pli=1")
|
||||
print(" Login with your google id then submit the form with id shown above")
|
||||
+172
@@ -0,0 +1,172 @@
|
||||
import os
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.helper import run
|
||||
|
||||
|
||||
class Gapps(General):
|
||||
id = ...
|
||||
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"]
|
||||
},
|
||||
"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"]
|
||||
}
|
||||
}
|
||||
android_version = ...
|
||||
dl_link = ...
|
||||
act_md5 = ...
|
||||
dl_file_name = "gapps.zip"
|
||||
extract_to = "/tmp/gapps/extract"
|
||||
non_apks = [
|
||||
"defaultetc-common.tar.lz",
|
||||
"defaultframework-common.tar.lz",
|
||||
"googlepixelconfig-common.tar.lz",
|
||||
"vending-common.tar.lz"
|
||||
]
|
||||
skip = [
|
||||
"setupwizarddefault-x86_64.tar.lz",
|
||||
"setupwizardtablet-x86_64.tar.lz"
|
||||
]
|
||||
files = [
|
||||
"etc/default-permissions/default-permissions.xml",
|
||||
"etc/default-permissions/opengapps-permissions-q.xml",
|
||||
"etc/permissions/com.google.android.maps.xml",
|
||||
"etc/permissions/com.google.android.media.effects.xml",
|
||||
"etc/permissions/privapp-permissions-google.xml",
|
||||
"etc/permissions/split-permissions-google.xml",
|
||||
"etc/preferred-apps/google.xml",
|
||||
"etc/sysconfig/google.xml",
|
||||
"etc/sysconfig/google_build.xml",
|
||||
"etc/sysconfig/google_exclusives_enable.xml",
|
||||
"etc/sysconfig/google-hiddenapi-package-whitelist.xml",
|
||||
"framework/com.google.android.maps.jar",
|
||||
"framework/com.google.android.media.effects.jar",
|
||||
"priv-app/AndroidMigratePrebuilt",
|
||||
"priv-app/GoogleExtServices",
|
||||
"priv-app/GoogleRestore",
|
||||
"priv-app/CarrierSetup",
|
||||
"priv-app/GoogleExtShared",
|
||||
"priv-app/GoogleServicesFramework",
|
||||
"priv-app/ConfigUpdater",
|
||||
"priv-app/GoogleFeedback",
|
||||
"priv-app/Phonesky",
|
||||
"priv-app/GoogleBackupTransport",
|
||||
"priv-app/GoogleOneTimeInitializer",
|
||||
"priv-app/PrebuiltGmsCore",
|
||||
"priv-app/GoogleContactsSyncAdapter",
|
||||
"priv-app/GooglePartnerSetup",
|
||||
"product/overlay/PlayStoreOverlay.apk",
|
||||
"product/overlay/GmsOverlay.apk.apk",
|
||||
"product/overlay/GmsSettingsProviderOverlay.apk",
|
||||
"system_ext/etc/permissions/privapp-permissions-google-system-ext.xml",
|
||||
"system_ext/priv-app/GoogleFeedback",
|
||||
"system_ext/priv-app/GoogleServicesFramework",
|
||||
"system_ext/priv-app/SetupWizard",
|
||||
"product/priv-app/GmsCore",
|
||||
"product/priv-app/AndroidAutoStub",
|
||||
"product/priv-app/GoogleRestore",
|
||||
"product/priv-app/Phonesky",
|
||||
"product/priv-app/Velvet",
|
||||
"product/priv-app/GooglePartnerSetup",
|
||||
"product/app/GoogleCalendarSyncAdapter",
|
||||
"product/app/PrebuiltExchange3Google",
|
||||
"product/app/GoogleContactsSyncAdapter",
|
||||
"product/framework/com.google.android.dialer.support.jar",
|
||||
"product/lib64/libjni_latinimegoogle.so",
|
||||
"product/etc/default-permissions/default-permissions-google.xml",
|
||||
"product/etc/default-permissions/default-permissions-mtg.xml",
|
||||
"product/etc/sysconfig/google.xml",
|
||||
"product/etc/sysconfig/d2d_cable_migration_feature.xml",
|
||||
"product/etc/sysconfig/google-hiddenapi-package-allowlist.xml",
|
||||
"product/etc/sysconfig/google_build.xml",
|
||||
"product/etc/permissions/privapp-permissions-google-product.xml",
|
||||
"product/etc/permissions/com.google.android.dialer.support.xml",
|
||||
"product/etc/security/fsverity/gms_fsverity_cert.der",
|
||||
"product/lib/libjni_latinimegoogle.so",
|
||||
]
|
||||
|
||||
def __init__(self, android_version="11") -> None:
|
||||
super().__init__()
|
||||
self.android_version = android_version
|
||||
self.dl_link = self.dl_links[android_version][self.arch[0]][0]
|
||||
self.act_md5 = self.dl_links[android_version][self.arch[0]][1]
|
||||
if android_version == "11":
|
||||
self.id = "OpenGapps"
|
||||
else:
|
||||
self.id = "MindTheGapps"
|
||||
|
||||
def copy(self):
|
||||
if self.android_version == "11":
|
||||
return self.copy_11()
|
||||
elif self.android_version == "13":
|
||||
return self.copy_13()
|
||||
|
||||
def copy_11(self):
|
||||
if not os.path.exists(self.extract_to):
|
||||
os.makedirs(self.extract_to)
|
||||
if not os.path.exists(os.path.join(self.extract_to, "appunpack")):
|
||||
os.makedirs(os.path.join(self.extract_to, "appunpack"))
|
||||
|
||||
for lz_file in os.listdir(os.path.join(self.extract_to, "Core")):
|
||||
for d in os.listdir(os.path.join(self.extract_to, "appunpack")):
|
||||
shutil.rmtree(os.path.join(self.extract_to, "appunpack", d))
|
||||
if lz_file not in self.skip:
|
||||
if lz_file not in self.non_apks:
|
||||
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")])
|
||||
app_name = os.listdir(os.path.join(
|
||||
self.extract_to, "appunpack"))[0]
|
||||
xx_dpi = os.listdir(os.path.join(
|
||||
self.extract_to, "appunpack", app_name))[0]
|
||||
app_priv = os.listdir(os.path.join(
|
||||
self.extract_to, "appunpack", app_name, "nodpi"))[0]
|
||||
app_src_dir = os.path.join(
|
||||
self.extract_to, "appunpack", app_name, xx_dpi, app_priv)
|
||||
for app in os.listdir(app_src_dir):
|
||||
shutil.copytree(os.path.join(app_src_dir, app), os.path.join(
|
||||
self.copy_dir, self.partition, "priv-app", app), dirs_exist_ok=True)
|
||||
for f in os.listdir(os.path.join(self.copy_dir, self.partition, "priv-app", app)):
|
||||
dst_file_path = os.path.join(os.path.join(
|
||||
self.copy_dir, self.partition, "priv-app", app), f)
|
||||
if os.path.splitext(dst_file_path)[1].lower() == ".apk":
|
||||
self.extract_app_lib(dst_file_path)
|
||||
else:
|
||||
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")])
|
||||
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)
|
||||
|
||||
def copy_13(self):
|
||||
src_dir = os.path.join(self.extract_to, "system")
|
||||
dst_dir = os.path.join(self.copy_dir, self.partition)
|
||||
for root, dirs, files in os.walk(src_dir):
|
||||
dir_name = os.path.basename(root)
|
||||
# 遍历文件
|
||||
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))
|
||||
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}")
|
||||
shutil.copy2(src_file_path, dst_file_path)
|
||||
if os.path.splitext(dst_file_path)[1].lower() == ".apk":
|
||||
self.extract_app_lib(dst_file_path)
|
||||
@@ -0,0 +1,190 @@
|
||||
import configparser
|
||||
import glob
|
||||
import os
|
||||
import shutil
|
||||
import zipfile
|
||||
import hashlib
|
||||
from tools.helper import download_file, get_download_dir, host
|
||||
from tools import container
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class General:
|
||||
files = []
|
||||
|
||||
@property
|
||||
def arch(self):
|
||||
return host()
|
||||
|
||||
@property
|
||||
def skip_extract(self):
|
||||
return False
|
||||
|
||||
@property
|
||||
def download_loc(self):
|
||||
return os.path.join(get_download_dir(), self.dl_file_name)
|
||||
|
||||
@property
|
||||
def copy_dir(self):
|
||||
if container.use_overlayfs():
|
||||
return "/var/lib/waydroid/overlay"
|
||||
else:
|
||||
return "/tmp/waydroid"
|
||||
|
||||
def download(self):
|
||||
Logger.info("Downloading {} now to {} .....".format(
|
||||
self.dl_file_name, self.download_loc))
|
||||
loc_md5 = ""
|
||||
if os.path.isfile(self.download_loc):
|
||||
with open(self.download_loc, "rb") as f:
|
||||
bytes = f.read()
|
||||
loc_md5 = hashlib.md5(bytes).hexdigest()
|
||||
while not os.path.isfile(self.download_loc) or loc_md5 != self.act_md5:
|
||||
if os.path.isfile(self.download_loc):
|
||||
os.remove(self.download_loc)
|
||||
Logger.warning(
|
||||
"md5 mismatches, redownloading now ....")
|
||||
loc_md5 = download_file(self.dl_link, self.download_loc)
|
||||
|
||||
def remove(self):
|
||||
for f in self.files:
|
||||
file = os.path.join(self.copy_dir, self.partition, f)
|
||||
if "*" in file:
|
||||
for wildcard_file in glob.glob(file):
|
||||
if os.path.isdir(wildcard_file):
|
||||
shutil.rmtree(wildcard_file)
|
||||
elif os.path.isfile(wildcard_file):
|
||||
os.remove(wildcard_file)
|
||||
else:
|
||||
if os.path.isdir(file):
|
||||
shutil.rmtree(file)
|
||||
elif os.path.isfile(file):
|
||||
os.remove(file)
|
||||
|
||||
def extract(self):
|
||||
Logger.info(f"Extracting {self.download_loc} to {self.extract_to}")
|
||||
with zipfile.ZipFile(self.download_loc) as z:
|
||||
z.extractall(self.extract_to)
|
||||
|
||||
def add_props(self):
|
||||
bin_dir = os.path.join(self.copy_dir, "system", "etc")
|
||||
resetprop_rc = os.path.join(
|
||||
self.copy_dir, "system/etc/init/resetprop.rc")
|
||||
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)
|
||||
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:
|
||||
f.write("#!/system/bin/sh\n")
|
||||
f.write(
|
||||
"while read line; do /system/etc/resetprop ${line%=*} ${line#*=}; done < /vendor/waydroid.prop\n")
|
||||
os.chmod(os.path.join(bin_dir, "resetprop.sh"), 0o755)
|
||||
if not os.path.isfile(resetprop_rc):
|
||||
if not os.path.exists(os.path.dirname(resetprop_rc)):
|
||||
os.makedirs(os.path.dirname(resetprop_rc))
|
||||
with open(resetprop_rc, "w") as f:
|
||||
f.write(
|
||||
"on post-fs-data\n exec u:r:su:s0 root root -- /system/bin/sh /system/bin/resetprop.sh")
|
||||
os.chmod(resetprop_rc, 0o644)
|
||||
|
||||
cfg = configparser.ConfigParser()
|
||||
cfg.read("/var/lib/waydroid/waydroid.cfg")
|
||||
|
||||
for key in self.apply_props.keys():
|
||||
if self.apply_props[key]:
|
||||
cfg.set('properties', key, self.apply_props[key])
|
||||
|
||||
with open("/var/lib/waydroid/waydroid.cfg", "w") as f:
|
||||
cfg.write(f)
|
||||
|
||||
def extract_app_lib(self, apk_file_path):
|
||||
lib_dest_dir = os.path.dirname(apk_file_path)
|
||||
with zipfile.ZipFile(apk_file_path, "r") as apk:
|
||||
for file_info in apk.infolist():
|
||||
file_name = file_info.filename
|
||||
file_path = os.path.join(lib_dest_dir, file_name)
|
||||
if file_info.filename.startswith(f"lib/{self.arch[0]}/") and file_name.endswith(".so"):
|
||||
os.makedirs(os.path.dirname(
|
||||
file_path), exist_ok=True)
|
||||
with apk.open(file_info.filename) as src_file, open(file_path, "wb") as dest_file:
|
||||
# Logger.info(f"{src_file} -> {dest_file}")
|
||||
shutil.copyfileobj(src_file, dest_file)
|
||||
|
||||
def set_path_perm(self, path):
|
||||
if "bin" in path.split("/"):
|
||||
perms = [0, 2000, 0o755, 0o777]
|
||||
else:
|
||||
perms = [0, 0, 0o755, 0o644]
|
||||
|
||||
mode = os.stat(path).st_mode
|
||||
|
||||
if os.path.isdir(path):
|
||||
mode |= perms[2]
|
||||
else:
|
||||
mode |= perms[3]
|
||||
|
||||
os.chown(path, perms[0], perms[1])
|
||||
os.chmod(path, mode)
|
||||
|
||||
def set_perm2(self, path, recursive=False):
|
||||
if not os.path.exists(path):
|
||||
return
|
||||
|
||||
if recursive and os.path.isdir(path):
|
||||
for root, dirs, files in os.walk(path):
|
||||
for dir in dirs:
|
||||
self.set_path_perm(os.path.join(root, dir))
|
||||
for file in files:
|
||||
self.set_path_perm(os.path.join(root, file))
|
||||
else:
|
||||
self.set_path_perm(path)
|
||||
|
||||
def set_perm(self):
|
||||
for f in self.files:
|
||||
path = os.path.join(self.copy_dir, self.partition, f)
|
||||
if "*" in path:
|
||||
for wildcard_file in glob.glob(path):
|
||||
self.set_perm2(wildcard_file, recursive=True)
|
||||
else:
|
||||
self.set_perm2(path, recursive=True)
|
||||
|
||||
def remove_props(self):
|
||||
cfg = configparser.ConfigParser()
|
||||
cfg.read("/var/lib/waydroid/waydroid.cfg")
|
||||
|
||||
for key in self.apply_props.keys():
|
||||
cfg.remove_option('properties', key)
|
||||
|
||||
with open("/var/lib/waydroid/waydroid.cfg", "w") as f:
|
||||
cfg.write(f)
|
||||
|
||||
def copy(self):
|
||||
pass
|
||||
|
||||
def extra1(self):
|
||||
pass
|
||||
|
||||
def extra2(self):
|
||||
pass
|
||||
|
||||
def install(self):
|
||||
self.download()
|
||||
if not self.skip_extract:
|
||||
self.extract()
|
||||
self.copy()
|
||||
self.extra1()
|
||||
if hasattr(self, "apply_props"):
|
||||
self.add_props()
|
||||
self.set_perm()
|
||||
Logger.info(f"{self.id} installation finished")
|
||||
|
||||
def uninstall(self):
|
||||
self.remove()
|
||||
if hasattr(self, "apply_props"):
|
||||
self.remove_props()
|
||||
self.extra2()
|
||||
self.set_perm()
|
||||
Logger.info("Uninstallation finished")
|
||||
@@ -0,0 +1,31 @@
|
||||
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"]}
|
||||
partition = "system"
|
||||
dl_file_name = "hidestatusbar.apk"
|
||||
dl_link = ...
|
||||
act_md5 = ...
|
||||
files = [
|
||||
"product/overlay/"+dl_file_name
|
||||
]
|
||||
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):
|
||||
rro_dir = os.path.join(
|
||||
self.copy_dir, self.partition, "product", "overlay")
|
||||
if not os.path.exists(rro_dir):
|
||||
os.makedirs(rro_dir)
|
||||
shutil.copyfile(self.download_loc, os.path.join(
|
||||
rro_dir, "hidestatusbar.apk"))
|
||||
|
||||
def skip_extract(self):
|
||||
return True
|
||||
@@ -0,0 +1,66 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class Houdini(General):
|
||||
id = "libhoudini"
|
||||
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"]
|
||||
}
|
||||
act_md5 = ...
|
||||
dl_link = ...
|
||||
dl_file_name = "libhoudini.zip"
|
||||
extract_to = "/tmp/houdiniunpack"
|
||||
init_rc_component = """
|
||||
on early-init
|
||||
mount -t 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"
|
||||
exec -- /system/bin/sh -c "echo ':arm_dyn:M::\\\\x7f\\\\x45\\\\x4c\\\\x46\\\\x01\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x03\\\\x00\\\\x28::/system/bin/houdini:P' >> /proc/sys/fs/binfmt_misc/register"
|
||||
exec -- /system/bin/sh -c "echo ':arm64_exe:M::\\\\x7f\\\\x45\\\\x4c\\\\x46\\\\x02\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x02\\\\x00\\\\xb7::/system/bin/houdini64:P' >> /proc/sys/fs/binfmt_misc/register"
|
||||
exec -- /system/bin/sh -c "echo ':arm64_dyn:M::\\\\x7f\\\\x45\\\\x4c\\\\x46\\\\x02\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x03\\\\x00\\\\xb7::/system/bin/houdini64:P' >> /proc/sys/fs/binfmt_misc/register"
|
||||
"""
|
||||
apply_props = {
|
||||
"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": "libhoudini.so",
|
||||
"ro.enable.native.bridge.exec": "1",
|
||||
"ro.dalvik.vm.isa.arm": "x86",
|
||||
"ro.dalvik.vm.isa.arm64": "x86_64"
|
||||
}
|
||||
files = [
|
||||
"bin/arm",
|
||||
"bin/arm64",
|
||||
"bin/houdini",
|
||||
"bin/houdini64",
|
||||
"etc/binfmt_misc",
|
||||
"etc/init/houdini.rc",
|
||||
"lib/arm",
|
||||
"lib/libhoudini.so",
|
||||
"lib64/arm64",
|
||||
"lib64/libhoudini.so"
|
||||
]
|
||||
|
||||
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):
|
||||
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)
|
||||
init_path = os.path.join(
|
||||
self.copy_dir, self.partition, "etc", "init", "houdini.rc")
|
||||
if not os.path.isfile(init_path):
|
||||
os.makedirs(os.path.dirname(init_path), exist_ok=True)
|
||||
with open(init_path, "w") as initfile:
|
||||
initfile.write(self.init_rc_component)
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
import gzip
|
||||
import os
|
||||
import shutil
|
||||
import re
|
||||
from stuff.general import General
|
||||
from tools.helper import download_file, get_data_dir, host
|
||||
from tools.logger import Logger
|
||||
from tools import container
|
||||
|
||||
class Magisk(General):
|
||||
id = "magisk delta"
|
||||
partition = "system"
|
||||
dl_link = "https://huskydg.github.io/magisk-files/app-debug.apk"
|
||||
dl_file_name = "magisk.apk"
|
||||
extract_to = "/tmp/magisk_unpack"
|
||||
magisk_dir = os.path.join(partition, "etc", "init", "magisk")
|
||||
files = ["etc/init/magisk", "etc/init/bootanim.rc"]
|
||||
oringinal_bootanim = """
|
||||
service bootanim /system/bin/bootanimation
|
||||
class core animation
|
||||
user graphics
|
||||
group graphics audio
|
||||
disabled
|
||||
oneshot
|
||||
ioprio rt 0
|
||||
task_profiles MaxPerformance
|
||||
|
||||
"""
|
||||
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
|
||||
|
||||
on zygote-start
|
||||
exec u:r:su:s0 root root -- /sbin/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"
|
||||
|
||||
on property:init.svc.zygote=restarting
|
||||
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart
|
||||
|
||||
on property:init.svc.zygote=stopped
|
||||
exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart
|
||||
"""
|
||||
|
||||
def download(self):
|
||||
if os.path.isfile(self.download_loc):
|
||||
os.remove(self.download_loc)
|
||||
Logger.info("Downloading latest Magisk-Delta to {} now ...".format(self.download_loc))
|
||||
download_file(self.dl_link, self.download_loc)
|
||||
|
||||
# require additional setup
|
||||
def setup(self):
|
||||
Logger.info("Additional setup")
|
||||
magisk_absolute_dir = os.path.join(self.copy_dir, self.magisk_dir)
|
||||
data_dir = get_data_dir()
|
||||
shutil.copytree(magisk_absolute_dir, os.path.join(data_dir, "adb", "magisk"), dirs_exist_ok=True)
|
||||
|
||||
def copy(self):
|
||||
magisk_absolute_dir = os.path.join(self.copy_dir, self.magisk_dir)
|
||||
if not os.path.exists(magisk_absolute_dir):
|
||||
os.makedirs(magisk_absolute_dir, exist_ok=True)
|
||||
|
||||
if not os.path.exists(os.path.join(self.copy_dir, "sbin")):
|
||||
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)
|
||||
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)
|
||||
assets_files = [
|
||||
"addon.d.sh",
|
||||
"boot_patch.sh",
|
||||
"stub.apk",
|
||||
"util_functions.sh"
|
||||
]
|
||||
for f in assets_files:
|
||||
shutil.copyfile(os.path.join(self.extract_to, "assets", f), os.path.join(magisk_absolute_dir, f))
|
||||
|
||||
# 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:
|
||||
f_gz.write(self.oringinal_bootanim.encode('utf-8'))
|
||||
with open(bootanim_path, "w") as initfile:
|
||||
initfile.write(self.oringinal_bootanim+self.bootanim_component)
|
||||
|
||||
def set_path_perm(self, path):
|
||||
if "magisk" in path.split("/"):
|
||||
perms = [0, 2000, 0o755, 0o755]
|
||||
else:
|
||||
perms = [0, 0, 0o755, 0o644]
|
||||
|
||||
mode = os.stat(path).st_mode
|
||||
|
||||
if os.path.isdir(path):
|
||||
mode |= perms[2]
|
||||
else:
|
||||
mode |= perms[3]
|
||||
|
||||
os.chown(path, perms[0], perms[1])
|
||||
os.chmod(path, mode)
|
||||
|
||||
def extra1(self):
|
||||
self.delete_upper()
|
||||
self.setup()
|
||||
|
||||
# Delete the contents of upperdir
|
||||
def delete_upper(self):
|
||||
if container.use_overlayfs():
|
||||
sys_overlay_rw = "/var/lib/waydroid/overlay_rw"
|
||||
files = [
|
||||
"system/system/etc/init/bootanim.rc",
|
||||
"system/system/etc/init/bootanim.rc.gz",
|
||||
"system/system/etc/init/magisk",
|
||||
"system/system/addon.d/99-magisk.sh",
|
||||
"vendor/etc/selinux/precompiled_sepolicy"
|
||||
]
|
||||
|
||||
for f in files:
|
||||
file = os.path.join(sys_overlay_rw, f)
|
||||
if os.path.isdir(file):
|
||||
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()
|
||||
files = [
|
||||
os.path.join(data_dir, "adb/magisk.db"),
|
||||
os.path.join(data_dir, "adb/magisk")
|
||||
]
|
||||
for file in files:
|
||||
if os.path.isdir(file):
|
||||
shutil.rmtree(file)
|
||||
elif os.path.isfile(file):
|
||||
os.remove(file)
|
||||
bootanim_path = os.path.join(self.copy_dir, self.partition, "etc", "init", "bootanim.rc")
|
||||
if container.use_overlayfs():
|
||||
if os.path.exists(bootanim_path):
|
||||
os.remove(bootanim_path)
|
||||
else:
|
||||
with open(bootanim_path, "w") as initfile:
|
||||
initfile.write(self.oringinal_bootanim)
|
||||
+176
@@ -0,0 +1,176 @@
|
||||
import os
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class MicroG(General):
|
||||
id = "MicroG"
|
||||
partition = "system"
|
||||
fdroid_repo_apks = {
|
||||
"com.aurora.store_41.apk": "9e6c79aefde3f0bbfedf671a2d73d1be",
|
||||
"com.etesync.syncadapter_20300.apk": "997d6de7d41c454d39fc22cd7d8fc3c2",
|
||||
"com.aurora.adroid_8.apk": "0010bf93f02c2d18daf9e767035fefc5",
|
||||
"org.fdroid.fdroid.privileged_2130.apk": "b04353155aceb36207a206d6dd14ba6a",
|
||||
"org.microg.nlp.backend.ichnaea_20036.apk": "0b3cb65f8458d1a5802737c7392df903",
|
||||
"org.microg.nlp.backend.nominatim_20042.apk": "88e7397cbb9e5c71c8687d3681a23383",
|
||||
}
|
||||
microg_apks= {
|
||||
"com.google.android.gms-223616054.apk": "a945481ca5d33a03bc0f9418263c3228",
|
||||
"com.google.android.gsf-8.apk": "b2b4ea3642df6158e14689a4b2a246d4",
|
||||
"com.android.vending-22.apk": "6815d191433ffcd8fa65923d5b0b0573",
|
||||
"org.microg.gms.droidguard-14.apk": "4734b41c1a6bc34a541053ddde7a0f8e"
|
||||
}
|
||||
priv_apps = ["com.google.android.gms", "com.android.vending"]
|
||||
dl_links = {
|
||||
"Standard": [
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-Standard-2.11.1-20230429100529.zip",
|
||||
"0fe332a9caa3fbb294f2e2b50f720c6b"
|
||||
],
|
||||
"NoGoolag": [
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-NoGoolag-2.11.1-20230429100545.zip",
|
||||
"ff920f33f4c874eeae4c0444be427c68"
|
||||
],
|
||||
"UNLP": [
|
||||
"https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-UNLP-2.11.1-20230429100555.zip",
|
||||
"6136b383153c2a6797d14fb4d7ca3f97"
|
||||
],
|
||||
"Minimal": [
|
||||
"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"
|
||||
"cc071f4f776cbc16c4c1f707aff1f7fa"
|
||||
]
|
||||
}
|
||||
dl_link = ...
|
||||
act_md5 = ...
|
||||
dl_file_name = ...
|
||||
sdk = ...
|
||||
extract_to = "/tmp/microg/extract"
|
||||
rc_content = '''
|
||||
on property:sys.boot_completed=1
|
||||
start microg_service
|
||||
|
||||
service microg_service /system/bin/sh /system/bin/npem
|
||||
user root
|
||||
group root
|
||||
oneshot
|
||||
'''
|
||||
files = [
|
||||
"priv-app/GoogleBackupTransport",
|
||||
"priv-app/MicroGUNLP",
|
||||
"priv-app/MicroGGMSCore",
|
||||
"priv-app/MicroGGMSCore/lib/x86_64/libmapbox-gl.so",
|
||||
"priv-app/MicroGGMSCore/lib/x86_64/libconscrypt_gmscore_jni.so",
|
||||
"priv-app/MicroGGMSCore/lib/x86_64/libcronet.102.0.5005.125.so",
|
||||
"priv-app/PatchPhonesky",
|
||||
"priv-app/PatchPhonesky/lib/x86_64/libempty_x86_64.so",
|
||||
"priv-app/AuroraServices",
|
||||
"bin/npem",
|
||||
"app/GoogleCalendarSyncAdapter",
|
||||
"app/NominatimNLPBackend",
|
||||
"app/MicroGGSFProxy",
|
||||
"app/LocalGSMNLPBackend",
|
||||
"app/DejaVuNLPBackend",
|
||||
"app/MozillaUnifiedNLPBackend",
|
||||
"app/AppleNLPBackend",
|
||||
"app/AuroraDroid",
|
||||
"app/LocalWiFiNLPBackend",
|
||||
"app/GoogleContactsSyncAdapter",
|
||||
"app/MicroGGSFProxy/MicroGGSFProxy",
|
||||
"framework/com.google.widevine.software.drm.jar",
|
||||
"framework/com.google.android.media.effects.jar",
|
||||
"framework/com.google.android.maps.jar",
|
||||
"lib64/libjni_keyboarddecoder.so",
|
||||
"lib64/libjni_latinimegoogle.so",
|
||||
"etc/default-permissions/microg-permissions.xml",
|
||||
"etc/default-permissions/microg-permissions-unlp.xml",
|
||||
"etc/default-permissions/gsync.xml",
|
||||
"etc/sysconfig/nogoolag.xml",
|
||||
"etc/sysconfig/nogoolag-unlp.xml",
|
||||
"etc/init/microg.rc",
|
||||
"etc/permissions/com.google.android.backuptransport.xml",
|
||||
"etc/permissions/com.android.vending.xml",
|
||||
"etc/permissions/foss-permissions.xml",
|
||||
"etc/permissions/com.google.android.gms.xml",
|
||||
"etc/permissions/com.aurora.services.xml",
|
||||
"etc/permissions/com.google.android.maps.xml",
|
||||
"etc/permissions/com.google.widevine.software.drm.xml",
|
||||
"etc/permissions/com.google.android.media.effects.xml",
|
||||
"lib/libjni_keyboarddecoder.so",
|
||||
"lib/libjni_latinimegoogle.so",
|
||||
]
|
||||
|
||||
def __init__(self, android_version="11", variant="Standard") -> None:
|
||||
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.dl_file_name = f'MinMicroG-{variant}.zip'
|
||||
if android_version == "11":
|
||||
self.sdk = 30
|
||||
elif android_version == "13":
|
||||
self.sdk = 33
|
||||
|
||||
def copy(self):
|
||||
Logger.info("Copying libs and apks...")
|
||||
dst_dir = os.path.join(self.copy_dir, self.partition)
|
||||
src_dir = os.path.join(self.extract_to, "system")
|
||||
if "arm" in self.arch[0]:
|
||||
sub_arch = "arm"
|
||||
else:
|
||||
sub_arch = "x86"
|
||||
if 64 == self.arch[1]:
|
||||
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)
|
||||
# 遍历文件
|
||||
if dir_name.startswith('-') and dir_name.endswith('-'):
|
||||
archs, sdks = [], []
|
||||
for i in dir_name.split("-"):
|
||||
if i.isdigit():
|
||||
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:
|
||||
continue
|
||||
else:
|
||||
flag = True
|
||||
|
||||
for file in files:
|
||||
src_file_path = os.path.join(root, file)
|
||||
if not flag:
|
||||
dst_file_path = os.path.join(dst_dir, os.path.relpath(
|
||||
src_file_path, src_dir))
|
||||
else:
|
||||
dst_file_path = os.path.join(dst_dir, os.path.relpath(
|
||||
os.path.join(os.path.dirname(root), file), 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}")
|
||||
shutil.copy2(src_file_path, dst_file_path)
|
||||
if os.path.splitext(dst_file_path)[1].lower() == ".apk":
|
||||
self.extract_app_lib(dst_file_path)
|
||||
|
||||
rc_dir = os.path.join(dst_dir, "etc/init/microg.rc")
|
||||
if not os.path.exists(os.path.dirname(rc_dir)):
|
||||
os.makedirs(os.path.dirname(rc_dir))
|
||||
with open(rc_dir, "w") as f:
|
||||
f.write(self.rc_content)
|
||||
|
||||
def extra2(self):
|
||||
system_dir = os.path.join(self.copy_dir, self.partition)
|
||||
files = [key.split("_")[0] for key in self.fdroid_repo_apks.keys()]
|
||||
files += [key.split("-")[0] for key in self.microg_apks.keys()]
|
||||
for f in files:
|
||||
if f in self.priv_apps:
|
||||
file = os.path.join(system_dir, "priv-app", f)
|
||||
else:
|
||||
file = os.path.join(system_dir, "app", f)
|
||||
if os.path.isdir(file):
|
||||
shutil.rmtree(file)
|
||||
elif os.path.isfile(file):
|
||||
os.remove(file)
|
||||
@@ -0,0 +1,43 @@
|
||||
import os
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
class Ndk(General):
|
||||
id = "libndk"
|
||||
partition = "system"
|
||||
dl_link = "https://github.com/supremegamers/vendor_google_proprietary_ndk_translation-prebuilt/archive/181d9290a69309511185c4417ba3d890b3caaaa8.zip"
|
||||
dl_file_name = "libndktranslation.zip"
|
||||
extract_to = "/tmp/libndkunpack"
|
||||
act_md5 = "0beff55f312492f24d539569d84f5bfb"
|
||||
apply_props = {
|
||||
"ro.product.cpu.abilist": "x86_64,x86,armeabi-v7a,armeabi,arm64-v8a",
|
||||
"ro.product.cpu.abilist32": "x86,armeabi-v7a,armeabi",
|
||||
"ro.product.cpu.abilist64": "x86_64,arm64-v8a",
|
||||
"ro.dalvik.vm.native.bridge": "libndk_translation.so",
|
||||
"ro.enable.native.bridge.exec": "1",
|
||||
"ro.vendor.enable.native.bridge.exec": "1",
|
||||
"ro.vendor.enable.native.bridge.exec64": "1",
|
||||
"ro.ndk_translation.version": "0.2.3",
|
||||
"ro.dalvik.vm.isa.arm": "x86",
|
||||
"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*"
|
||||
]
|
||||
|
||||
def copy(self):
|
||||
Logger.info("Copying libndk library files ...")
|
||||
shutil.copytree(os.path.join(self.extract_to, "vendor_google_proprietary_ndk_translation-prebuilt-181d9290a69309511185c4417ba3d890b3caaaa8", "prebuilts"), os.path.join(self.copy_dir, self.partition), dirs_exist_ok=True)
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import gzip
|
||||
import os
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
from tools import container
|
||||
|
||||
|
||||
class Nodataperm(General):
|
||||
id = "nodataperm"
|
||||
dl_links = {
|
||||
"11": ["https://github.com/ayasa520/hack_full_data_permission/archive/refs/heads/main.zip",
|
||||
"eafd7b0986f3edaebaf1dd89f19d49bf"],
|
||||
"13": ["", ""]
|
||||
}
|
||||
dl_file_name = "nodataperm.zip"
|
||||
extract_to = "/tmp/nodataperm"
|
||||
dl_link = ...
|
||||
act_md5 = ...
|
||||
partition = "system"
|
||||
files = [
|
||||
"etc/nodataperm.sh",
|
||||
"etc/init/nodataperm.rc",
|
||||
"framework/services.jar"
|
||||
]
|
||||
|
||||
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):
|
||||
extract_path = os.path.join(
|
||||
self.extract_to, "hack_full_data_permission-main")
|
||||
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 ...")
|
||||
shutil.copytree(extract_path, os.path.join(
|
||||
self.copy_dir, self.partition), dirs_exist_ok=True)
|
||||
|
||||
def extra2(self):
|
||||
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)
|
||||
@@ -0,0 +1,43 @@
|
||||
import os
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
|
||||
class Smartdock(General):
|
||||
id = "smartdock"
|
||||
dl_link = "https://github.com/ayasa520/smartdock/releases/download/v1.9.7/smartdock.zip"
|
||||
partition = "system"
|
||||
extract_to = "/tmp/smartdockunpack"
|
||||
dl_file_name = "smartdock.zip"
|
||||
act_md5 = "912e00189c562505114cce62c7aa9478"
|
||||
apply_props = { "qemu.hw.mainkeys" : "1" }
|
||||
files = [
|
||||
"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
|
||||
|
||||
service set_home_activity /system/bin/sh -c "cmd package set-home-activity cu.axel.smartdock/.activities.LauncherActivity"
|
||||
user root
|
||||
group root
|
||||
oneshot
|
||||
'''
|
||||
|
||||
def copy(self):
|
||||
if not os.path.exists(os.path.join(self.copy_dir, self.partition, "priv-app", "SmartDock")):
|
||||
os.makedirs(os.path.join(self.copy_dir, self.partition, "priv-app", "SmartDock"))
|
||||
if not os.path.exists(os.path.join(self.copy_dir, self.partition, "etc", "permissions")):
|
||||
os.makedirs(os.path.join(self.copy_dir, self.partition, "etc", "permissions"))
|
||||
shutil.copyfile(os.path.join(self.extract_to, "app-release.apk"),
|
||||
os.path.join(self.copy_dir, self.partition, "priv-app/SmartDock/smartdock.apk"))
|
||||
shutil.copyfile(os.path.join(self.extract_to, "permissions_cu.axel.smartdock.xml"),
|
||||
os.path.join(self.copy_dir, self.partition, "etc", "permissions", "permissions_cu.axel.smartdock.xml"))
|
||||
|
||||
rc_dir = os.path.join(self.copy_dir, self.partition, "etc/init/smartdock.rc")
|
||||
if not os.path.exists(os.path.dirname(rc_dir)):
|
||||
os.makedirs(os.path.dirname(rc_dir))
|
||||
self.extract_app_lib(os.path.join(self.copy_dir, self.partition, "priv-app/SmartDock/smartdock.apk"))
|
||||
with open(rc_dir, "w") as f:
|
||||
f.write(self.rc_content)
|
||||
@@ -0,0 +1,46 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class Widevine(General):
|
||||
id = "widevine"
|
||||
partition = "vendor"
|
||||
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"]
|
||||
},
|
||||
# "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"]
|
||||
}
|
||||
}
|
||||
dl_file_name = "widevine.zip"
|
||||
extract_to = "/tmp/widevineunpack"
|
||||
files = [
|
||||
"bin/hw/*widevine",
|
||||
"bin/move_widevine_data.sh",
|
||||
"etc/init/*widevine.rc",
|
||||
"etc/vintf/manifest/*widevine.xml",
|
||||
"lib/libwvhidl.so",
|
||||
"lib/mediadrm",
|
||||
"lib64/mediadrm"
|
||||
]
|
||||
|
||||
def __init__(self, android_version) -> None:
|
||||
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]
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user