Game Release Checklist

July 24, 2019

As you might have noticed I’m a hobbyist game developer and I have several games published on Google Play Store. I recently had a tiny game idea involving a timer and decided to try and develop and publish a game in less than 24 hours of work. Did I succeed? Yes. Did the game turn out to be fun? Not really, no. Check out the game here.

Part of what makes the process of developing and releasing a game this quick is an extensive template I have developed that I always start from. But there are also a bunch of stuff that needs to be done when going from development to a published app. Here I have gathered a checklist with the steps I always take.

DISCLAIMER: I only publish for Android so most of the steps below are probably not valid for iOS or other stores/platforms.

Template

Over the years I have developed a template repository from which I always start a new project. In it I have code for handling analytics through Firebase, ads through AdMob, game services through Google Play Services and a bunch of classes for handling input, creating screens and UIs. I might do a write up of my template some day but today I won’t go into the details of the implementations.

Checklist

Whenever I start working on a game I first implement and test the game logic before I add service integrations and other auxiliary stuff. At some point during the development cycle I then add services like analytics and ads to test them out together with the application and make sure everything works, and I usually do this in the following order:

  1. Keystore
  2. Play Console
  3. Firebase
  4. Game services
  5. AdMob
  6. Assets and store page
  7. Quality assurance
  8. Publish

1. Keystore

I start with creating a keystore.jks to store the key that will be used for signing releases. I have lately started using App signing by Google Play so the key in keystore.jks will in the future be used as what Google defines as an Upload key.

2. Play Console

To generate the app signing key noted above I then proceed by creating a new app in the Play Console. I then upload an APK to the internal test track just to enroll in app signing by Google. Make sure the APK you upload is signed with the keystore you created in step 1. You do not need to roll out the release now.

3. Firebase

After enrolling in app signing by Google I create a new Firebase project. I then proceed to add my applications to the project. I usually add the suffix .debug to the package name for my debug version so I need to add two applications to my firebase project: com.brulu.example and com.brulu.example.debug. For the debug version I use the keystore generated by Android Studio ($HOME/.android/debug.keystore). For the the release version I add two certificates: the one from the keystore generated in step 1 (the upload key) and the app signing key generated by Google which you can find in the Play Console.

To find out the SHA-1 for your keys you can add your signing configuration to app/build.gradle and then run the Gradle task signingReport in Android Studio:

android {
  ...
  signingConfigs {
    config {
        keyAlias 'keyname'
        keyPassword 'keyPassword'
        storeFile file('path/to/keystore.jks')
        storePassword 'storePassword'
    }
  }

  buildTypes {
    release {
      ...
      signingConfig signingConfigs.config
    }
  }
  ...
}

signingReport

After adding the applications I download the google-services.json that Firebase generates and add it to the application. I then enable Firebase Crashlytics for all versions and rebuild my application to see that the integration works.

4. Game Services

After creating the Firebase project I proceed by creating a game services project in the Play Console to test out Leaderboards and Achievements. When setting this up, make sure to link it to the Firebase project you created in step 3. Then go to Linked Apps and add all three of your variants (debug, release signed with upload key and release signed by Google) together with their SHA-1 keys.

Create your leaderboards and achievements and add the resulting IDs to your application (I keep all mine in a file called strings.xml which then populates AndroidManifest.xml).

Sometimes I run into trouble here when everything seems to be setup correctly. If you for some reason cannot authenticate against game services after adding your linked apps and adding yourself as a tester try this:

  1. Go to Google Developers Console.
  2. Go to the project with the same ID as your Firebase project. You can find the Project ID under project settings in the Firebase console.
  3. Go to Credentials and make sure you have three OAuth 2.0 client IDs of type Android, one for your debug version and two for your release versions.
  4. Go to the tab OAuth consent screen and check that ../auth/games is listed under Scopes for Google APIs.
    • If it isn’t, add it by clicking on Add scope and locating it.

scope

5. AdMob

After game services it is time to create an AdMob project. When testing ads I always use test ads but I tend to test out production ads before releasing my game. Make sure you add your device as a testing device as outlined in the guide above before using production ads in your application.

Set up a new project and make sure to link it to your Firebase project. Then proceed to create the ad units you want and add the ad identifiers to your application. I recommend keeping test ads in your debug version and real ads, with your device added as a test device, in your release versions. I tend to use two different strings.xml, one for debug and one for release, for this reason.

6. Assets & Store

After adding all integrations I usually go back to development and test everything and add leaderboards, achievements, analytics events etc. When the game feels releasable I start with the finishing touches which includes:

  1. Finish up the Pricing & distribution, Content Rating and App content sections in the Play console.
  2. Design a beautiful icon for the application and the store page. Remember to add it to your game services page aswell.
  3. Design an eye-catching feature graphic. This is also needed in the game services page.
  4. Capture at least two screenshots of your game for the store page. Please disable your ads before or edit them out :-).
  5. Write a short and full store description and one for your game service page aswell.
  6. Extra: Produce a trailer.

7. Quality assurance

Before publishing your app you should make sure to test it thoroughly to give your users the best possible experience. For hobbyist game developers like me it might not be possible to test locally on a wide range of devices, but there are options out there such as Firebase Test Lab that could help. One thing I noticed in my games after receiving a OnePlus 6T was that the banner ads were so big that they obscured the menu buttons. The reason for this was that I used AdSize.SMART_BANNER, and the screen on the OnePlus 6T is big enough to trigger a bigger ad. I was unaware of this issue for a very long time, and I assume that the experience of users with bigger phones might not have been as good as I thought it was.

So please, always test your games as much as possible before clicking on that publish button. I usually try to get help from friends and family to test out my games before releasing them to the public and ask them explicitly to not go easy on me. Beware though, you have to be prepared to get negative feedback and act on it.

8. Publish

Congratulations. With the above steps completed you are now ready to publish your game. Make sure to publish your game services before publishing the actual application, otherwise only testers will be able to utilize the game services.

Hopefully, this list might help if you get stuck somewhere between developing your application and publishing it. I might write a detailed post in the future about the template I’m using for quickly getting started. There also may or may not be plans to open source the template repository in the future.

If you found this useful or know someone whom it may help, please pass it along.

Until next time!

This post was updated on 2019-07-25

Have you found a typo or have any other suggestions for edit? Let me know in the comments below or create a PR on GitHub.