Tuesday, May 21, 2013

KRIPTOGRAFI

Kriptografi dapat dimaknai sebagai kajian untuk melindungi data dengan menggunakan sejumlah teknik penyembunyian rahasia data berupa kunci rahasia untuk digunakan dalam proses enchipering data. Dengan maksud bahwa hanya orang yang ber-hak-lah yang dapat membaca data yang dilindungi tersebut, dengan melakukan proses deciphering data terhadap data yang dikirimkan. Dalam kriptografi dikenal proses enkripsi (enchipering data) dan dekripsi (dechipering data), yang analogi dengan proses modulasi dan demodulasi pada proses transmisi sinyal informasi pada sistem telekomunikasi. Namun enkripsi dan dekripsi lebih dikhususkan untuk melindungi data yang dikirimkan sebelum ditransmisikan oleh transceiver.

Ilmu yang ditujukan untuk mempelajari dan melakukan eksplorasi seputar keamanan pengiriman sebuah pesan (message).Sedangkan praktisi yang menggunakannya sering disebut dengan kriptografer (cryptographer).

Misalkan pada dimodelkan pada sebuah fungsi matematika:
Plaintext : x
Algoritma : tambahkan x dengan bilangan 13
Key : f(x)
Ciphertext : (x+13)


Kriptografi berasal dari kata cryptography yang diadopsi dari bahasa Yunani untuk merujuk kepada “secret-writing”. Jadi bisa disimpulkan kriptografi adalah ilmu yang mempelajari teknik-teknik, biasanya berdasar pada matematika, yang berhubungan dengan aspek keamanan informasi seperti kerahasiaan, integritas data, serta otentikasi.

Umumnya digunakan terutama dalam bidang pertahanan dan keamanan. Juga banyak diaplikasikan untuk segala aktivitas yang berhubungan dengan Teknologi Informasi, dengan dasar pengembangannya menggunakan model matematika.

Elemen-elemen Sistem Kriptografi adalah:
1.  Plaintext: yakni pesan sumber yang sediakalanya pertama sekali dibuat oleh user; dapat dibaca oleh orang umumnya.
2.  Ciphertext: ini adalah bentuk setelah pesan dalam plaintext telah diubah bentuknya menjadi lebih aman dan tidak dapat dibaca. Proses mengubah
plaintext menjadi ciphertext disebut encryption (enciphering), dan proses membalikkannya kembali disebut decryption (deciphering).
3. Cryptographic algorithm: yaitu mekanisme/tahapan yang digunakan berdasar operasi matematika untuk mengubah plaintext menjadi ciphertext.

Key: yakni kunci yang digunakan berdasar pada cryptographic algorithm untuk melakukan proses enkripsi dan dekripsi kepada pesan yang dikirimkan. Ini mengartikan bahwa hanya user yang memiliki key saja yang dapat men-decrypt sebuah pesan dalam bentuk ciphertext.

Pada sistem kriptografi yang handal bisa melewatkan sebuah pesan dalam bentuk ciphertext pada sebuah kanal yang belum tentu aman. Ada tiga aspek untuk melindungi sebuah pesan yang ingin dikirimkan, yaitu dengan memberi lapisan keamanan pada sisi: pengirim, penerima, dan kanal
yang digunakan untuk media pengiriman.

Kesimpulannya, sistem kriprografi (cryptosystem) adalah interaksi diantara elemen-elemen sistem yang terdiri dari: algoritma kriptografi, plaintext, ciphertext, dan kunci untuk menghasilkan bentuk baru dari perubahan bentuk sebelumnya.Orang yang berusaha untuk melakukan penyadapan atau pembongkaran disebut dengan penyadap (eavesdropper) atau intruder.

Tujuan Kriptografi secara umum adalah:
1. Menjaga kerahasiaan (confidentiality) pesan.
2. Keabsahan pengirim (user authentication).
3. Keaslian pesan (message authentication).
4. Anti-penyangkalan (non-repudiation).

Fakta sejarah penggunaan kriptografi:
Tentara Yunani pada perang di Sparta (400SM) menggunakan scytale, yakni pita panjang dari daun papyrus + sebatang silinder, yang digunakan sebagai alat untuk mengirimkan pesan rahasia perihal strategi perang.

Sebuah algoritma kriptografi dikatakan aman (computationally secure) bila memenuhi tiga kriteria berikut:
1. Persamaan matematis yang menggambarkan operasi algoritma kriptografi sangat kompleks sehingga algoritma tidak mungkin dipecahkan secara analitik.
2. Biaya untuk memecahkan ciphertext melampaui nilai informasi yang terkandung di dalam ciphertext tersebut.
3. Waktu yang diperlukan untuk memecahkan ciphertext melampaui lamanya waktu informasi tersebut harus dijaga kerahasiaannya.



Sumber: dari berbagai sumber


SQL INJECTION

