Draft #250

Closed
huakim wants to merge 66 commits from main into main
3 changed files with 223 additions and 8 deletions
Showing only changes of commit 453eb26e1a - Show all commits
+1 -1
View File
@@ -26,7 +26,7 @@ sudo venv/bin/python3 main.py
```bash ```bash
git clone --depth 1 --single-branch https://github.com/huakim/waydroid_script git clone --depth 1 --single-branch https://github.com/huakim/waydroid_script
cd waydroid_script cd waydroid_script
python3 -m venv venv venv/bin/python3 -m venv venv
venv/bin/pip install -r requirements.txt venv/bin/pip install -r requirements.txt
# install something # install something
sudo venv/bin/python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg, mitm} sudo venv/bin/python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg, mitm}
+25 -7
View File
@@ -21,6 +21,7 @@ from stuff.nodataperm import Nodataperm
from stuff.smartdock import Smartdock from stuff.smartdock import Smartdock
from stuff.widevine import Widevine from stuff.widevine import Widevine
from stuff.fdroidpriv import FDroidPriv from stuff.fdroidpriv import FDroidPriv
from stuff.gps import GPS
import tools.helper as helper import tools.helper as helper
from tools import container from tools import container
from tools import images from tools import images
@@ -76,7 +77,8 @@ def install_app(args):
install_list.append(Mitm(args.ca_cert_file)) install_list.append(Mitm(args.ca_cert_file))
if "fdroidpriv" in app: if "fdroidpriv" in app:
install_list.append(FDroidPriv(args.android_version)) 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(): if not container.use_overlayfs():
copy_dir = "/tmp/waydroid" copy_dir = "/tmp/waydroid"
container.stop() container.stop()
@@ -102,7 +104,6 @@ def install_app(args):
if not container.use_overlayfs(): if not container.use_overlayfs():
umount("vendor", copy_dir) umount("vendor", copy_dir)
umount("system", copy_dir) umount("system", copy_dir)
container.upgrade() container.upgrade()
def remove_app(args): def remove_app(args):
@@ -130,7 +131,8 @@ def remove_app(args):
remove_list.append(Nodataperm(args.android_version)) remove_list.append(Nodataperm(args.android_version))
if "hidestatusbar" in app: if "hidestatusbar" in app:
remove_list.append(HideStatusBar()) remove_list.append(HideStatusBar())
if "gps" in app:
remove_list.append(GPS())
if not container.use_overlayfs(): if not container.use_overlayfs():
copy_dir = "/tmp/waydroid" copy_dir = "/tmp/waydroid"
container.stop() container.stop()
@@ -153,7 +155,6 @@ def hack_option(args):
hack_list.append(Nodataperm()) hack_list.append(Nodataperm())
if "hidestatusbar" in options: if "hidestatusbar" in options:
hack_list.append(HideStatusBar()) hack_list.append(HideStatusBar())
if not container.use_overlayfs(): if not container.use_overlayfs():
copy_dir = "/tmp/waydroid" copy_dir = "/tmp/waydroid"
container.stop() container.stop()
@@ -211,7 +212,8 @@ def interact():
if not action: if not action:
exit() 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 = [] hack_choices = []
if android_version == "11": if android_version == "11":
install_choices.extend(["widevine"]) install_choices.extend(["widevine"])
@@ -233,6 +235,19 @@ def interact():
default="Standard", default="Standard",
).execute() ).execute()
args.microg_variant = microg_variant 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 args.app = apps
install_app(args) install_app(args)
elif action == "Remove": elif action == "Remove":
@@ -276,7 +291,7 @@ def main():
'certified', help='Get device ID to obtain Play Store certification') 'certified', help='Get device ID to obtain Play Store certification')
certified.set_defaults(func=get_certified) certified.set_defaults(func=get_certified)
install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "mitm", "smartdock", "widevine"] install_choices = ["gapps", "microg", "libndk", "libhoudini", "magisk", "mitm", "smartdock", "widevine", "gps"]
hack_choices = ["nodataperm", "hidestatusbar"] hack_choices = ["nodataperm", "hidestatusbar"]
micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"] micrg_variants = ["Standard", "NoGoolag", "UNLP", "Minimal", "MinimalIAP"]
remove_choices = install_choices remove_choices = install_choices
@@ -284,7 +299,7 @@ def main():
arg_template = { arg_template = {
"dest": "app", "dest": "app",
"type": str, "type": str,
"nargs": '+', "nargs": '+'
} }
install_help = """ install_help = """
@@ -322,6 +337,9 @@ widevine: Add support for widevine DRM L3
hack_parser.set_defaults(func=hack_option) hack_parser.set_defaults(func=hack_option)
args = parser.parse_args() args = parser.parse_args()
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'): if hasattr(args, 'func'):
helper.check_root() helper.check_root()
args.func(args) args.func(args)
+197
View File
@@ -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()