It turns out I was calling the function to setup openGL on the UI Thread. I was calling my draw() (etc) methods in the thread created by the Renderer attached to my GLSurfaceView . Because the setup method was being called on the UI thread the openGL used for hardware acceleration was being corrupted.
TL;DR: don't make ANY (even setup) calls outside of the Renderer class used for GLSurfaceView as it creates a separate thread so your openGL calls don't interfere with the openGL running on the UI Thread used for hardware acceleration.
An easy test to see if your app is plagued by this issue is to disable hardware acceleration in your android manifest and check whether the issue goes away or not:
<application android:hardwareAccelerated="false" ...>
I hope this helps someone else :)