SQL Injection / Injeksi SQL adalah sebuah teknik yang menyalahgunakan sebuah celah keamanan yang terjadi dalam lapisan basis data sebuah aplikasi. Celah ini terjadi ketika masukan pengguna tidak disaring secara benar dari karakter-karakter pelolos bentukan string yang diimbuhkan dalam pernyataan SQL atau masukan pengguna tidak bertipe kuat dan karenanya dijalankan tidak sesuai harapan. Ini sebenarnya adalah sebuah contoh dari sebuah kategori celah keamanan yang lebih umum yang dapat terjadi setiap kali sebuah bahasa pemrograman atau skrip diimbuhkan di dalam bahasa yang lain.

Bentuk injeksi SQL ini terjadi ketika masukan pengguna tidak disaring dari karakter-karakter pelolos dan kemudian diteruskan ke dalam sebuah pernyataan SQL. Ini menimbulkan potensi untuk memanipulasi pernyataan-pernyataan yang dilakukan pada basis data oleh pengguna akhir aplikasi.

Baris kode berikut menggambarkan celah keamanan ini:

pernyataan := "SELECT * FROM pengguna WHERE nama = '" + namaPengguna + "';"

Jika variabel "namaPengguna" dirangkai sedemikian rupa oleh pengguna yang bermaksud buruk, pernyataan SQL tersebut bisa melakukan lebih daripada yang pengarangnya maksudkan. Sebagai contoh, mengeset variabel "namaPengguna" sebagai

a' or 't'='t

menjadikan pernyataan SQL ini oleh bahasa yang memuatnya:

SELECT * FROM pengguna WHERE nama = 'a' or 't'='t';

Jika kode ini akan digunakan dalam sebuah prosedur untuk melakukan otentikasi, maka contoh ini dapat dipakai untuk memaksakan pemilihan sebuah nama pengguna yang sah karena evaluasi 't'='t' akan selalu bernilai benar.

Secara teori, perintah SQL sah apapun bisa diinjeksi melalui metode ini, termasuk menjalankan banyak pernyataan. Nilai "namaPengguna" berikut ini pada pernyataan di atas akan menyebabkan dihapusnya tabel "pengguna" dan juga pengambilan semua data dari tabel "data":

a';DROP TABLE pengguna; SELECT * FROM data WHERE nama LIKE '%

Masukan ini menjadikan pernyataan akhir SQL sebagai berikut:

SELECT * FROM pengguna WHERE nama = 'a';DROP TABLE pengguna; SELECT * FROM data WHERE nama LIKE '%';

Bentuk injeksi SQL ini terjadi ketika sebuah unsur masukan pengguna tidak bertipe kuat atau tidak diperiksa batasan-batasan tipenya. Ini dapat terjadi ketika sebuah unsur numerik akan digunakan dalam sebuah pernyataan SQL, tetapi pemrogram tidak melakukan pemeriksaan untuk memastikan bahwa masukan pengguna adalah numerik. Sebagai contoh:

pernyataan := "SELECT * FROM data WHERE id = " + variabel_a + ";"

Terlihat jelas dari pernyataan ini pengarang memaksudkan variabel_a menjadi sebuah nomor yang berhubungan dengan unsur "id". Namun begitu, jika pada kenyataannya itu adalah sebuah string, maka pengguna akhir dapat memanipulasi pernyataan tersebut sesukanya, dan karena itu mengabaikan kebutuhan akan karakter-karakter pelolos. Sebagai contoh, mengeset variabel_a sebagai

1;DROP TABLE pengguna

akan menghapus tabel "pengguna" dari basis data karena hasil akhir SQL-nya akan menjadi sebagai berikut:

SELECT * FROM data WHERE id = 1;DROP TABLE pengguna;


Terkadang celah-celah keamanan dapat berada dalam perangkat lunak server basis data itu sendiri, seperti yang terjadi pada fungsi-fungsi real_escape_chars() di server MySQL.

Injeksi SQL dapat dengan mudah diatasi dalam kebanyakan bahasa pemrograman yang menargetkan aplikasi web atau menawarkan fungsi. Dalam DBI di Perl, metode DBI::quote meloloskan karakter-karakter khusus (anggaplah variabel $sql menyimpan referensi ke sebuah obyek DBI):

$kueri = $sql->prepare
  (
      "select * from pengguna where nama = "
    .
      $sql->quote($nama_pengguna)
  );

Namun begitu, secara umum ini bukan jalan yang terbaik dalam menghadapi masalah tersebut. DBI mengijinkan penggunaan placeholder, yang memperbolehkan Anda untuk mengikat data ke sebuah pernyataan secara terpisah dari pendefinisian pernyataan SQL tersebut. Untuk sistem basis data yang tidak secara asli mendukung placeholder, DBI menirukannya dengan menggunakan fungsi DBI::quote secara otomatis pada nilai-nilai. Banyak sistem basis data yang mendukung pengikatan nilai secara terpisah melalui API mereka; DBI akan menggunakan dukungan placeholder asli tersebut dalam hal ini. Sebagai contoh:

$kueri = $sql->prepare("select * from pengguna where nama = ?");
$kueri->execute($nama_pengguna);

