In principle their "hello world" app should be easy to run, just attach a device and run:
react-native init HelloFuckingWorld
Instead of your "hello world" you get a nasty red screen telling you that the app cannot connect to a server. You damn everyone to hell, especially the stupid app that wants to connect to some triply-fucked server just to print a "hello, world" on its screen.
You decide to follow the instructions on the red screen, and do adb reverse tcp:8081 tcp:8081. The damn adb answers error: closed and your app still doesn't connect to anything at all. You curse the sdk, the app and the device, and then find out (by googling) that this instruction is only meant for the devices with Android version 5.0 and above. ReactNative, incidentally, works from Android 4.1 up.
You put the cursed device aside and take a less cursed one, preferably one that is running 5.0+. Luckily the makers of ReactNative made it so that if you shake the device furiously the dev menu pops up, and the first item on it is reloading a JS bundle from a server. I actually went there with my browser to see what it loads from there, and now I am gonna be seeing nightmares for the rest of my life.
The furious shaking is a nice touch. They sure know their audience.
You click the reload, and get the red screen of death again. Of course. You forgot to say adb reverse tcp:8081 tcp:8081 to the new device. You say it, and a number of unprintable words in addition to it. And wow, it actually loads! You have your "hello, world".
Yes, you have to find the old server process and kill it by hand. The new one is not gonna do anything useful until you do that. It's gonna look like everything is ok, but when you visit the url you see it still has the JS bundle for the previous app.