Motivation: Having Meta and Ctrl available on the virtual keyboard seems much superior than showing control keys in the tab bar.

There are Android keyboards that support Alt and Ctrl keys. The problem is that typing M-! on such a keyboard (I only tested Unexpected Keyboard) does not actually work as expected. However e.g. M-@ works as expected.

Please see this github issue for more: https://github.com/Julow/Unexpected-Keyboard/issues/921

Summary of the Issue so far:
According to the author of Unexpected Keyboard this is due to a limitation in Android (and therefore likely any virtual keyboard with control keys would run into this issue). Iit seems to be the kind of limitation where you can work around the issue by adding a small bit of code to the input handling logic in Emacs.

Note that it is possible to work around, at least for the Meta key, by pressing the escape key instead of the meta key (which is also a key on Unexpected Keyboard).