Keuntungannya adalah Anda tidak perlu mengingat untuk menggunakan DBI::quote kepada setiap nilai. Nilai-nilai akan diikat secara terpisah, atau dikutip secara benar, tergantung pada dukungan yang ditawarkan oleh SMBD tertentu yang Anda gunakan. Anda kemudian terhindari dari masalah dasar injeksi SQL di mana nilai-nilai diinterpretasi sebagai SQL.

Bagi sistem basis data yang mendukung placeholder secara asli, seringkali ada keuntungan kinerja yang nyata untuk menggunakan placeholder, karena basis data dapat menyimpan cache dari sebuah perwakilan pernyataan yang terkompilasi dan menggunakannya secara berulang di antara pelaksanaan-pelaksanaan dengan nilai-nilai ikatan yang berbeda. Placeholder kadang-kadang juga disebut sebagai "variabel pengikat".

Dalam PHP, terdapat beberapa fungsi bawaan yang berbeda untuk digunakan pada SMBD-SMBD yang berbeda untuk meloloskan nilai-nilai yang cocok untuk diimbuhkan dalam pernyataan-pernyataan SQL harafiah. Untuk MySQL, yang serupa dengan ini adalah fungsi bawaan mysql_real_escape_string:

$hasil_kueri = mysql_query
  (
      "select * from pengguna where nama = '"
    .
      mysql_real_escape_string($nama_pengguna)
    .
      "'"
  );

Antarmuka asli untuk sebuah SMBD tertentu dapat juga menawarkan sebuah metode untuk melakukan pengikatan placeholder secara terpisah, misalnya mysql_stmt_bind_param atau oci_bind_by_name. Selain itu, sebuah pustaka abstraksi basis data dapat digunakan untuk menirukan placeholder dalam cara yang mirip dengan DBI dari Perl. Sebuah contoh dari beberapa pustaka yang ada ialah ADOdb.

Dalam bahasa pemrograman Java, yang serupa adalah kelas PreparedStatement.

Daripada

Connection con = (peroleh koneksi)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM pengguna WHERE nama = '" + userName + "';");
gunakan yang berikut

Connection con = (peroleh koneksi)
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM pengguna WHERE nama = ?");
pstmt.setString(1, namaPengguna);
ResultSet rset = pstmt.executeQuery();
Dalam bahasa pemrograman "C#" .NET atau Mono, yang serupa adalah obyek-obyek ADO.NET SqlCommand (untuk Microsoft SQL Server) atau OracleCommand (untuk server basis data Oracle). 

Contoh di bawah ini memperlihatkan bagaimana mencegah serangan injeksi menggunakan obyek SqlCommand. Kode untuk penyedia ADO.NET lainnya sangat mirip, tetapi dapat sedikit berbeda tergantung pada implementasi khusus yang dibuat oleh vendor penyedia tersebut.

Daripada

using( SqlConnection con = (peroleh koneksi) ) {
  con.Open();
  using( SqlCommand cmd = new SqlCommand("SELECT * FROM pengguna WHERE nama = '" + namaPengguna + "'", con) ) {
    using( SqlDataReader rdr = cmd.ExecuteReader() ) {
      ...
    }
  }      
}

gunakan yang berikut

using( SqlConnection con = (peroleh koneksi) ) {
  con.Open();
  using( SqlCommand cmd = new SqlCommand("SELECT * FROM users WHERE name = @namaPengguna", con) ) {

    cmd.Parameters.AddWithValue("@namaPengguna", namaPengguna);

    using( SqlDataReader rdr = cmd.ExecuteReader() ) {
      ...
    }
  }      
}


Mengatur hak-hak keamanan pada basis data ke kebutuhan yang paling minim adalah sebuah perbaikan yanng sederhana. Tidak banyak aplikasi yang memerlukan pengguna untuk memiliki hak menghapus sebuah tabel atau basis data.

Kebanyakan basis data juga menawaran kemampuan untuk menyiapkan pernyataan-pernyataan SQL pada lapisan basis data melalui stored procedure. Daripada menggunakan sebuah lapisan aplikasi untuk merangkai SQL secara dinamis, stored procedure membungkus prosedur-prosedur basis data pakai-ulang yang dipanggil dengan parameter-parameter bertipe. Ini menyediakan beberapa keuntungan keamanan: dengan membuat masukan-masukan menjadi parameter dan mewajibkan tipe pada mereka, masukan pengguna secara efektif tersaring. Sebagai tambahan, kebanyakan basis data mengijinkan stored procedure untuk berjalan di bawah hak-hak keamanan yang berbeda daripada pengguna basis data. Misalnya, sebuah aplikasi akan memiliki akses untuk menjalankan sebuah stored procedure, tetapi tidak memiliki akses ke tabel-tabel dasarnya. Ini membatasi kemampuan aplikasi untuk melakukan sesuatu yang di luar aksi-aksi yang dituliskan di dalam stored procedure.

