]> glassweightruler.freedombox.rocks Git - waydroid.git/blobdiff - tools/helpers/lxc.py
session: Also log dbus connection exceptions
[waydroid.git] / tools / helpers / lxc.py
index cac4bb5dbc6551147275c9f13582029b51517fa7..c0ac9d122da5dba67eb76ad40076fc1b15d8e1dc 100644 (file)
@@ -6,6 +6,7 @@ import re
 import logging
 import glob
 import shutil
 import logging
 import glob
 import shutil
+import time
 import platform
 import gbinder
 import tools.config
 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/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")
     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("/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)
 
     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")
         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:
 
     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()
 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
 
     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")
 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",
 
 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)
 
                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":
 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"],
         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")
     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):
     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)