Showing posts with label android. Show all posts
Showing posts with label android. Show all posts

Sunday, January 6, 2013

Android APK dosyası inceleme (reverse engineering)

Android'e bir şekilde bulaştıysanız AppBrain'i duymuşsunuzdur. Google'ın Android Market'ine alternatif olan ve size uygulama tavsiye edebilen bir site. AppBrain'in bir de istatistik hizmeti var. Bu istatistikler içinde benim en çok ilgimi çeken Developer tools istatistikleri. Örneğin ACRA kütüphnesini kullanan top 10 uygulamayı görebiliyorsunuz. AppBrain'in bu istatistikleri nasıl topladığını merak ediyorsanız okumaya devam edin.

Bu yazıda apk dosylarının, reverse engineering ile nasıl inceleneceğini adım adım anlatacağım.

1. Apk dosyasını indirme

Android projelerinin emulatörde ya da cihazda çalışabilmesi için projenin paketlenmesi ve imzalanması gerekiyor. Proje paketlendiğinde '.apk' uzantılı bir dosya oluşur. Apk dosyalarının oluşturulması ile ilgili detaylı bilgi almak isteyenler resmi android geliştirici sayfalarındaki Building and Running bölümüne bakabilir.

Apk dosyasını indirebilmek için apk downloader adında bir araç kullanacağız. Apk-downloader bir Chrome eklentisi. Android Market'te uygulamanın sayfasına girdiğinizde adres barında apk indirmek için bir düğme çıkartıyor. Apk-downloader, Google hesap bilgilerinize (şifreniz dahil) ve Google'a kayıtlı Android cihaz'ınızın Google Service Framework ID'sine ihtiyaç duyuyor. Google hesap bilgileriniz bizi hiç ilgilendirmiyor dese de işim bittikten sonra Google şifremi değiştirdim, size de aynısını tavsiye ediyorum. İncelemek istediğimiz uygulamayı Android Markette bulduktan sonra apk'yı indiriyoruz.

Instagram'ın popüler Android uygulamasının apk dosyasını aşağıdaki şekildeki gibi apk-downloader'ın apk indirme düğmesini kullanarak indirdim.

2. dex2jar

İkinci aracımız dex2jar. Dex2Jar sayesinde dex formatındaki dosyalari java class dosyalarına çevireceğiz ve java decompiler ile class dosyalarını java dosyalarına çevireceğiz. dex dosyasının açılımı "Dalvik executable". Android uygulamarını çalıştıran virtual machine (Dalvik), java class dosyalarını değil dex formatındaki dosyaları okuyabiliyor.

dex2jar ile apk dosyasını aşağıdaki gibi jar (java archive) dosyasına çeviriyoruz.

tututil:TEMP ilkinulas$ ~/Development/tools/dex2jar-0.0.9.12/d2j-dex2jar.sh com.instagram.android.apk
dex2jar com.instagram.android.apk -> com.instagram.android-dex2jar.jar

Oluşan jar dosyasını okumak incelemek için Java Decompiler kullanacağız.

Java decompiler'ın arayüzü ile bakarsak Instagram'ın Android uygulamasınin aşağıdaki kütüphaneleri kullandıgını görebiliriz: (Aşağıdaki resim java decompiler'in arayüzünü gösteriyor.)

3. apktool

apk dosyasının içinde sadece derlenmiş dex dosyaları bulunmuyor. Uygulamayı meydana getiren AndroidManifest.xml dosyasi, res, assets, lib dizinleri de apk dosyası içinde bulunmakta. Bu dosyalara erişmek için apktool aracını kullanacağız.

Aşağıdaki komut ile apk dosyasını INSTAGRAM dizinine açıyoruz.

tututil:TEMP ilkinulas$ apktool decode com.instagram.android.apk INSTAGRAM
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/ilkinulas/Library/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...
tututil:TEMP ilkinulas$ ls -ltr INSTAGRAM/
total 32
drwxr-xr-x   8 ilkinulas  staff   272 Jan  6 16:32 smali
-rw-r--r--   1 ilkinulas  staff  8248 Jan  6 16:32 AndroidManifest.xml
drwxr-xr-x  46 ilkinulas  staff  1564 Jan  6 16:32 res
drwxr-xr-x   4 ilkinulas  staff   136 Jan  6 16:32 lib
drwxr-xr-x   8 ilkinulas  staff   272 Jan  6 16:32 assets
-rw-r--r--   1 ilkinulas  staff   247 Jan  6 16:32 apktool.yml
tututil:TEMP ilkinulas$

apk-downloader, dex2jar, java decompiler ve apktool ile siz de seçtiğiniz bir uygulamayı decompile edip inceleyebilirsiniz. Happy hacking :)

