Skip to content

Android ile bir sorun bir çözüm…

Uzun zamandır genelde insanların pek kullanmak istemedikleri veya tercih etmedikleri telefonlar kullandım hep. İlk telefonum çoğu kişinin aksine Nokia değil Panasonic’tir, ardından yurdumda tam bir Nokia baharı yaşanırken ben Ericsson T28 kullandım. (bugün aynı telefon üretilse cidden yine alır zevkle kullanırım). Ardından tüm üniversite hayatım Siemens marka telefonlarla (önce S55, sonra CX75 ve en son S68) geçti. En son geçen yıl tüm dünya insanlığı smartphone’lara geçerken, IOS mi Android mi ikileminde bir o yana bir bu yana savrulurken, ben Bada işletim sistemli Samsung Wave’i seçtim. Bir yılı aşkın zamandır da bir fiil kullandım. Hatta geçen yıl Bada için bir pusula uygulaması yazıp buradan da yayınlamıştım.

Telefonlar konusunda bu tavrımın önceleri için çok makul sebepleri yoktu, gayet paramın yettiği telefonu alıyordum. Ancak Siemens’lere geçtiğim aralar programlama konusundaki gelişimime paralel olarak farklı bir gözle telefonlara bakmaya başladığımı söyleyebilirim. O dönem yine revaçta olan Nokia telefonlar bana yazılımsal olarak çok kapalı ve anlamsız gelirdi. Geliştirme ve daha doğrusu kurcalamaya oldukça kapalı cihazlardı. Dosya sistemleri, kullandıkları programlar vs. anlamında tam bir kara kutuydular. Bunun yanında kullandığım Siemens telefonların seri porttan bilgisayara bağlanabilen bir yapısı ve gayet her tarafına ulaşılabilen bir dosya sistemleri vardı. SMS leri, kontakları sakladığı dosyaları görebilir değiştirebilir kısaca telefonu en alt düzeyde kurcalayabilirdiniz. Hatta S55 den CX75 e terfi ederken o vakit telefonumda biriken MMS leri aktaracak bir yöntem bulamayıp S55 üzerindeki MMS ‘lerin saklandığı dosyaların yapısını reverse engineering ile kavrayıp yeni telefona aktaran bir program yazmıştım dün gibi hatırlarım.

Bada tarafında da benzer bir süreç yaşandı, yeni birinci sürüm bir işletim sistemi geliştirmeye aç bir pazar vs. hevesiyle aldığım ve genelde olduğu gibi planlamadan öteye geçemeyen bir sürü proje ile telefon sabrımın sınırlarının zorlanmaya başladı. Bada hernekadar geliştirmeye açık bir pazar bana sağlasa da bazı çok standart smartphone yeteneklerinde gayet zorlanmakta idi. Bu durumda bir buçuk yıl kadar sabrımın sınırlarını gayet genişlettikten sonra son tercihimi Android telefonlardan piyasaya yeni sürülecek olan Samsung Note’dan yana kullandım. Telefona dair fikirlerimi daha sonra bir ara yazarım. Özetle benim bu telefonu ve android işletim sistemini neden kısacık sürede bu kadar sevdiğimi anlatmak asıl amacım.

Bahsettiğim üzere sahibi olduğum telefonları kurcalamak gibi bir sıkıntım var. Anroid işletim sistemi de tam olarak bu amaca hizmet etmek üzere yapılmış bir işletim sistemiymiş lakin geç tanıştım. Öncelikle telefonda tüm yazılımsal bileşenler bir tür provider mantığına sahip ve istenildiği gibi değiştirilebiliyor. Yani mesela telefon araması yapan programa benzer başka bir uygulama yazıp provider olarak telefona tanıtabiliyorsunuz ki bir kontak aranacağı zaman telefonun default arama provider’ı yerine sizin arama uygulamanız kullanılabiliyor. Tüm sistem geliştirmeye açık parçalardan oluşuyor gibi.

Bu bağlamda geçen gün başıma gelen bir sorunu nasıl çözdüğümü aşamalı olarak anlatayım isterim. İlk olarak telefon N7000XXKJ4 sürümüyle geldi. Üzerinde Android 2.3.5 vardı. Piyasada ise telefonun elime geçtiği gün N7000ZSKK1 (Android 2.3.6) sürümü dolanmaya başlamıştı. Şuradan faydalanarak önce KJ4 sürümü zergRush exploit yardımıyla rootlayıp sonra ZSKK1 sürümüne geçtim. Clockworkmod’un tüm güzellikleriyle bir kaç gün telefonu kullandıktan sonra N7000XXKKA sürümü çıkageldi. ZS sürüm Hong Kong menşei bir rom olduğu için içerisinde bazı tuhaflıkları barındırıyordu. Genel olarak KKA sürüme ait kullananların olumlu yorumlarıyla birlikte SheepRom kullanarak KKA sürüme terfi ettim.

