ReubenLi.NET

Monetization of android apps

The below points may not be the case for everyone, but I'm just sharing my personal experience with various forms of monetization for android apps.
 
Paid vs Free Apps
Clearly there are going to be intangibles that cannot be measured quantitatively (e.g. contribution to user base, etc...) but here are the figures:
Paid apps revenue = 84%
Free apps revenue = 16%
 
Highest paid app share = 39%
Highest free app share = 5%
 
*Also note that the free apps have been underperforming for quite a while due to poor monetization management on my part
 
Ad networks / mediators
mopub vs admob
been using mopub for the longest time. recently did a comparison and found that eCPMs were really low compared to admob. while setting a high min and using backfill was an option, I chose to switch most of my ads to admob anyway. we are talking about an eCPM increase from $0.20 to about $2.00 for some of my apps. needless to say profits from my free apps sky-rocketed. my top free app accounted for 26% of overall profits in the month after the change.
 
playhaven vs appbrain
I've put these two together because of similarities in the focus on interstitials. Honestly, I've had my ups and downs with appbrain but it has generally served me quite well. playhaven, on the other hand, is somewhat of a disappointment. I've noticed an increase in reviewers giving comments such as "full of annoying ads" after using playhaven, and profits are mediocre. The interstitials do tend to feel a little gimmicky as compared to the ones by appbrain (which first asks you whether you wanna go ahead to view the free apps). Now, I almost entirely just use playhaven to promote the "pro" version of a free app that is being used.
 

A beginners guide to j2objc

Let me first qualify that I'm hardly an expert and most of the following instructions were figures by trial and error. But if it helps you, great. Please let me know if there are mistakes as well.

Requirements: 

Mac OS X 
Xcode
Java SE
Android SDK
(versions depend on what is supported at the point in time you read this)

Setting up j2objc
I presume that you would have downloaded the files from the Google Group. In my case, I had to build from source to prevent errors from occuring. You would need the `make` command which comes with Xcode.
 
After building Xcode, one thing you could do is to move the built files into /usr/bin/ so that it can be called globally, saving on having to type the directory each time you need to convert files.
 
Using j2objc
The general rule is to use j2objc like how you would with javac, linking the sourcepaths and classpaths. e.g.:
j2objc -sourcepath src:gen -classpath lib:[androidsdkdirector]/android-8/android.jar -d [outputdirectory] src/com/example/*.java
assuming you are in the android project directory. Since your android apps depends on R.java, "gen" is necessary in sourcepath. If not you would get errors like: "error: src/com/example.java:488: Bitmap cannot be resolved to a type". You also need the android.jar (API level 8 in this example, change accordingly). The semi-colons work the same as in javac, simply a separator for a list of paths.

Note that j2objc does not have support for all libraries and you may find issues particularly with UI components and third-party libraries. If you get a "Translated 0 files: 0 errors, 0 warnings" message, it probably means you pointed to your java files wrongly. You could directly point to a single .java file if you project has only one (or you only want to translate one), or use the * wildcard to convert several java source files at the same time.
 
The .h and .m files should now be in your output directory. Sometimes, for some reason, they appear in the wrong location (in my android project folder) but its probably an error on my part.

What's next?

Once you import your .m and .h files into xcode, you have to set build rules: 
You may find that upon compliation, you still get errors such as import failures. This is most likely due to the lack of android header and implementation files. There is nothing much you can do. As mentioned earlier, UI components are not supported and should be removed from the source before attempting to compile.

[R] Plotting a decomposition by STL using ggplot

Wasn't too satisfied with the default stl plot available using plot and the process of making a normal vector a ts object so I wrote a script to do so:

decomp <- function(series,frequency){
  na.stinterp(series)  -> x   #this is for interpolation
  ts(x,start=01,freq=frequency) -> x1 #converting into a ts object
  stl(x1,s.window="periodic") -> x2 #performing stl on the ts object
  data.frame(x,x2$time.series) -> x3 #creating a data.frame
  index(x3) -> x3$index #create an id
  colnames(x3)[1] <- "time-series" 
  melt(x3,id.vars="index") -> x4   #melt the dataframe into long format 
  ggplot(x4,aes(index,value,group=variable)) + geom_line(alpha=0.7) + facet_grid(variable ~., scales="free")  + xlab("Timesteps") + ylab("values")
}


Separating Kanji, Hiragana and Katakana characters in a string in Java

Just found a way to "clean" a query string of Hiragana and Katakana characters. The same method can be used to separate them in any way you want.

Android app flow

package space.works.customicon;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class CustomIconActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

protected void onStart(){
super.onStart();
Toast.makeText(getApplicationContext(),"Start",
Toast.LENGTH_SHORT).show();
}

protected void onRestart(){
super.onRestart();
Toast.makeText(getApplicationContext(),"ReStart",
Toast.LENGTH_SHORT).show();
}

protected void onResume(){
super.onResume();
Toast.makeText(getApplicationContext(),"reSume",
Toast.LENGTH_SHORT).show();
}

protected void onPause(){
super.onPause();
Toast.makeText(getApplicationContext(),"pause",
Toast.LENGTH_SHORT).show();
}

protected void onStop(){
super.onStop();
Toast.makeText(getApplicationContext(),"Stop",
Toast.LENGTH_SHORT).show();
}

protected void onDestroy(){
super.onDestroy();
Toast.makeText(getApplicationContext(),"Destroy",
Toast.LENGTH_SHORT).show();
}

}

 

Subcategories

Statistics

Articles View Hits
16574
 

OwnCloud

My very own cloud network is up! Lemme know if you want an account to play with. This cloud syncs my server in Tokyo, my machines at home and a laptop that I carry around with me.

Android Developer

Elastic Layout!

Try resizing the browser window and see how this webpage reacts! Read more about responsive web design here.

Member Area

Contact Me