Friday, September 9, 2011

Android için Okey

6 Haziran'daki yazımda Okey Mini'nin 10 bin Android cihazda kurulu olduğunu yazmıştım. Aradan geçen 3 ay boyunca Okey Mini 45 bin kullanıcıya ulaştı. Bu yazıyı 50 binde yazmayı düşünüyordum ama sabredemedim :)

Android Markette uygulaması olanlar bilirler Developer Console'da çeşitli istatistikler yer alıyor. Bu istatistikleri paylaşmak istiyorum. Türkiye'deki Android kullanıcılarının bir kısmı hakkında (en azından okey sevenler hakkında) ilginizi çekebilecek veriler var.

İlk olarak Okey Mini'nin Nisan 2011'den bugüne kullanıcı sayısı grafiğini görüyorsunuz. 78 bin download olmasına rağmen 45 bin cihazda kurulu. Bu da demek oluyor ki her 100 kişiden 57'si uygulamayı beğenmiş ve kurduktan sonra kaldırmamış. Bu yüzde 57 değerini gerçekten çok az buluyorum keşke diğer uygulama geliştiricileri de bu şekilde raporlar paylaşsa da genel olarak active installation yüzdesi hakkında fikir sahibi olabilsek.

Aşağıdaki resim kullanıcıların 5 üzerinden verdiği puanları gösteriyor. Yeni versiyonu 1.2.x markete gönderdikten sonra 4.6 olan ortalama 4.5'e düştü. Android Market'teki tüm uygulamaları değerlendirdiğinizde genel olarak 4 ve üzeri puandaki uygulamalar iyi uygulamalar olarak kabul edilebilir (bana göre).

Okey Mini'nin kullanıcılarının büyük bir çoğunluğunun Türk kullanıcılar olduğunu tahmin ediyorum. Okey'i bizim oynadığımız kurallarla oynayan başka bir ülke yoktur heralde. İlk istatistiğimiz Android versiyonları ile ilgili. Android 2.3.3 burada başı çekiyor. Android 3.0 ve 3.1'in olması tabletlerde de oyunun oynanabildiğini gösteriyor.Bu istatistikten çıkartılabilecek en sinir bozucu sonuç ise piyasada bulunan Android cihazlarda 10 farklı Android versiyonu bulunması.

Sıradaki istatistik Okey Mini'yi oynayan Android kullanıcılarının cihazları ile ilgili. En fazla kullanılan ilk iki cihaz Samsung Galaxy S ve S2. HTC Desire HD de 3. sırada yer alıyor. Okey Mini için konuşacak olursak Samsung cihazların ezici bir üstünlüğü var.

Olur da Okey Mİni kullanıcı sayısı 100 bin'e ulaşırsa istatistikleri tekrar paylaşırım. Bu rakamlar son zamanlarda operator kampanyaları ile ne kadar çok android cihaz satıldığını da göstermiş oluyor bence. Son olarak Android candır diyerek sözlerime nokta koyuyorum.

Monday, June 6, 2011

Okey Mini 10 bini gördü

17 Nisan 2011'de Android Market'te yayınladığım okey oyunum Okey Mini 10.000 android işletim sistemli cihaz üzerinde çalışıyor. Reklam istatistiklerine göre Internet bağlantısı kapalı cihazlar haricinde günde 40 bin tane el bitiyor.

Market istatistikleri aşağıdaki resimdeki gibi.
  • 5 puan üzerinden yapılan oylamada ortalama puan 4,6 (466 kişi puan vermiş)
  • 17.800 defa indirilmiş, 7800 kişi beğenmemiş oyunu kaldırmış, active installation sayısı 10 bin.

Android telefonu olup da oyunu merak edenler için market linki https://market.android.com/details?id=com.appsonfire.okey

Doğrusunu söylemek gerekirse oyunun bu kadar populer olmasına çok şaşırdım. Markette yapılan yorumlardan çıkardığım sonuç, kullanıcıların telefona karşı değil arkadaşlarına karşı oynamak istedikleri oldu. Grafik işlerinden anlayan bir arkadaşım ile çalışıp grafikleri düzelttikten sonra multiplayer versiyonu da birkaç ay içinde çıkartmayı düşünüyorum.

Sunday, March 20, 2011

Android Uygulama Kaynakları