Sorunda bu anda baş gösterdi. KKA geçişimde custom rom’u stock rom mantığı ile yükselttiğim için uygulamalarım ve uygulama datalarım kaybolmadıysa da GTalk sorun çıkarmaya başladı. User data wipe istemedim çünkü GTalk dışında tüm uygulamalarım sorunsuz çalışıyordu ve bir sürü ayarı tekrar yapmak istemiyordum. Sorunlu olan GTalk açılmaya çalışıyor bir süre bekliyor sonra malum crash mesajını (“The application Google Talk (process com.google.android.talk) has stopped unexpectedly. Please try again”) gösterip kapanıyordu. Hikayemizde bu anda renklenmeye başlıyor…

Bu anda bana haliyle sorunun detayları gerekli. Bir nevi cihazı debug edebilmem lazım. Bunun için öncelikle Android SDK ile gelen ddms aracını kullandım. Telefon USB Debugging modda iken programı çalıştırıp hatayı yeniden oluşturdum. Karşıma gelen exception detayları şu şekildeydi

E/AndroidRuntime(18047): FATAL EXCEPTION: main
E/AndroidRuntime(18047): java.lang.SecurityException: Need GTalk_SERVICE permission: Neither user 10080 nor current process has com.google.android.gtalkservice.permission.GTALK_SERVICE.
E/AndroidRuntime(18047): 	at android.os.Parcel.readException(Parcel.java:1322)
E/AndroidRuntime(18047): 	at android.os.Parcel.readException(Parcel.java:1276)
E/AndroidRuntime(18047): 	at com.google.android.gtalkservice.IGTalkService$Stub$Proxy.getImSessionForAccountId(IGTalkService.java:252)
E/AndroidRuntime(18047): 	at com.google.android.talk.RosterListActivity.initSession(RosterListActivity.java:239)
E/AndroidRuntime(18047): 	at com.google.android.talk.BuddyList.initSession(BuddyList.java:1122)
E/AndroidRuntime(18047): 	at com.google.android.talk.RosterListActivity.serviceStateChanged(RosterListActivity.java:224)
E/AndroidRuntime(18047): 	at com.google.android.talk.BuddyList.serviceStateChanged(BuddyList.java:1077)
E/AndroidRuntime(18047): 	at com.google.android.talk.RosterListActivity$1.run(RosterListActivity.java:67)
E/AndroidRuntime(18047): 	at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(18047): 	at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(18047): 	at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(18047): 	at android.app.ActivityThread.main(ActivityThread.java:3691)
E/AndroidRuntime(18047): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(18047): 	at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(18047): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
E/AndroidRuntime(18047): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
E/AndroidRuntime(18047): 	at dalvik.system.NativeStart.main(Native Method)
E/(2760): Dumpstate > /data/log/dumpstate_app_error

Bu noktada anlaşılan sorunun kaynağı ikinci satırdaki hata mesajında anlaşılabileceği gibi GTalk programının arkada çalışan GTalk Servisine erişim hakkının olmadığı. Bu konuda biraz araştırma ile bu tip stock rom kurulumları sonucunda erişim haklarının bozulabileceği konusunda yazıları okuduktan sonra tüm yazılarda tavsiye edilen fix_permissions scriptini çalıştırdım. Bunun için yine telefon USB Debugging modda bilgisayara bağlıyken android sdk ile gelen adb yardımıyla telefondaki komut satırına erişmek ve fix_permissions scriptini çalıştırmak oldu.

adb shell fix_permissions

Bu script tüm kurulu apk ve bağlı dosyaların erişim kısıtlamalarını tek tek yeniden ayarladı. Bir kaç dakika sonra işlem sonlandı. Telefonu reboot ettikten sonra hatanın halen devam ettiğini gördüm. Sorun dosya erişim haklarından biraz daha farklı bir hak sorununa işaret ediyordu gayet. Biraz daha araştırmadan sonra packages.xml ile ilgili makalalere rastladım. Bu dosya telefonda /data/system altında bulunan ve telefonda kurulu tüm uygulamaların haklarının yazıldığı bir tür tanımlama dosyasıymış. Bu dosya içerisinde soruna sebep /system/app/Talk2.apk dosyasını aradığımda tahmin ettiğim gibi haklar kısmının boş olduğunu gördüm. Üzerinde GTalk’un düzgün çalıştığından emin olduğum eski CWM yedeklerinden bir tanesiyle bende bulunan packages.xml dosyasını adb pull komutuyla aldıktan sonra karşılaştırdım. Bahsekonu uygulama için olması gereken

