(1) Download ubuntu-8-1.10-desktop-i386.iso (32 bit Intel i386 Desktop)
http://www.ubuntu.com/getubuntu/download
MD5 (ubuntu-8-1.10-desktop-i386.iso) = 24ea1163ea6c9f5dae77de8c49ee7c03
Installation is very easy just mount the iso image in the VMWare, and everything goes default. then install VMWare tools. If network does not work try command "sudo dhclient"
If you want to install Ubuntu 8.10 in Virtual PC 2007
see this guide
http://tungchingkai.blogspot.com/2008/11/how-to-install-ubuntu-81-in-virtual.html
(2) VMWare Settings : Harddisk Size 8G, Ram 512MB
(3) Purpose : sdk development on iPhone / Android
Allows samba mount, ssh / scp access
apache2 server with php5 support for sqlite3 db
(4) Add root access for useraccount without password (this does not work, I don't know why, so you still need password)
Ubuntu default root disabled, so you can disable password input by editing etc/sudoers
sudo visudo
Add this line (e.g. sdkuser is the default user account)
sdkuser ALL=(ALL) NOPASSWD:ALL
(5) install build essential packages so that you can compile llvm-gcc for iPhone toolchain SDK2.0
sudo apt-get update
sudo apt-get install build-essential bison flex
(6) install server packages so that you can have local webserver and ssh and samba server
sudo apt-get install apache2 php5 libapache2-mod-php5 php5-cli php5-common php5-cgi php5-sqlite openssh-server samba
Install php5-sqlite3
sudo apt-get install php-db php-pear
wget http://us.archive.ubuntu.com/ubuntu/pool/universe/p/php-sqlite3/php-sqlite3_0.5-1_i386.deb
sudo dpkg -i php-sqlite3_0.5-1_i386.deb
(7) Create Project folder for smb mount (guest login ok) so that you can use windows / smb mount the virtual machine folder
(assume sdkuser is the default user account)
mkdir -p /home/sdkuser/Projects
chmod 777 /home/sdkuser/Projects
sudoedit /etc/samba/smb.conf
and add the followings at the end
- smb.conf: Select all
[Projects]
comment = Projects Folder Share
writable = yes
locking = no
path = /home/sdkuser/Projects
public = yes
browseable = yes
guest ok = yes
create mask = 0666
directory mask = 0777
Note : you have to restart samba server to make the new configuration effective
sudo /etc/init.d/samba restart
Update for Ubuntu 9 /10
You have to edit
sudo vi /etc/apt/sources.list
and uncomment these in order to install sun-java6-jdk
deb http://archive.canonical.com/ubuntu maverick partner
deb-src http://archive.canonical.com/ubuntu maverick partner
(8) install jdk6 so that you can compile Andriod app
sudo apt-get update
sudo apt-get install sun-java6-jdk
(9) Download Android SDK http://dl.google.com/android/android-sdk-linux_x86-1.0_r1.zip from
http://code.google.com/android/download_list.html
install in ~/Android/
mkdir -p ~/Android/
sudo unzip ~/Desktop/android-sdk-linux_x86-1.0_r1.zip -d ~/Android/
sudo chown -R sdkuser:sdkuser ~/Andriod
Update for android-sdk 2.0 or above
mkdir -p ~/Android/
tar xzvf ~/Downloads/android-sdk_r12-linux_x86.tgz
~/Android/tools/android update sdk
create sd card & test emulator
~/Android/android-sdk-linux_x86-1.0_r1/tools/mksdcard -l SD500M 500M ~/Android/sd500m.img
~/Android/android-sdk-linux_x86-1.0_r1/tools/emulator -datadir ~/Android -scale 0.7 -sdcard ~/Android/sd500m.img &
(10) Download and Install Eclipse 3.4.1 (you can't use the debian package eclipse which is 3.2 only)
from
http://www.eclipse.org/downloads/
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-java-ganymede-SR1-linux-gtk.tar.gz
install in /usr/lib
cd /usr/lib; sudo tar -xzvf ~/Desktop/eclipse-java-ganymede-SR1-linux-gtk.tar.gz
Update for eclipse-java-helios
http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/heliossr2
mkdir -p ~/Android/
cd /usr/lib; sudo tar -xzvf ~/Downloads/eclipse-java-helios-SR2-linux-gtk.tar.gz
Add main menu & icon for eclipse in GNOME
sudoedit /usr/share/applications/eclipse.desktop
and save this
- eclipse.desktop: Select all
[Desktop Entry]
Name=Eclipse
Comment=Develop applications in a variety of different programming languages
Exec=/usr/lib/eclipse/eclipse
Icon=eclipse48.png
Terminal=false
Type=Application
Categories=Development;
StartupNotify=true
There is no eclipse icon in the download file eclipse-java-ganymede-SR1-linux-gtk.tar.gz. You can get it from eclipse 3.2.2 package
and install it manually
download the eclipse 3.2.2 package
wget http://us.archive.ubuntu.com/ubuntu/pool/universe/e/eclipse/eclipse_3.2.2-5ubuntu2_i386.deb
extract the package and copy the icons to /usr/share/pixmaps/
dpkg -x eclipse_3.2.2-5ubuntu2_i386.deb tmp
sudo cp tmp/usr/share/pixmaps/* /usr/share/pixmaps/
rm -fr tmp
Install Android sdk plug-in for Eclipse
(based on http://code.google.com/android/intro/installing.html#installingplugin)
add this site and install in Eclipse
http://dl-ssl.google.com/android/eclipse/
Edit Eclipse's preference for Andriod (Window -> Preferences -> Android)
SDK location
/home/sdkuser/Android/android-sdk-linux_x86-1.0_r1/
emulator options
-scale 0.7 -sdcard /home/sdkuser/Android/sd500m.img
Test HelloActivity in Eclipse
(a) Create a New Android Project in Eclipse (File -> New -> Project... -> Android -> Android Project)
(b) Choose Create project from existing source and browse to ~/Android/android-sdk-linux_x86-1.0_r1/samples/HelloActivity
(c) Run HelloActivity as Android Application
(d) Then the emulator will start Hello, World! will be on the emulator screen
Note: Please don't set the workspace of Eclipse to the sample project folder
~/Android/android-sdk-linux_x86-1.0_r1/samples/
or else you will get error when importing project from existing source
Update for iphone toolchain4 for SDK4.x+
http://github.com/javacom/toolchain4
You need to install clang 2.7 or above in Ubuntu 8.10
wget http://archive.ubuntu.com/ubuntu/pool/universe/c/clang/clang_2.7-0ubuntu1_i386.deb
wget http://mirrors.us.kernel.org/ubuntu/pool/main/l/llvm-2.7/libllvm2.7_2.7-5ubuntu2_i386.deb
wget http://mirrors.us.kernel.org/ubuntu/pool/main/libf/libffi/libffi5_3.0.9-2ubuntu2_i386.deb
(11) Install iPhone llvm-gcc and toolchain SDK2.0
Refer to this article and download the file UpgradeToolChain2.tgz and build the llvm-gcc for iPhone
http://iphonesdkdev.blogspot.com/2008/10/how-to-install-llvm-gcc-for-iphone-sdk.html
Install ldid in Linux, so that you can fake codesign it
cd ~/Projects
wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.476.tgz
tar -zxf ldid-1.0.476.tgz
cd ldid-1.0.476
g++ -I . -o util/ldid{,.cpp} -x c util/{lookup2,sha1}.c
sudo cp -a util/ldid /usr/bin
or here
wget http://www.telesphoreo.org/export/477/trunk/data/ldid/ldid-1.0.476.tgz
updated ldid source
wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.610.tgz
Updates : If you compiled it in cgywin, you need to add (uint32_t) in the source code ldid.cpp that has ambiguous overload call error message like this
error: call of overloaded 'Swap(int)' is ambiguous
If you need to codesign the iPhone binary in Linux add this to your build script
export CODESIGN_ALLOCATE=/usr/toolchain2/pre/bin/arm-apple-darwin9-codesign_allocate; ldid -S $(PROJECTNAME)
(12) test apache2 and php so that you can see the php info page in the local webserver
In Firefox browser of Ubuntu enter this address
http://localhost/
enable php5 (sometimes you need this)
a2enmod php5
restart apache server
sudo /etc/init.d/apache2 restart
create this test.php script in /var/www
sudo chown -R sdkuser:sdkuser /var/www
echo "<?php phpinfo(); ?>" > /var/www/test.php
and see the php info in Firefox browser of Ubuntu
http://localhost/test.php
(13) create sqlite3 db
- sqlite3 test.db: Select all
-
sudo chown -R sdkuser:sdkuser /var/www
cd /var/www
sqlite3 test.db
sqlite> create table test (id integer primary key, value text);
sqlite> insert into test (value) values('eenie');
sqlite>
sqlite> insert into test (value) values('meenie');
sqlite> insert into test (value) values('miny');
sqlite> insert into test (value) values('mo');
sqlite> select * from test;
sqlite>
sqlite> .exit
and test sqlite3 & php5-sqlite3 by using testdb.php script to test the access to sqlite3 db on webserver
(14) testdb.php
- testdb.php: Select all
-
<// Version 0.01
<html>
<head><meta http-equiv="Content-Type" content="text-html; charset=UTF-8" /></head>
<title>iPhone Database</title>
<body>
<?php
$ip_dbpath[] = '/var/www/test.db';
// $ip_dbpath[] = '/var/www/sms.db';
// $ip_dbpath[] = '/var/www/call_history.db';
// $ip_dbpath[] = '/var/www/notes.db';
// $ip_dbpath[] = '/var/www/AddressBook.sqlitedb';
// $ip_dbpath[] = '/var/www/Calendar.sqlitedb';
// db location in iPhone /private/var/mobile/Library/SMS/sms.db
// db location in iPhone /private/var/mobile/Library/CallHistory/call_history.db
// db location in iPhone /private/var/mobile/Library/Notes/notes.db
// db location in iPhone /private/var/mobile/Library/AddressBook/AddressBook.sqlitedb
// db location in iPhone /private/var/mobile/Library/Calendar/Calendar.sqlitedb
$ip_dbdesc[] = 'test';
// $ip_dbdesc[] = 'SMS';
// $ip_dbdesc[] = 'Call History';
// $ip_dbdesc[] = 'Notes';
// $ip_dbdesc[] = 'Address Book';
// $ip_dbdesc[] = 'Calendar';
$ip_query[] = 'SELECT * from test order by 1';
// $ip_query[] = 'SELECT date, address, text FROM message order by 1 desc, 2;';
// $ip_query[] = 'SELECT date, address, duration FROM call order by 1 desc;';
// $ip_query[] = 'SELECT creation_date, data, title FROM Note inner join note_bodies on Note.ROWID = note_bodies.note_id order by 1;';
// $ip_query[] = 'SELECT First, Last, Middle, CreationDate, ModificationDate FROM ABPerson;';
// $ip_query[] = 'SELECT start_date, end_date, summary, location, description FROM Event order by 1, 2;';
// $dbcount = sizeof($ip_dbpath);
// if you uncomment the above db & query and add copy the iPhone db , you can list out the content of sqlitedb of iPhone
$dbcount = 1;
for ($dbnum=0;$dbnum<$dbcount;$dbnum++){
try {
$dbpath = $ip_dbpath[ $dbnum ];
$dbh = new PDO('sqlite:'.$dbpath);
$query = $ip_query[ $dbnum ];
$stmt = $dbh->prepare($query);
$stmt->execute();
}
catch (PDOException $e) {
die("Could not open database" . $e->getMessage());
}
$colcount = $stmt->columnCount();
echo "<h1>". $ip_dbdesc[ $dbnum ] . "</h1>";
echo "<table cellpadding=10 border=1>";
for ($i=0;$i<$colcount;$i++) {
$meta = $stmt->getColumnMeta($i);
echo "<td>".$meta["name"]."</td>";
}
while ($row = $stmt->fetch()) {
echo "<tr>";
for ($i=0;$i<$colcount;$i++) {
$meta = $stmt->getColumnMeta($i);
if ($meta["native_type"] == "null") {
echo "<td> </td>";
}
elseif (preg_match("/date$/i", $meta["name"])) {
echo "<td>". date("j M Y D g.i a", $row[$i])."</td>";
}
elseif (preg_match("/[call|sms]$/i", $meta["name"]) && $meta["name"] == "address" && strlen(rtrim($row[ $i])) == 8) {
echo "<td><A href='Tel:".$row[$i]."'>".$row[$i]."</A></td>";
}
else {
echo "<td>".$row[ $i]."</td>";
}
}
echo "</tr>";
}
echo "</table>";
}
?>
</body>
</html>
(15) Enjoy building app
Why to install apache2, php5 and php5-sqlite3 in Ubuntu ?
Because both iPhone and Andriod SDK use sqlite3 as database engine.
Webserver can be served for many purposes when testing including http get/post access and cydia repository as well.
Additional Notes
If you need to install flash plugin in firefox
sudo apt-get install flashplugin-nonfree
If you need to install java plugin in firefox
sudo apt-get install sun-java6-plugin
If you need to install xpdf
sudo apt-get install xpdf-reader
If you need to install jedit
sudo apt-get install jedit
If you want to install mysql, it will promot you to enter the root password of mysql during installation
sudo apt-get install mysql-server php5-mysql
use this to login mysql
mysql -u root -h localhost -p
To change sql root password from oldpassword to newpassword
mysqladmin -u root -poldpassword password newpassword
Create a new database (newsdb) and new user (newsuser) with password (newspassword)
mysql -u root -p
> CREATE DATABASE newsdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
> GRANT ALL PRIVILEGES ON newsdb.* TO newsuser@localhost IDENTIFIED BY 'newspassword';
> FLUSH PRIVILEGES;
> QUIT