Yang juga penting untuk dicatat adalah metode kueri standar dari pustaka client C MySQL tidak akan mengijinkan lebih daripada sebuah kueri dalam sebuah masukan, mencegah serangan banyak-pernyataan yang dipaparkan di atas. Namun begitu, masukan pengguna baik-baik yang mengandung karakter-karakter pelolos (misalnya tanda kutip tunggal) tetap dapat menyebabkan aplikasi tidak berjalan karena sintaks SQL yang buruk. Bahkan beberapa serangan juga mungkin terjadi, sebagai contoh misalkan sebuah situs web yang memperlihatkan sebuah daftar barang untuk sebuah nama pengguna yang dikenal.



Buffer Overflow


Buffer Overflow merupakan salah satu penyebab yang paling banyak menimbulkan masalah pada keamanan komputer baik yang bersifat lokal maupun jaringan. Menurut laporan CERT/CC, buffer overflow merupkan penyebab dari 50% semua bug keamanan yang dilaporkan dan dijadikan advisori oleh CERT/CC. Riset yang dilakukan oleh Crispin Cowan dan teamnya menganggap buffer overflow sebagai Vulnerbility of Decade.

Dengan tersedianya program-program eksploitasi di Internet, baik dalam bentuk source code maupun binary seringkali menjadi menjadi alat untuk membuka celah keamanan sehingga membuat orang tertarik untuk melakukan eksperimen yang sporadis tanpa memperdulikan akibat yang dapat ditimbulkannya. Banyak orang yang mengklaim dirinya sebagai seorang cracker jika sudah berhasil mengekspoitasi komputer orang lain, tanpa memahami cara kerja eksploitasi tersebut sesungguhnya.

Terlepas dari masalah tersebut diatas, tulisan ini akan membahas apakah sebenarnya buffer overflow itu dan bagaimana mekanisme untuk mengeksploitasinya/penyerangan menggunakan buffer over flow, cara memperbaiki sistem yang ter-buffer overflow dan bagaimana cara menghindari/mencegah agar sistem kita aman dari serangan melalui eksploitasi buffer overflow. Untuk memahami hal tersebut diatas diperlukan juga pemahaman mengenai cara kerja sistem prosesor di level bawah, seperti pemrograman asembly, manajemen memori text, stack, data dan sebagainya. Pada tulisan ini sebagai referensi dipilih prosesor Intel x86 yang mengorganisasi sistem memori menggunakan 4 byte dan menggunakan Linux sebagai sistem operasinya.


Pengertian Dasar
Manajemen Memori pada Proses

Sebuah proses dipandang dari sudut manajemen memori dibedakan menjadi tiga bagian:

1.  Text; memuat instruksi kode program. Bagian ini biasanya hanya bisa dibaca, dan setiap usaha untuk menuliskan data ke bagian ini akan menyebabkan kesalahan segmentation violation.
2.  Data; memuat data, baik yang telah diinisialisasi maupun yang belum. Selain dapat dibaca, biasanya bagian ini juga memperbolehkan suatu proses untuk melakukan penulisan padanya.
3. Stack; yang dapat dialokasikan secara dinamis, biasanya dimanfaatkan untuk menyimpan variabel lokal maupun untuk melewatkan parameter fungsi. 



Pengaksesan data ke bagian ini menggunakan metoda yang disebut LIFO (Last In First Out). Jenis data yang harus juga diketahui adalah buffer yang pada bahasa C diimplementasikan sebagai array. Array dapat dibedakan ke dalam dua jenis berdasarkan metoda pengalokasiannya, yaitu array statis dan array dinamis. Array statis dialokasikan di bagian data saat program dimuatkan ke memori, sedangkan array dinamis dialokasikan di dalam stack saat run time.


Stack
Stack dapat dibayangkan sebagai sebuah blok dari memori yang dapat memuat data secara dinamis.Beberapa hal yang harus diketahui pada prosesor Intel sehubungan dengan stack adalah :
1.  Penggunaan metoda Big Edian dalam mengorganisasikan sistem memori. Di sini MSB (Most Significant Bit) terletak pada alamat memori yang lebih kecil dibandingkan LSB (Least Significant Bit).
2.  Penambahan besar stack dilakukan kearah alamat memori yang lebih kecil. Di sini posisi bawah dari stack mempunyai alamat yang tetap. Posisi atas stack yang alamat memorinya lebih kecil dari posisi bawah selalu berubah.
3.  Register stack pointer (SP) selalu menunjuk ke posisi atas dari stack.
4.  Untuk memindahkan data ke stack digunakan instruksi PUSH yang secara otomatis akan menurunkan nilai SP sebesar 4 byte. Sedangkan untuk mengambil data dari stack digunakan instruksi POP yang secara otomatis juga akan menaikkan nilai SP sebesar 4 byte.

Blok memori dari stack ini biasanya di bagi lagi menjadi apa yang disebut dengan stack frame. Setiap stack frame berisi data yang berhubungan dengan pemanggilan sebuah fungsi. Biasanya posisi awal dari frame ini akan ditunjuk oleh frame pointer (FP). Dengan bantuan FP ini, maka pengaksesan ke variabel lokal maupun parameter fungsi dapat dilakukan menggunakan sistem pengalamatan relatif. Pada prosesor Intel, register EBP berfungsi sebagai frame pointer.