Android'in kaynakları yönetimi, uygulama geliştirmeye yeni başlayanlar için karmaşık olabilir. Android platformu üzerinde başarılı uygulamalar geliştirmeyi hedefliyorsak aşağıdaki nedenlerden dolayı Android'in kaynak yönetim yapısını iyi bilmemiz gerekiyor.

  • Uygulama, farklı ekran çözünürlüklerindeki cihazları destekleyebilirse, potansiyel kullanıcı sayısı artmış olur.
  • Türkçe uygulama geliştirmek çok güzel fakat, kullanıcı sayısını binlerden yüzbinlere çıkartmak için farklı dilleri desteklemek şart.
  • Uygulama bileşenlerinin (View) ekrandaki dizilimini (layout) zaten karmaşık olan java kodundan ayırmak kodun okunabilirliğini arttırır.
  • Telefonun dikey ve yatay duruşu (screen orientation) için farklı bileşen dizilimleri kullanmak isteyebiliriz.
  • Kullanıcıların uygulumayı özelleştirebilmesi için farklı stiller (renkler, ikonlar) desteklememiz gerekebilir.

Eclipse ile bir Android uygulamasını oluşturduğumuzda resimdeki gibi 4 ana klasör görürüz.


  • src dizininden bahsetmeye gerek yok. Yazdığımız tüm java kodları bu dizin altında paketler içerisinde bulunuyor.
  • gen dizininde aapt (Android Asset Packaging Tool) tarafından oluşturulan ve uygulama kaynaklarına src altındaki java kodundan erişimi sağlayan meşhur R.java sınıfı yer alır. Eclipse ile uygulama geliştirenlerin aapt'yi kullanmalarına gerek yok. Eclipse yeni tanımlanan kaynakları algılayıp R.java sınıfını otomatik güncelleyecektir.
  • assets dizini başka bir yazının konusu olabilir ama kısaca ne amaçla kullanıldığından bahsedelim. Bu dizin altındaki dosyalara sadece java.io.InputStream aracılığı ile erişilebiliyor. mp3 dosyaları, pdf'ler, csv formatındaki data dosyalarını bu dizin altına atıp InputStream aracılığı ile okuyabiliriz.
  • res dizini bu yazının konusu olan dizinimiz. Tüm uygulama kaynaklarımız bu dizin altına koyuluyor.
res dizini altında yer alan kaynak dosyalarından bahsetmeye en kolayından ve en çok kullanılanından başlayalım.

strings.xml

res/values dizini altında tanımlayabileceğimiz kaynaklar arasında en fazla kullanılanı strings.xml'dir. Uygulama içerisinde geçen tüm metinleri strings.xml dosyasına kaydedip java kodu içinden R sınıfı aracılığı ile erişebiliriz. Aşağıda örnek bir strings.xml dosyası ve buradaki metinlere java kodundan nasıl erişildiği gösteriliyor. strings.xml dosyasında sabit metinler dışında değişkenler de tanımlanabilir. Değişken tanımlarken java.util.Formatter sayfasında anlatılan kurallara uyulması bekleniyor.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="karsilama_mesaji">Merhaba dünyalı. Biz dostuz.</string>
    <string name="karsilama_mesaji_ozel">Merhaba %1$s. Biz dostuz.</string>
</resources>
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   TextView ozelMesaj = (TextView)findViewById(R.id.textView_karsilama_ozel);
   ozelMesaj.setText(getString(R.string.karsilama_mesaji_ozel, "ilkin"));
}
Telefonlarının yerel dil ayarı "FR" olan kullanıcılar için uygulamaya fransızca desteği eklemek istersek, strings.xml dosyasının bir kopyasını olusturup Türkçe metinleri Fransızca karşılıkları ile değiştirmemiz gerekir. Örnek fransızca strings.xml dosyası aşağıdaki gibidir. (google translate sağolsun)
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="karsilama_mesaji">Bonjour terriens. Nous sommes des amis.</string>
    <string name="karsilama_mesaji_ozel">Bonjour %1$s. Nous sommes des amis.</string>
</resources>

Metinlerin fransızca karşılıklarını içeren strings.xml dosyasını aşağıdaki şekildeki gibi res/values-fr dizini altına koymamız gerekiyor. Dili Fransızca olan telefonlarda metinlerin Fransızca karşılıklarını gösterme işini Android platformu bizim için yapacaktır.

Vakit bulursam bir sonraki yazının konusu drawable kaynaklar (renkler, resimler, ikonlar) olacak. Bol Android'li günler :)