<perms>
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="com.google.android.gtalkservice.permission.SEND_HEARTBEAT" />
<item name="android.permission.ACCESS_WIFI_STATE" />
<item name="com.google.android.providers.talk.permission.READ_ONLY" />
<item name="android.permission.GET_ACCOUNTS" />
<item name="android.permission.READ_CONTACTS" />
<item name="android.permission.WRITE_CONTACTS" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<item name="android.permission.RECEIVE_BOOT_COMPLETED" />
<item name="android.permission.CAMERA" />
<item name="android.permission.MANAGE_ACCOUNTS" />
<item name="android.permission.BROADCAST_STICKY" />
<item name="android.permission.RECORD_AUDIO" />
<item name="com.google.android.gtalkservice.permission.GTALK_SERVICE" />
<item name="android.permission.ACCESS_NETWORK_STATE" />
<item name="android.permission.WAKE_LOCK" />
<item name="android.permission.USE_CREDENTIALS" />
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH.mail" />
<item name="com.google.android.providers.talk.permission.WRITE_ONLY" />
<item name="android.permission.MODIFY_AUDIO_SETTINGS" />
<item name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<item name="android.permission.WRITE_SYNC_SETTINGS" />
<item name="android.permission.INTERNET" />
<item name="android.permission.READ_SYNC_SETTINGS" />
<item name="com.google.android.gm.permission.READ_GMAIL" />
<item name="android.permission.VIBRATE" />
<item name="android.permission.CHANGE_NETWORK_STATE" />
</perms>

hak atamalarından hiçbiri bendeki packages.xml dosyasında bulunmuyordu. Her kendini zeki sanan kişinin akıl edebileceği gibi önce telefonumdaki dosyaya bu fark hak tanımlarını ekleyip adb push ile dosyayı eski yerine koymaya çalıştım. Ancak hem telefon açıkken hem de telefon recovery modda bağlıyken bu mümkün olamadı. Daha doğru tabiriyle telefon her reboot edildiğinde benim kaydettiğim dosyayı yok sayarak yeni bir bir packages.xml dosyası oluşturdu. Sanıyorum bu paket tanımına dosyası geçersiz erişimleri engellemek amacıyla hash check yapılmakta ve bu yüzden elle değiştirilmesi pek mümkün değil.

Telefondaki tüm diğer uygulamalar için bu dosya normal oluşturulurken GTalk için neden sorun çıktığı bir muammaydı bu anda gayet tabi. Neyse diyerek araştırmaya devam ettim. Şu makale yardımıyla bu dosya ve diğer işlemlerde kullanmak üzere telefonun konsolunda pm komutu bulunduğunu öğrendim ve komutu bahsedildiği gibi

adb shell
su
pm install -r /data/system/Talk2.apk

şeklinde çalıştırdığımda geçersiz sertifika şeklinde bir uyarı aldım. Yine eski CWM yedeklerinden bir tanesinden Talk2.apk yı ayıkladım ve telefonda olan apk’yı adb pull ile alıp karşılaştırdım. Apk paketleri zip uzantı ile açılıp incelenebilen paketler olduğu için içlerindeki dosyaları karşılaştırırken sadece sertifika dosyalarının farklı olduğunu gördüm. Rom ile gelen apk geçersiz bir sertifika içermekte olduğundan packages.xml yeniden yaratılırken ilgili hak atamalarını yapmamakta ve program doğru çalışmamaktaydı demek oluyor bu sonuç.

Son adım olarak yedekten ayıkladığım apk yı mevcut apk üzerine adb push ile koyduktan sonra pm install komutunu tekrar ettim ve voila! GTalk sorunsuz şekilde çalışmaya başladı.

Burada soruna yol açan da sorunu çözende android’in açık kaynaklı ve oldukça esnek yapısı şüphesiz. Böyle bir sorunla IOS tarafında karşılaşmanız pek mümkün değildir. Bir kaç aydır IOS 4.3.5 ve şimdi 5.0 kurulu iPad kullanıyorum bırakın çökmeyi yavaş çalışan ya da sorun çıkaran bir uygulama dahi olmadı fakat başta da uzun uzun anlattığım gibi telefonlarım benim için kurcalanabilir cihazlardır mutlaka. IOS gibi kapalı ve erişilmez bir işletim sistemi bu manada maalesef beni pek enterese edemiyor. Bir GTalk çökmesi ile ilgili bir gün ayrımam gerekse de işin eğlencesi ve güzelliği zaten bu noktada sanırım benim için.

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*