Sebelum memanggil fungsi fungsi() dua buah argumen sebagai parameter ditambahkan ke stack. Instruksi call di atas secara implisit juga akan menyimpan instruction pointer (IP) ke stack. IP ini selanjutnya akan di sebut dengan return address (RET).

Kode assembly yang di bangkitkan pada fungsi fungsi();
1.      pushl %ebp
2.      movl %esp, %ebp
3.      subl  $24,%esp

Baris pertama akan menyimpan frame pointer EBP ke stack untuk kemudian di baris kedua menggunakan SP sebagai frame pointer yang aktual. Pada baris ketiga 24 byte memori untuk variabel lokal buffer[ ] dialokasikan di stack, walau hanya 8 byte yang digunakan.
1.      movl 8(%ebp), %eax
2.      movl %eax, -8(%ebp)
3.      movl 12(%ebp), %eax
4.      movl %eax, -4(%ebp)

Baris diatas adalah pengesetan variabel buffer [ ] dengan parameter dari fungsi. Seperti telihat pada baris pertama, pengaksesan ke parameter satu di stack dilakukan dengan pengalamatan relatif terhadap frame pointer EBP. Setelah nilai ini disimpan di register EAX maka dengan cara yang sama nilai ini di simpan ke stack yang jaraknya –8 byte terhadap frame pointer EBP (baris kedua). Stack ini identik dengan variable buffer[0]. Baris ketiga dan keempat melakukan hal yang sama untuk parameter dua. Dari uraian diatas, maka blok memori stack dapat dilukiskan seperti gambar 2.

Seperti yang sudah dikemukakan diatas, prosesor yang digunakan adalah Intel x86 yang menggunakan bus 32-bit atau 4 byte dalam pengaksesan ke memori, sehingga pengalamatan ke memori selalu merupakan kelipatan 4 byte, sedangkan besar dari tipe data int dan pointer adalah 4 byte juga.

Jika variable lokal merupakan sebuah array, maka array dengan indeks terkecil mempunyai alamat memori yang paling kecil juga. Dengan kata lain elemen variable array di simpan dengan indeks membesar ke arah alamat memori yang juga membesar. Pada stack, ini adalah arah ke posisi bawah dari blok memori stack. Sifat stack inilah yang memungkinkan terjadinya buffer overflow.

Buffer overflow memiliki arti suatu keadaan di mana data yang diisikan ke suatu buffer mempunyai ukuran yang lebih besar dibandingkan ukuran buffer itu sendiri. Untuk lebih memahami buffer overflow, dapat dianalogikan dengan kehidupan sehari-hari, yaitu saat kita mengisi bak mandi melebihi daya tampungnya, maka air yang kita isikan akan meluap (overflow).

Berikut ini contoh sebuah program dalam bahasa C yang mengandung buffer overflow.

# Coba2.c
#include<stdio.h>

void fungsi(char* txt)
{
       char buffer[4];
      
       strcpy(buffer, txt);
}

int main()
{
       char buffer[17];
int i;

for (I=0; i<16;I++)
     buffer[i]=0x19;
fungsi(buffer);

return 0;
     }

Setelah sukses dikompilasi maka ketika program diatas dieksekusi akan ada pesan segmentation violation. Mengapa demikian ? Karena di fungsi fungsi(), variable array buffer didefinisikan hanya berukuran 4 byte, sedangkan data yang disalinkan kepadanya berukuran sebesar 17 byte. Sebagai catatan, fungsi stcpy() akan menyalinkan data yang direferensi oleh pointer txt ke buffer sampai karakter null ditemukan di txt.

Berikut ini adalah sintaks fungsi strcpy :

Char *strcpy(char *dest, const char *src);

      
Code Pointer Integrity Checking

Tujuan dari metode ini agak berbeda dengan bounds checking. Alih-alih berusaha mencegah korupsi code pointer, ia berusaha mendeteksi bahwa sebuah code pointer telah tekorupsi sebelum ia di-deferensikan. Jadi meskipun penyerang sukses dalam mengkorupsi code pointer, code pointer yang terkorupsi tidak akan digunakan karena korupsi terdeteksi setiap saat sebelum digunakan.

Sumber: dari berbagai sumber






ANDROID


Android adalah sistem operasi yang berbasis Linux untuk telepon seluler seperti telepon pintar dan komputer tablet . Android menyediakan platform terbuka bagi para pengembang untuk menciptakan aplikasi mereka sendiri untuk digunakan oleh bermacam peranti bergerak.

Awalnya, Google Inc. membeli Android Inc., pendatang baru yang membuat peranti lunak untuk ponsel. Kemudian untuk mengembangkan Android, dibentuklah Open Handset Alliance,konsorsium dari 34 perusahaan peranti keras, peranti lunak, dan telekomunikasi, termasuk Google, HTC, Intel, Motorola, Qualcomm, T-Mobile, dan Nvidia.

