Code Painters The Art of Coding


First Android platform build

After playing with Android SDK for a while, now it's time to try to build the platform. Unfortunately, Android documentation is not the best one I've ever seen, and some research is needed. Do they try to promote their web search engine this way? ;)

Fist step is to clone the repository, as described in this guide (I'm going to use donut branch). It goes smoothly, but takes a lot of time (my Internet link goes up to 120kB/s only).

czajnik@czajnik:~/mydroid$ repo init -u git:// -bdonut
czajnik@czajnik:~/mydroid$ time repo sync

Next step would be to select the JDK version (android seem to require JDK 1.5), and set basic environment by sourcing one of the shell scripts:

czajnik@czajnik:~$ export JAVA_HOME=/usr/share/jdk1.5.0_22/
czajnik@czajnik:~$ export ANDROID_JAVA_HOME=$JAVA_HOME
czajnik@czajnik:~$ export PATH=/usr/share/jdk1.5.0_22/bin/:$PATH
czajnik@czajnik:~$ cd mydroid
czajnik@czajnik:~/mydroid$ . build/
including vendor/aosp/

Now we need to select a particular build configuration to be used. The build system guide (which is a must-read anyway) suggests choosecombo, let's use it to select generic device debug build (there is also a tool called lunch which allows to select one of the common build types, call it without any parameters to get the list of possibilities and select one interactively):

czajnik@czajnik:~/mydroid$ choosecombo
Build for the simulator or the device?
     1. Device
     2. Simulator

Which would you like? [1]

Build type choices are:
     1. release
     2. debug

Which would you like? [1] 2

Which product would you like? [generic]

Variant choices are:
     1. user
     2. userdebug
     3. eng
Which would you like? [eng]


Finally we reached the point where we can start actual build by issuing make -j2. First attempt fails with the following error message:

development/emulator/qtools/trace_reader.cpp: In function ‘char* ExtractDexPathFromMmap(const char*)’:
development/emulator/qtools/trace_reader.cpp:1012: error: invalid conversion from ‘const char*’ to ‘char*’
development/emulator/qtools/trace_reader.cpp:1015: error: invalid conversion from ‘const char*’ to ‘char*’

It's time for a first useful hint - if you want to see the exact commands executed, invoke make showcommands. Armed with this weapon it's pretty easy to track the problem. It seems that trace_reader.cpp is expecting C-like string function prototypes in string.h, while string.h on my system exports a C++-compatible declaration. In this particular case:

// C way
char *rindex(const char *s, int c);
// C++ way (overload)
char *rindex (char *s, int c);
const char *rindex (const char *s, int c);

My Linux distribution (Kubuntu 9.10) has switched from glibc to eglibc, included /usr/include/string.h file uses the second type of declaration if used inside a C++ source file, causing the compilation failure. Look at this fragment of string.h:

/* Tell the caller that we provide correct C++ prototypes.  */
#if defined __cplusplus && __GNUC_PREREQ (4, 4)

Obviously, there are at least the following solutions:

  • fix Android code (it's a C++ file, it should expect C++ prototypes)
  • use a system that uses regular glibc
  • use GCC compiler version lower than 4.4
  • comment out #define line above

Of course, I've chosen the last option. And that was enough, after almost 80 minutes I've got my first own Android image. Now it's time to hack it a bit - stay tuned!

  • Facebook
  • Digg
  • Twitter
  • LinkedIn
  • Google Bookmarks
  • Reddit
  • StumbleUpon
Comments (1) Trackbacks (0)
  1. Today someone added a comment to the Android tracker regarding this very issue:

Add Comment Register

Leave a comment

No trackbacks yet.