Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to maintain a paid and free version of an app

I have built a free version of a game app which is now on the market with a name like com.mycompany.myfreegame. Now I want to make a paid version. There will no doubt be tweaks and bug-fixes to both versions required for years to come so I want to encapsulate the encoding of the free vs paid information in as compact a way possible so that I can essentially fix bugs in both versions simultaneously.

If the entirety of the differences between the two versions was handled at runtime then I could set a single flag in the source code and that would be the end of the problem. Unfortunately there are two other things to consider,

  1. The name of the package needs to be different between the two versions.
  2. Some xml needs to be different. For example the free version needs linear Layouts for holding ads, the paid version does not.

What is the simplest way to achieve this goal?

like image 634
Mick Avatar asked May 08 '12 13:05

Mick


2 Answers

I think the first approach I'd try is using 3 projects in Eclipse: one for either version of the game, and a library project with all of the shared code. The library project would be where all the code for your core gameplay goes, and the version specific projects manage loading different layouts, putting ads in the free version, and adding levels/features/hats to the paid version.

You might be able to accomplish your goal of a single code base with a compiler flag using an ant task, but that's beyond me.

like image 53
dwemthy Avatar answered Oct 12 '22 19:10

dwemthy


I think what you're looking for is a Library Project http://developer.android.com/guide/developing/projects/index.html#LibraryProjects

From that web page:

If you are creating an application that exists in both free and paid versions. You move the part of the application that is common to both versions into a library project. The two dependent projects, with their different package names, will reference the library project and provide only the difference between the two application versions.

Another question, very similar to this one, seems to have a decent discussion and answer: Multiple Apps with a shared code base

Edit: Here is a link on how to implement a library project. http://developer.android.com/guide/developing/projects/projects-eclipse.html

In regards to different versions being slightly different, a library project can accomodate. The library project is built first, then the parent (the project that uses the library) is built last and they are merged together. Both projects can define the same resource identifiers and the project built last (parent project), gets priority (overwrites). So essentially, you can override strings/layouts (possibly more, not sure?) in the parent/calling application.

For example: Say you have two projects, free and paid.You could create a string with a default implementation (free version) and override it in your paid version (parent app).

Code in shared libraries Strings.xml file:

<string name="AppName">My Application (Free)</string>

Code in parent app Strings.xml file:

<string name="AppName">My Application Premium</string>
like image 26
Gophermofur Avatar answered Oct 12 '22 19:10

Gophermofur