Pada saat perilisan perdana Android, 5 November 2007, Android bersama Open Handset Alliance menyatakan mendukung pengembangan standar terbuka pada perangkat seluler. Di lain pihak, Google merilis kode–kode Android di bawah lisensi Apache , sebuah lisensi perangkat lunak dan standar terbuka perangkat seluler. Di dunia ini terdapat dua jenis distributor sistem operasi Android . Pertama yang mendapat dukungan penuh dari Google atau Google Mail Services (GMS) dan kedua adalah yang benar–benar bebas distribusinya tanpa dukungan langsung Google atau dikenal sebagai Open Handset Distribution (OHD)

Sejarah Android
Pada Juli 2005, Google bekerjasama dengan Android Inc , perusahaan yang berada di Palo Alto, California Amerika Serikat . Para pendiri Android Inc. bekerja pada Google, di antaranya Andy Rubin, Rich Miner, Nick Sears, dan Chris White. Saat itu banyak yang menganggap fungsi Android Inc. hanyalah sebagai perangkat lunak pada telepon seluler. Sejak saat itu muncul rumor bahwa Google hendak memasuki pasar telepon seluler. Di perusahaan Google, tim yang dipimpin Rubin bertugas mengembangkan program perangkat seluler yang didukung oleh kernel Linux. Hal ini menunjukkan indikasi bahwa Google sedang bersiap menghadapi persaingan dalam pasar telepon seluler.


Versi Android:

1.5 (Cupcake)
1.6 (Donut)
2.0/2.1 (Eclair)
2.2 (Froyo)
2.3 (Gingerbread)
3.1/3.2 (Honeycomb)
4.0 (Ice Cream Sandwich)
4.1/4.2 (Jelly Bean)



Fitur yang tersedia di Android adalah:
-Kerangka aplikasi: itu memungkinkan penggunaan dan penghapusan komponen yang tersedia.
-Dalvik mesin virtual: mesin virtual dioptimalkan untuk perangkat telepon seluler.
-Grafik: grafik di 2D dan grafis 3D berdasarkan pustaka OpenGL.
-SQLite: untuk penyimpanan data.
-Mendukung media: audio, video, dan berbagai format gambar (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
-GSM, Bluetooth, EDGE, 3G, 4G dan WiFi (tergantung piranti keras)
-Kamera, Global Positioning System (GPS), kompas, NFC dan accelerometer (tergantung piranti keras)


Kelebihan Android:

- Open Source
- Konektivitas
- Object Oriented
- Multitasking
- Stabilitas

ACTIVITY, SERVICE, INTENT, CONTENT PROVIDER

Applications, Tasks and Stacks

Android dapat menjalankan beberapa aplikasi secara bersamaan
Dari sudut pandangan pengguna, setiap aplikasi adalah tugas
     tugas terdiri dari tumpukan elemen Kegiatan
     Kegiatan tidak dipetakan 1 ke 1 di aplikasi
Aplikasi dapat berbagi komponen
     Sebagai contoh, Anda dapat memanggil sebuah Kegiatan dari aplikasi lain atau perpustakaan, dan akan muncul sebagai bagian dari aplikasi
· Anda kemudian dapat kembali ke kegiatan sebelumnya ketika selesai
· Kegiatan-dapat mendorong dan muncul dari tumpukan tugas
     Ini adalah pengaturan yang sangat fleksibel!
Dapat mengkonfigurasi apakah aplikasi menggunakan tumpukan atau kegiatan tunggal




Activitiy


Activity adalah salah satu komponen aplikasi yang menyediakan sebuah layar yang mana user bisa berinteraksi dengan aplikasi, misalnya menelepon, mengambil foto, mengirim email, atau melihat peta. Setiap activity memiliki window sebagai tempat meletakkan user interface. Window tersebut biasanya memenuhi layar, bisa juga lebih kecil dari layar dan melayang di atas window lain.

Sebuah aplikasi biasanya terdiri dari beberapa activity yang satu sama lain terikat secara longgar. Biasanya, satu activity dalam sebuah aplikasi dikhususkan sabagai activity "main", yang mana akan ditampilkan kepada user disaat aplikasi dijalankan pertama kali. Setiap activity kemudian bisa menjalankan activity lain untuk melakukan pekerjaan yang berbeda. Setiap kali ada activity baru dijalankan, activity sebelumnya dihentikan, tetapi sistem menyimpan activity tersebut di dalam "tumpukan" (stack). Ketika sebuah activcity dimulai, activity tersebut ditempatkan ditempatkan paling atas pada stack dan mendapatkan fokus dari user.  Prinsip antrian stack pada dasarnya adalah "yang pertama masuk, yang terakhir keluar" (last in first out), jadi ketika user selesai dengan sebuah activity dan menekan tombol KEMBALI, activity tersebut dikeluarkan dari stack (dan dihancurkan) dan activity pada stack dibawahnya dikembalikan.

Ketika sebuah activity dihentikan karena ada activity baru yang dimulai, perubahan keadaan ini dinotifikasikan melalui siklus metode pemanggilan kembali activity . Terdapat beberapa metode pemanggilan kembali yang bisa diterima oleh activity, karena adanya perubahan keadaan dan setiap metode pemanggilan kembali menyediakan kita kesempatan untuk melakukan pekerjaan yang lebih spesifik yang sesuai dengan perubahan keadaan activity tersebut. Sebagai contoh, ketika activity berhenti, activity tersebut harus melepaskan obyek yang besar, misalnya koneksi jaringan atau database. Ketika activity dimulai kembali, kita bisa memperoleh kembali sumber daya yang dibutuhkan dan memulai kembali kegiatan yang di iterupsi. Transisi keadaan ini adalah bagian dari siklus hidup activity.



Services


Services adalah aplikasi komponen mewakili salah satu keinginan aplikasi keinginan untuk melakukan operasi longer-running walaupun tidak berinteraksi dengan pengguna atau untuk memasok fungsionalitas untuk menggunakan aplikasi lain.






Satu hal lagi tentang service di Android :

·         Service bukanlah proses terpisah

·         Service bukanlah sebuah Thread



Harap diingat ini ketika mencoba untuk mengembangkan multithreading aplikasi…

biarkan  mulai bekerja.



Dengan asumsi bahwa kita telah menciptakan proyek android dasar, berikut adalah kegiatan kami :



1
2
3
4
5
6
7
8
9
10
11
12
//AndroidservicetutorialActivity.java
package com.inchoo.tutorial;
import android.app.Activity;
import android.os.Bundle;
public class AndroidservicetutorialActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


Membuat Service Sederhana :

Membuat kelas yang disebut FirstService di namespace anda, Service class dan Eclipse akan memandu Anda untuk mengimpor namespaces yang diperlukan dan juga menambah keterisolasian metode (onBind):

1
2
3
4
5
6
7
8
9
package com.inchoo.tutorial;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class FirstService extends Service{
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
}

Sekarang kita akan menimpa dua metode lain: onStart dan onDestroy, jadi kelas FirstService kami terlihat seperti ini :



package com.inchoo.tutorial;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class FirstService extends Service{
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }
}



