X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/waydroid.git/blobdiff_plain/54dbd9258fbd735f06758df4a08ef38d15b4d87d..ebe075c0d1a4924329386fd29341d08af1c59f33:/tools/helpers/lxc.py?ds=sidebyside diff --git a/tools/helpers/lxc.py b/tools/helpers/lxc.py index cac4bb5..c0ac9d1 100644 --- a/tools/helpers/lxc.py +++ b/tools/helpers/lxc.py @@ -6,6 +6,7 @@ import re import logging import glob import shutil +import time import platform import gbinder import tools.config @@ -41,7 +42,7 @@ def generate_nodes_lxc_config(args): make_entry("/dev/zero") make_entry("/dev/null") make_entry("/dev/full") - make_entry("/dev/ashmem", check=False) + make_entry("/dev/ashmem") make_entry("/dev/fuse") make_entry("/dev/ion") make_entry("/dev/char", options="bind,create=dir,optional 0 0") @@ -52,7 +53,9 @@ def generate_nodes_lxc_config(args): make_entry("/dev/pvr_sync") make_entry("/dev/pmsg0") make_entry("/dev/dxg") - make_entry(tools.helpers.gpu.getDriNode(args), "dev/dri/renderD128") + render, card = tools.helpers.gpu.getDriNode(args) + make_entry(render, "dev/dri/renderD128") + make_entry(card, "dev/dri/card0") for n in glob.glob("/dev/fb*"): make_entry(n) @@ -216,7 +219,7 @@ def make_base_props(args): props.append("sys.use_memfd=true") egl = tools.helpers.props.host_get(args, "ro.hardware.egl") - dri = tools.helpers.gpu.getDriNode(args) + dri, _ = tools.helpers.gpu.getDriNode(args) gralloc = find_hal("gralloc") if not gralloc: @@ -344,13 +347,27 @@ def setup_host_perms(args): def status(args): command = ["lxc-info", "-P", tools.config.defaults["lxc"], "-n", "waydroid", "-sH"] out = subprocess.run(command, stdout=subprocess.PIPE).stdout.decode('utf-8').strip() - os.chmod(args.log, 0o666) return out +def wait_for_running(args): + lxc_status = status(args) + timeout = 10 + while lxc_status != "RUNNING" and timeout > 0: + lxc_status = status(args) + logging.info( + "waiting {} seconds for container to start...".format(timeout)) + timeout = timeout - 1 + time.sleep(1) + if lxc_status != "RUNNING": + raise OSError("container failed to start") + def start(args): command = ["lxc-start", "-P", tools.config.defaults["lxc"], "-F", "-n", "waydroid", "--", "/init"] tools.helpers.run.user(args, command, output="background") + wait_for_running(args) + # Workaround lxc-start changing stdout/stderr permissions to 700 + os.chmod(args.log, 0o666) def stop(args): command = ["lxc-stop", "-P", @@ -366,6 +383,21 @@ def unfreeze(args): tools.config.defaults["lxc"], "-n", "waydroid"] tools.helpers.run.user(args, command) +ANDROID_ENV = { + "PATH": "/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin", + "ANDROID_ROOT": "/system", + "ANDROID_DATA": "/data", + "ANDROID_STORAGE": "/storage", + "ANDROID_ART_ROOT": "/apex/com.android.art", + "ANDROID_I18N_ROOT": "/apex/com.android.i18n", + "ANDROID_TZDATA_ROOT": "/apex/com.android.tzdata", + "ANDROID_RUNTIME_ROOT": "/apex/com.android.runtime", +} + +def android_env_attach_options(): + env = [k + "=" + v for k, v in ANDROID_ENV.items()] + return [x for var in env for x in ("--set-var", var)] + def shell(args): state = status(args) if state == "FROZEN": @@ -374,24 +406,17 @@ def shell(args): logging.error("WayDroid container is {}".format(state)) return command = ["lxc-attach", "-P", tools.config.defaults["lxc"], - "-n", "waydroid", "--"] + "-n", "waydroid", "--clear-env"] + command.extend(android_env_attach_options()) + command.append("--") if args.COMMAND: command.extend(args.COMMAND) else: command.append("/system/bin/sh") - subprocess.run(command, env={"PATH": os.environ['PATH'] + ":/system/bin:/vendor/bin"}) + subprocess.run(command) if state == "FROZEN": freeze(args) def logcat(args): - state = status(args) - if state == "FROZEN": - unfreeze(args) - elif state != "RUNNING": - logging.error("WayDroid container is {}".format(state)) - return - command = ["lxc-attach", "-P", tools.config.defaults["lxc"], - "-n", "waydroid", "--", "/system/bin/logcat"] - subprocess.run(command) - if state == "FROZEN": - freeze(args) + args.COMMAND = ["/system/bin/logcat"] + shell(args)