Pmbootstrap development guide
What is this
args variable used everywhere?
See the big comment at the top of
pmb.helpers.run.user() instead of
subprocess because these write to the log file.
The passed commands gets interpreted as single command, and not executed in a shell. This means something like the following will not work:
pmb.chroot.root(args, ["echo", "test", ">", "/tmp/test"])
Instead, if you need shell functionality in the call, you can wrap the call with
sh -c. Here's one example with the parameters correctly escaped (you don't need to do that for the strings in this example, but if you pass variables then they should be escaped properly):
shell_cmd = "echo " + shutil.quote("test") + " > " + shutil.quote("/tmp/test") pmb.chroot.root(args, ["sh", "-c", shell_cmd])
Another technique (especially if you need to run many commands in the shell at once) is writing all commands down into a temporary file and executing it with the shell, see for example pmb/chroot/initfs.py.
Writing files to the chroot
The users in the chroots (root and pmos) have different user IDs than the user of the host system. Therefore we can't just write a file to anywhere in the chroot. But we can write to
/tmp and move the file afterwards:
with open("tmp/somefile", "w") as handle: handle.write("It works") pmb.chroot.root(args, ["mv", "/tmp/somefile", "/etc/somefile"])
Whenever you change the installation process, also adjust the recovery zip installer (which performs a good part of the installation procedure directly on the Android device with a shell script).