Jangan lupa untuk menambahkan pernyataan layanan ini di AndroidManifest.xml Anda untuk diatur dengan benar :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
package="com.inchoo.tutorial"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".AndroidservicetutorialActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".FirstService" ></service>
</application>
</manifest>

Biarkan menambahkan log untuk mengetahui kapan service dimulai dan diakhiri juga kami akan segera menghentikan service setelah memulai seperti seseorang dari Google berkata di suatu tempat : jadi bagus untuk aplikasi lain, mulai layanan Anda, melakukan apa pun yang perlu anda lakukan, dan kemudian hentikan service setelah itu…

Akhirnya keluar FirstService.java kelas terlihat seperti ini :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.inchoo.tutorial;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class FirstService extends Service{
    private static String TAG = "Inchoo.net tutorial";
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Log.d(TAG, "FirstService started");
        this.stopSelf();
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.d(TAG, "FirstService destroyed");
    }
}



Dan sekarang adalah saatnya untuk mulai dari aktivitas kita ( androidservicetutorialactivity.java ) :

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.inchoo.tutorial;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class AndroidservicetutorialActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startService(new Intent(this, FirstService.class));
    }
}



Mulai aplikasi android Anda dan jika Anda melihat ke dalam LogCat Anda akan menemukan baris ini:



Intent

Perpindahan Halaman Android (Intent)

Berikut ini sedikit tutorial dasar dalam programming Android, yaitu Intent. Intent adalah sebuah kelas pada Java khususnya dalam programming Android Application yang berfungsi untuk perpindahan halaman. Tidak mungkin kan kita bikin aplikasi cuma sehalaman aja, yaaa kecuali kita cuma bikin aplikasi Kalkulator dan aplikasi kecil semacamnya.
Sekarang bikin main.xml seperti dibawah ini :


Kemudian bikin 1 lagi Layout XML kek dibawah ini… Caranya, klik kanan res/layout kemudian new – Other – Android XML Layout File


Ingat konsep Activity, dia adalah single screen. Jadi satu layout adalah satu activity, berarti karena kita memiliki 2 layout berarti kita harus punya 2 activity juga…

Sekarang bikin activity dulu buat tampilan kedua diatas… diasumsikan sudah bisa ngatur activity.  Jadi sekarang saya tinggal share aksi-aksinya aja…

Untuk tampilan 1, beri aksi di tombol seperti dibawah ini :


Untuk tampilan 2, beri kode dibawah ini pada bagian aksi :


Masih ada 1 langkah lagi, kita harus “mendaftarkan” activity yang kita buat ke dalam AndroidManifest.xml jadi apabila kita memiliki 10 activity, berarti 10 activity tersebut harus kita daftarkan tadi. Caranya :
  1. Buka AndroidManifest.xml
  2. Pada tab dibagian bawah, pilih Application
  3. Scroll ke paling bawah, Application Node, klik Add pilih Radio Button “Create a new element at the top level, in Application” pilih Activity
  4. Bagian kanannya, Bagian Name pilih Browse, pilih Activity yang ingin didaftarkan
  5. Save atau CTRL+S
 Kira-kira begini kalo di printscreen :

