Thursday, May 8, 2014

5 things that are working for me right now

Hi there! Today I'd like to share with you the results of my recent actions and experiments. Even if I don't create new apps, I try to at least update the ones already existing, with some new features, bug fixes and enhancements. Here's the list of five items that I consider the most successful/promising/helpful. I'm sure you can find there something that will work for you as well.

1. Online crash reporting solutions

Since I started using sites like BugSense or Crittercism, I think they are a must for every app. The Google Play's crash and ANR's section lets you see only a fraction on errors. It doesn't show any nice reports either. External systems like the ones mentioned earlier are much more powerful. They let you mark at which version each bug was fixed, they can give you additional exception information, they let you send reports about caught exceptions, they send you email reports, and their look-and-feel is much nicer.

In the past I used ACRA as well. It gives you more flexibility when it comes to data storage - you can even code your own adapter doing whatever you like with the exception that was caught. For me it was too complicated and I preferred other solutions, but I just took a look at their website and it seems that a lot has change in the past couple of months. Perhaps you will want to give them a try as well.

What I want to test in the near future is Crashlytics. Since Twitter acquired it, it has become completely free and I've heard a lot of good words about it. It looks quite pretty and professional as well. BugSense and Crittercism offer free plans, which usually are quite sufficient for indie developers, but to use their pro versions you have to pay, which is not an option for me right now.

Anyway, start using online crash reporting, if you aren't already doing it. It takes one line of code to add them and they let you avoid a lot of bad ratings and reviews.

And when it comes to user feedback, let's take a look at the next point.

2. Discreet App Rate

As the name suggests, it a neat library displaying a small banner asking the user to rate the app. The banner only shows up after the app has been opened a specific number of times or when the app has been installed for a while. It's easy to dismiss and it doesn't take the whole screen, which can annoy users and actually make them give you one star. If you're interested in the motivation behind it, you can read the article Nicolas Ponepuy (the author of the library) wrote.

I found out about Discreet App Rate through the Android Weekly newsletter. It's a great source of information about new Android libraries, tools and learning resources. You might want to sign up for it as well. Btw, my interviews got featured on it a couple of times at the beginning of its existence, which I'm extremely proud of.

But back to the main subject. Since I installed Discreet App Rate in my Milan Metro app (more than 3 weeks ago), the number of ratings has practically doubled and the average rating has increased from 3.8 to 4.24. It caused a 20% rise in downloads as well, although I changed the icon, screenshots and some app details as well, so the positive trend might have been caused by those as well.

3. Ad networks other than AdMob

I really like AdMob for its reliability, transparency, on-time payouts and in-depth statistics. Nevertheless, I don't think you should be using only their ads, because they don't give you the highest CPMs and possible ad types are definitely not up to date with the industry standards. My AdMob average CPM is only $0.58, which is not very high, although I do get up to $3.69 on a banner (!) in my Toothbrush app (I still can't explain this anomaly).

Anyway, I have been using Airpush and AdBuddiz for some time extensively and they give me average CPMs of $1.44 and $1.01 respectively. I use both of them with my Blobby Volley game, so the results should be representative. I have Airpush in one of my other apps - Supermarkets in Milan and it has a CPM of $2.58 (unfortunately with much fewer impressions).

In conclusion, if you experiment with alternative ad networks, they can basically triple your income. I'm probably not doing it well enough anyway, as Matey Nenoff mentioned in the comments on my last income report. There are video ads and other specialized ad networks that migh give me better rates. I will definitely commit some time in the future to experimenting some more.

Just as a remark, using too many ad networks might not be good either. They usually pay you after you've reached a certain level of income (like $100), so if you don't make too much, you may never see the money or you'll have to wait for it longer. Also, they don't always give you access to full statistics (I calculated the AdBuddiz CPM on a calculator), so it's not easy for you to analyze the traffic. Finally, they have limited payment options, so if you're used to being paid via PayPal or wire transfer, you might get disappointed and be forced to create an account on a third party money transfer site.

4. Transforming SVG images to Android Drawables

This point will be more technical, but it really changed a lot for me. Remember February 2013 and my post about using SVG images in Android apps? Probably not :) Just as a quick reminder then. Vector images are very nice to use, because they don't lose quality while magnified. They also usually take up much less space and memory than bitmaps. Sometimes they are the only way to go, when an image is very big and can't be loaded into memory. That was the case with my Milan Metro app.

Unfortunately Android does not support SVG images natively, so you have to use an external library to transform them into instances of the Drawable class. The existing libraries are not of very high quality though - some of them only support a subset of the SVG standard, others don't let you use text, different ones just transform the image into a bitmap, which may not be what you want. All of them have to parse the SVG file first, which takes quite some time (up to a couple of seconds). These disadvantages make it quite hard to use SVG images.

What I did was as follows. I used the svg-android-2 library (an updated version of the svg-android library I was using previously) not to parse SVG files and make Drawables out of them, but to print the code that would be executed in the process. This way I had the whole image in Java code, looking more or less like this:

public class MapPicture extends Picture {
    private final Canvas canvas;
    private final Paint fillPaint = new Paint();
    private final Paint strokePaint = new Paint();
    public MapPicture() {
        canvas = beginRecording(530, 415);
        canvas.concat(/* some matrix transformation */);
        canvas.drawText("PORTA ROMANA FS", 0.0f, 0.0f, fillPaint);
        /* other shapes and text */

I didn't have to add the SVG parsing library any more, the image loading time was practically unnoticeable and the map looked just as before. It wasn't as easy as I first thought to print the Java code instead of executing it, but it was totally worth trying. I started even thinking about creating a tool for other developers to do the same thing, and start using vector images without the necessity of adding external libraries and wasting time on svg file parsing. If you are interested in such a tool, please let me know in the comments section.

5. Simple apps

Many people think that by making a mobile app they can get extremely rich. Sometimes they spend a lot of time and money to create one, just to find out that it's a total flop. I believe such an approach to be wrong, at least for indie developers like me.

Making something small and simple is usually what works for me. I don't get bored and frustrated during the development process, I don't need to commit half a year of my free time to finishing the app, I can see if it has a potential of being popular much faster and then perhaps add more features.

I still can't believe that my Toilet Sounds game, which was basically a practice excercise for me, when I was trying to learn how to play sounds on a physical device, has been downloaded 40,000 times. I guess sometimes you just can't guess what people will like.

Another thing is, I'm quite ok with having 10 simpler apps, each making me a smaller amount of money. Complexity brings a lot of trouble - tons of crashes and pissed off users, long development time, investment in design and graphic resources, etc. Remember that if you create a map app or a simple point-and-click game, you can always make another one based on the existing code, e.g. make a map of something else, reskin the game to be played in another environment. This way every bug can be corrected in the common code base and not cause trouble in every derived version.

To put it in short once again, my extremely simple apps have probably the same amount of downloads as the more complex ones, although they took 1/10 of their development time. They made me realize what may or may not be successful (live wallpapers suck), they usually crash much less, they build up my portfolio. I'm definitely going to be making more of them in the future.

I hope you liked my list. I might make another one in the future, because I quite enjoyed the process of creating it. In the meantime, feel free to let me know what's working for you.


  1. Hi Bartek,

    Thanks for another nice post. I totally agree with your last point. It just goes to show it's the app idea that matters. And also most of the time complex apps would take too much time for a single developer.

    Keep up the great work!

    1. Thanks Henry! I'm glad you liked the post. I hope everyone else found something interesting for themselves as well.