Google Play PVR Filtering

In the last version of Mobile Montessori I converted all of the PNG textures to PVR.CCZ and like any good dev I added the gl_IMG_texture_compression_pvrtc filter to the manifest. My understanding was that Google Play will filter out devices that do not support that GL extension and since many GPU's other than PowerVR support it I wasn't too concerned.

I submitted the update to the market and saw the apps user base start to dwindle, but I didn't know why. So I decided to download the app from the market thinking that maybe there is something wrong with the download. I went to the link and was instantly confused by the message "This app is not compatible with your device".

Really? I know it works fine because I developed the app with my phone. So what gives?

It turns out that if you use a gl_IMG_texture_compression_pvrtc filter in your android manifest then google play will filer out devices that do not have a PowerVR SGX530/540 GPU, the filter doesn't care if the customers GPU supports that extension or not.

So what's a developer to do if they want to use PVR textures? There are 3 solutions to this problem:

1. Provide two sets of texture assets in your apk, a widely supported format like PNG and PVR. Then, query the GPU to determine if it supports PVR extension and use it if supported. This is probably the best trade off, in my opinion. Some may argue that it will cause apk bloat, however my experience is that PVR textures are about 10% the size of the same PNG. So the "bloat" is minimal.

2. You can omit the filter declaration in your manifest and have the app installed on almost any android device but you run the risk of crashing on devices that do not support the PVR extension. Not a good option, in my opinion, because you'll have an unhappy customer and poor market ratings.

3. Don't use PVR at all. Use PNG or another widely supported format. However you lose the benefits offered by the PVR format, like faster loading.

Lesson learned!

Now to fix Mobile Montessori and hopefully get the customer base back.

Shared publiclyView activity