[[bc9]]

- Contents
#Contents

* Summary [#d59efb36]
>
This article shows how to set up an Android development environment. The article argues mainly for android-1.5, but the method~
can be applicable to other versions of Android. The development environment either uses the pre-build VMware virtual machine file,~
'''bc9-android-sdk—release20090801.vmx''' or build a development environment on VMware. Also, the virtual machine can be replaced~
with Linux environment in general. (Caution: the version of Linux may differ. It is highly dependent on the version of Android-sdk.)~

>
Some information listed here may similar to the information of  [[bc9/Software/android/android-1.5r3]].  This page is aimed at providing~
an overview of the process. To seek farther detail information, please visit [[bc9/Software/android/android-1.5r3]].

* VMware [#w73ac41b]
>
The configuration of the VMware for bc9-android-sdk is shown below.
- Version: VMware 6.5 compatible
- Disk Space: Virtual Disk 20G (the space is divided into 2G)
- number of CPUs: 1
- Memory: 512 M
-- To increase the number of CPU and the size of memory, change '''numvcpus''' and '''memsize''' at the configuration file of VMware~
virtual machine.
- Network: bridge network
- OS
-- Ubuntu 8.04.3 LTS (install 8.04.2 first, then update it)
-- The setting of Applications basically remains in default, but the exceptions are shown shown below.
--- symbolic link at '''/bin/sh changes form '''dash''' to '''bash'''. 
 sudo dpkg-reconfigure dash
--- Remove the games, such gnome-games and others.
 sudo apt-get remove gnome-cards-data gnome-games gnome-games-data libggzmod4
---ssh, htp, vim, lv, nautilus-open-terminal, adbe flash 10, adobe acroread are addionally installed.
--- vmware-tools have already been installed.
--- default resolution is set up for 1280x768.
--- By configuration of network, address is obtained by '''dhcp'''.
--- user and password for the pre-build image are beat and beatcraft, respectively. 

* android (Android Open Source project) [#h2d982ca]
>
Please look at URL below for the information of '''repo''' and other requirements. Please follow the instructions of the build process.~
- http://source.android.com/download~
In this article, the branch used here is android-1.5r3.~

** Initialization [#q9c951d3]
>
Make a directory, which is called '''android-sdk-1.5r3, and whose location is under '''/home/beat/'''. Initialize '''repo'''.
 $ cd ~/
 $ mkdir android-sdk-1.5_r3
 $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3

** Adding information for extra source code [#k6a60e2f]
>
The original source code does not contain all requirements of bc9. Obtain the extra source code, adding extra~
information for needed source code. After initializing '''repo''', create '''local_manifest.xml''' at '''.repo'''.~
'''local_manifest.xml''' allows downloading extra source code for bc9.
 <?xml version="1.0" encoding="UTF-8"?>
 <manifest>
        <project path="kernel" name="kernel/common" revision="refs/heads/android-2.6.29"/>
        <project path="external/alsa-lib" name="platform/external/alsa-lib"/> 
       <project path="hardware/alsa_sound" name="platform/hardware/alsa_sound"/>
 </manifest>

**  Obtain source code [#h5641877]
>
After the configuration described above is completed, obtain the source code by '''repo sync'''.
 $ repo sync

** Modification of source files [#ke238926]
>
After '''repo sync''' is finished, modify obtained source code. The changes are shown below.
- Add alsa
Change '''Android.mk''', which is located at '''android-sdk-1.5_r3/external/alsa-lib/Android.mk'''.
 --- Android.mk.orig     2009-07-09 07:05:41.000000000 -0700
 +++ Android.mk  2009-07-09 07:05:48.000000000 -0700
 @@ -55,7 +55,7 @@
         -fPIC -DPIC -D_POSIX_SOURCE \
         -DALSA_CONFIG_DIR=\"/system/usr/share/alsa\" \
         -DALSA_PLUGIN_DIR=\"/system/usr/lib/alsa-lib\" \
 -       -DALSA_DEVICE_DIRECTORY=\"/dev/snd/\"
 +       -DALSA_DEVICE_DIRECTORY=\"/dev/\"
  LOCAL_SRC_FILES := $(sort $(call all-c-files-under, src))
 
 - Change the content of BoardConfig.mk
To use ALSA for audio hardware library, change the content of '''BoardConfig.mk'''. This file is located at~
'''android-sdk-1.5r3/build/target/board/generic/BoardConfig.mk'''.~
 # config.mk
 #
 # Product-specific compile-time definitions.
 #
 # The generic product target doesn't have any hardware-specific pieces.
 TARGET_NO_BOOTLOADER := true
 TARGET_NO_KERNEL := true
 TARGET_NO_RADIOIMAGE := true
 HAVE_HTC_AUDIO_DRIVER := true
 BOARD_USES_ALSA_AUDIO := true
 #BOARD_USES_GENERIC_AUDIO := true&#12288;&#8251; comment out 
- Apply a patch on power management
 $ cd android-sdk-1.5_r3
 $ patch -p1 < ../dummy-battery.patch
Patch is available from [[here:http://labs.beatcraft.com/en/index.php?bc9%2FSoftware%2FAndroid%2FAndroid-1.5r3#fa42dac3]].

** Build [#t772bbd0]
>
The adjustment of source code is over. Now start building.~
 $ cd android-sdk-1.5_r3
 $ make

** OpenWnn [#kc3cbc93]
>
At the previous build,  '''OpenWnn''' is not build. '''OpenWnn''' of android-sdk-1.5r3 branch is not built since landscape becomes effective.~
To prevent this happening, shift the branch of '''android-sdk-1.5_r3/packages/inputmethods/OpenWnn/'''. 
 $ cd android-sdk-1.5_r3/packages/inputmethods/OpenWnn
 $ git checkout korg/cupcake-release
After shifting the branch, make software keyboard effective as '''landscape''' is displayed.
 $ vim android-sdk-1.5_r3/packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
At the line 843 “Create the keyboard for landscape mode” and below, let all '''keylist''',which is located in '''createKeyboardsLandscape''',~
effective. After this modification is completed, add '''OpenWnn''' and build agin.
 $ cd abdroid-sdk-1.5_r3/build/
 $ source envsetup.sh
 $ cd abdroid-sdk-1.5_r3/packages/inputmethods/OpenWnn
 $ mm
After executing these command lines, the lib files for OpenWnn are built inside '''OpenWnn.apk''' and under the directory of~
'''android-sdk-1.5r3/out/target/product/generic/system/lib/.

** egg file [#xd9aedbb]
>
Change the name of the file from '''AudioPackage2.mk''' to '''Android.mk'''.  Then, make android as shown below.   
 $ cp AudioPackage2.mk Android.mk 
 $ cd android-sdk-1.5_r3/build/
 $ source envsetup.sh 
 $ cd android-sdk-1.5_r3/frameworks/base/data/sounds
 $ mm 
The audio files are copied under the directory of '''android-sdk-1.5_r3/out/target/product/generic/system/media/audio/'''.

* Creating rootfilesystem [#l5bd07ae]
>
As the build process of android has succeeded, place these files under the directory of '''android-root'''.
 $ cd ~/
 $ mkdir android-root
 $ cp -a ~/android-sdk-1.5_r3/out/target/product/generic/root/* ~/android-root/
 $ cp -a ~/android-sdk-1.5_r3/out/target/product/generic/system/* ~/android-root/system/

** Edit init.rc [#j433908f]
>
The extra code is added at '''android-root/init.rc''', and the location in which these additional lines of code are placed is right~
before '''on boot'''.
     chmod 0666 /dev/bc9_leds
        
    setprop alsa.mixer.playback.master Master
    setprop alsa.mixer.capture.master Capture
    setprop alsa.mixer.playback.earpiece Master
    setprop alsa.mixer.capture.earpiece Capture
    setprop alsa.mixer.playback.headset Master
    setprop alsa.mixer.playback.speaker Master
    chmod 0777 /dev/pcmC0D0c
    chmod 0777 /dev/pcmC0D0p
    chmod 0777 /dev/controlC0
    chmod 0777 /dev/timer
    chown root audio /dev/controlC
    chown root audio /dev/pcmC0D0c
    chown root audio /dev/pcmC0D0p
    chown root audio /dev/timer
  
    on boot
    # basic network init
Also, put '''comment out''' (#) on the lines of code, which start with '''mount yaffs2.....'''

** Modify default.prop [#o532128c]
>
The lines of code shown below are attached to the end of '''android-root/default.prop'''.
 net.eth0.dns1=208.66.222.222
 net.dns1=208.67.222.222

** Create asound.state [#o243e27f]
>
Create '''asound.state''' and '''asound.conf''' in the directory of '''android/system/etc/'''. The code below is '''asound.state''',~
which is generated by alsamixer  as OpenEmbedded is booted on bc9.
 state.Gumstix {
    control.1 {
        comment.access 'read write'
        comment.type INTEGER
        comment.count 1
        comment.range '0 - 4'
        iface MIXER
        name 'Tone Control - Bass'
        value 0 
    }
    control.2 {
        comment.access 'read write'
        comment.type INTEGER
        comment.count 1
        comment.range '0 - 2'
        iface MIXER
        name 'Tone Control - Treble'
        value 0 
    }
    control.3 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'Headphone Playback Switch'
        value true
    }
    control.4 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name De-emphasis
        value false
    }
    control.5 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'DC Filter'
        value true
    }
    control.6 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'Hi-pass Filter'
        value true 
    }
    control.7 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'ADC Filter'
        value true
    }
    control.8 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'Master Playback Switch'
        value true
    }
    control.9 {
        comment.access 'read write'
        comment.type INTEGER
        comment.count 2
        comment.range '0 - 63'
        iface MIXER
        name 'Master Playback Volume'
        value.0 63
        value.1 63
    }
    control.10 {
        comment.access 'read write'
        comment.type ENUMERATED
        comment.count 2
        comment.item.0 Mic
        comment.item.1 CD
        comment.item.2 Video
        comment.item.3 Aux
        comment.item.4 Line
        comment.item.5 Mix
        comment.item.6 'Mix Mono'
        comment.item.7 Phone
        iface MIXER
        name 'Capture Source'
        value.0 Mic
        value.1 Mic
    }
    control.11 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'Capture Switch'
        value true 
   }
   control.12 {
        comment.access 'read write'
        comment.type INTEGER
        comment.count 2
        comment.range '0 - 15'
        iface MIXER
        name 'Capture Volume'
        value.0 15
        value.1 15
    }
    control.13 {
        comment.access 'read write'
        comment.type BOOLEAN
        comment.count 1
        iface MIXER
        name 'Loudness (bass boost)'
        value false
    }
 }

** Create asound.conf [#e688bb3e]
>
asound.conf is created from asound.state
>
 ctl.AndroidPlayback {
	type hw
	card 0
 }
 
 ctl.AndroidRecord {
	type hw
	card 0
 }
 
 pcm.AndroidPlayback {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'	   value 0           } 
			{ name 'Tone Control - Treble'	   value 0           } 
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'		   value true	     }
			{ name 'ADC Filter'		   value true	     }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidPlayback_Speaker_normal {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 pcm.AndroidPlayback_Speaker {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidPlayback_Headset {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidPlayback_Speaker_incall {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidPlayback_Headset_incall {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidPlayback_Earpiece_incall {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidPlayback_Bluetooth {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
 pcm.AndroidRecord_Microphone {
	type hooks
	slave.pcm {
		type hw
		card 0
		device 0
	}
	hooks.0 {
		type ctl_elems
		hook_args [
			{ name 'Tone Control - Bass'       value 0	     }
			{ name 'Tone Control - Treble'     value 0	     }
			{ name 'Headphone Playback Switch' value true	     }
			{ name 'De-emphasis'		   value false	     }
			{ name 'DC Filter'		   value true	     }
			{ name 'Hi-pass Filter'	           value true	     }
			{ name 'ADC Filter'		   value true        }
			{ name 'Master Playback Switch'	   value true	     }
			{ name 'Master Playback Volume'	   value [ 55 55 ]   }
			{ name 'Capture Source'		   value [ Mic Mic ] }
			{ name 'Capture Switch'		   value true	     }
			{ name 'Capture Volume'		   value [ 15 15 ]   }
			{ name 'Loudness (bass boost)'	   value false	     }
		]
	}
 }
 
**Generate vold.conf [#z1c01e8a]
>
'''vold''' manages the mount of SD card. '''vold''' takes directions from a configuration file. The configuration file is needed to~
be created and placed at the directory shown below.
 $ vi android-root/system/etc/vold.conf
This is how to write the configuration file.
 ## vold configuration file for bc9
 volume_sdcard {
   media_path     /devices/platform/pxa2xx-mci.0/mmc_host/mmc0
   media_type     mmc
   mount_point    /sdcard
   ums_path       /devices/platform/usb_mass_storage/lun0
 }

** Key assignment [#lfd21d4d]
>
bc9 does have three buttons. From the top, F1, F2, and F3 are already assigned. These keys appoint to act as HOME,~
MENU, and BACK buttons of Android, respectively.

>
'''qwerty.kl''' manages the key board of Android. Edit this file, which is located at '''android-root/system/usr/keylayout'''.~
This is how to change the file.
 --- qwerty.kl-orig      2009-07-02 20:28:21.000000000 +0900
 +++ qwerty.kl   2009-07-02 20:29:42.000000000 +0900
 @@ -11,18 +11,18 @@ key 10    9
  key 11    0
  key 158   BACK              WAKE_DROPPED
  key 230   SOFT_RIGHT        WAKE
 -key 60    SOFT_RIGHT        WAKE
 +key 60    MENU              WAKE
  key 107   ENDCALL           WAKE_DROPPED
  key 62    ENDCALL           WAKE_DROPPED
  key 229   MENU              WAKE_DROPPED
  key 139   MENU              WAKE_DROPPED
 -key 59    MENU              WAKE_DROPPED
 +key 59    HOME              WAKE
  key 127   SEARCH            WAKE_DROPPED
  key 217   SEARCH            WAKE_DROPPED
  key 228   POUND
  key 227   STAR
  key 231   CALL              WAKE_DROPPED
 -key 61    CALL              WAKE_DROPPED
 +key 61    BACK              WAKE
  key 232   DPAD_CENTER       WAKE_DROPPED
  key 108   DPAD_DOWN         WAKE_DROPPED
  key 103   DPAD_UP           WAKE_DROPPED

* android-SDK [#k9317e7a]
>
Install Android 1.5 SDK, Release 3. For the details of installation, 
please visit at http://developer.android.com/sdk/android-1.5.html.~
After the installation is completed, ADB, emulator and other software are used.

*eclipse [#af385d9e]
>
Follow the instruction listed at [[Installing the Android ASK:http://developer.android.com/sdk/installing.html]], install Eclipse 3.4.2 and the plugins for android development.

* Linux kernel source [#m86ba4a0]
>
'''androi-2.6.29 kernel''' is used.  Adding '''local_manifest''' to '''android-sdk-1.5_r3''', this kernel is obtained. Creating '''kernel_work''' directly is create~
at the '''/home/beat/''', kernel is copied there. Then, the kernel is renamed to '''linux-android-2.639'''. Patches for bc9 are installed.~
 $ cd /home/beat/kernel_work/linux-android-2.6.29/
 $ mv ../patch-kernel-2.6.29.4-bc9/patch-all.sh .
 $ mv ../patch-kernel-2.6.29.4-bc9/*.patch .
 $ ./patch-all.sh
After all 17 patches are installed, change the name of kernel. Change the name of kernel for the distinguishing~
between before and after applying the patches.
 $ mv linux-android-2.6.29 linux-android-2.6.29-bc9-r3

* cross toolchain [#hc8a4844]
>
The cross toolchain of '''gumstix-oe''' which is built with '''bc9-oe-sdk''' is copied at '''/home/beat/kernel/cross'''.~
At '''/home/beat/kernel_work/envsetup.sh''',  make ARM cross compile work. Then, the cross build of the~
kernel is completed.~




Front page   Edit Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   RSS of recent changes