Kalo mau liat xml lengkapnya dibawah ini :


 

BroadcastReceiver

BroadcastReceiver adalah agak seperti Service
     Tidak UI
     Tapi tidak berjalan terus menerus di latar belakang
Anda mendaftar untuk acara BroadcastReceiver untuk merespon
     Ketika mereka terjadi, OS otomatis memicu metode yang tepat dari contoh BroadcastReceiver terdaftar
     Ketika peristiwa terjadi, mereka sebuah Intent dilewatkan, yang menentukan sesuatu tentang jenis tindakan, dan data yang mungkin berhubungan
     Misalnya, SMS masuk, dan Intent akan memiliki nomor telepon SMS dan teks di dalamnya



Content Provider


Sekarang kita bahas apa itu Content Provider, secara garis besar Content Provider adalah platform android untuk sharing informasi antar aplikasi android. Contoh untuk akses informasi device android Anda pada aplikasi, Anda bisa menggunakan ContentProvider. Berikut adalah contoh kodingnya. Kita akan menggunakan kode pada blog sebelumnya dengan penambahan sedikit. Kita akan menambahkan ListView untuk display device information



1. Buat file xml pada folder res-layout : row.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_height=”wrap_content”
android:padding=”5sp”
android:layout_width=”fill_parent”>
<TextView
android:layout_height=”wrap_content”
android:id=”@+id/textName”
android:text=”Name”
android:textSize=”18sp”
android:layout_width=”fill_parent”
android:layout_weight=”1″></TextView>
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/textValue”
android:text=”Value”
android:textSize=”18sp”
android:gravity=”right”></TextView>
</LinearLayout>

2. Edit kode pada layout activity_main.xml

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”.MainActivity” >

<TextView
android:id=”@+id/text1″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:layout_centerVertical=”true”
android:text=”@string/hello_world” />

<fragment
xmlns:android=”http://schemas.android.com/apk/res/android”
android:name=”com.example.test.Header”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:text=”Header”
android:id=”@+id/tutview_fragment”>
</fragment>

<Button
android:id=”@+id/buttonTestIntent”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”Start”/>

<ListView
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:id=”@+id/listView”>
</ListView>

</RelativeLayout>

Kita menambahkan ListView

3. Edit kode MainActivity.java

package com.example.test;

import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.Settings;
import android.provider.UserDictionary;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {

private TextView textView;
private View view;
private LayoutInflater inflater;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView  text = ( TextView)findViewById(R.id.text1);

text.setText(“Test”);

Button button = (Button)findViewById(R.id.buttonTestIntent);
button.setOnClickListener(clickListener); //

}

private OnClickListener clickListener = new OnClickListener() {
public void onClick(View v) {

//startService(new Intent(MainActivity.this,TestService.class));

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(Settings.System.CONTENT_URI, null, null, null, null);

startManagingCursor(cursor);

ListView listView = (ListView) findViewById(R.id.listView);
String[] from = { Settings.System.NAME, Settings.System.VALUE };
int[] to = { R.id.textName, R.id.textValue };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(getBaseContext(), R.layout.row, cursor, from, to);
listView.setAdapter(adapter);
}
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}

Kode yang harus diperhatikan adalah bagian ini:

// instantiasi content provider

ContentResolver cr = getContentResolver();

// fungsi kode dibawah adalah query content provider dengan URI = content://settings/system atau Settings.System.CONTENT_URI

// URI itu mirip URL pada web , cuman gunanya disini sebagai alamat data yang akan diambil

// Jadi pada kode dibawah data yang akan diambil pada path=system dan authority = settings, authority adalah kode kata unik untuk mengakses ContentProvider

Cursor cursor = cr.query(Settings.System.CONTENT_URI, null, null, null, null);

// Manage  cursor, cursor adalah objek untuk mengakses data
startManagingCursor(cursor);

// Setting ListView dengan data dari cursor dan menggunakan UI row.xml untuk display datanya

ListView listView = (ListView) findViewById(R.id.listView);
String[] from = { Settings.System.NAME, Settings.System.VALUE };
int[] to = { R.id.textName, R.id.textValue };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(getBaseContext(), R.layout.row, cursor, from, to);
listView.setAdapter(adapter);

Output dari program ini , Ketika anda klik button pada MainActivity maka ListView akan diisi dengan data informasi device Anda.

Selain ContentProvider yang sudah ada sebagai default. kita juga bisa membuat content provider sendiri.



Context


• The Context class provides global access to the applications environment

• Only class methods are used

   ▫ e.g. Context.getResources() returns all available resources in the application

• The context is used to do things like register handlers for broadcast messages, look up resources, access string tables, access the applications home directory and so on

• Activities are launched with Context.startActivity, services with Context.startService

• Messages can be sent to all BroadcastReceivers with sendBroadcast


Sumber: dari berbagai sumber