Android'de init nedir ve neden init.rc'ye ihtiyaç vardır?
Init, kernel başladıktan sonra bölümleri bağlayan, SELinux ve izinleri yapılandıran, arka plan programlarını (daemon) ve sistem servislerini başlatan ilk kullanıcı alanı işlemidir (PID 1). Init.rc ise bu eylemlerin sırasını ve koşullarını yöneten deklaratif bir kural kümesidir (on, service ve mount, chmod, start gibi komutlar).
Başlatma zincirinde init'in rolü
Kısaca: init olmadan cihaz kullanıcı arayüzüne yüklenemez. Basitleştirilmiş sıra şöyledir:
- Boot ROM → birincil önyükleyici (PBL/SBL/LK) → boot.img yüklenmesi.
- Linux çekirdeği başlar ve içinde /init binary dosyasının (PID 1) bulunduğu ramdisk'i bağlar.
- Init, init.rc ve ilgili dosyaları ayrıştırır; system/vendor/data bölümlerini bağlar, SELinux'u yapılandırır, dizinler oluşturur, izinleri ayarlar ve düşük seviyeli arka plan programlarını (logd, vold, netd) ile zygote'u başlatır.
- Zygote, Android Runtime'ı, SystemServer'ı ve framework'ü ayağa kaldırır; ardından launcher görünür hale gelir.
Init, yerel arka plan programları için bir süpervizör olarak hareket eder: Servis sınıfları (core, main, late_start vb.) sırayı belirler, restarts parametreleri otomatik yeniden başlatmayı kontrol eder ve on
Init.rc'nin yapısı ve sözdizimi
Init bir binary dosyadır; davranışı bir dizi rc dosyasında tanımlanır. Temel yapılar şunlardır:
- on
— bir olay için eylem bloğu (on boot, on fs, on property:…). - service
[args] — bir servisin tanımı; parametreler: user, group, class, disabled, oneshot, restart vb. - İçindeki komutlar: mount, mkdir, chmod, chown, setprop, start, stop, restorecon, write.
Örnekler:
- on boot — erken bağlantılar ve setprop sys.boot_completed=0 → daha sonra 1 olarak ayarlanır.
- service zygote /system/bin/app_process ... class main user root group root
Dosyalar birkaç konumda bulunur: ramdisk'in kökünde (/init.rc, /init.*.rc) ve ayrıca /system, /vendor ve /product içinde (init.vendor.rc, init.device.rc vb.). Init bunları belirli bir sırada okur ve eylem tablosunu oluşturur.
İlk 200 karakterde özet: init — PID 1'dir, init.rc'yi okur ve sistemi ayağa kaldırır: bölümleri bağlar, SELinux/izinleri yapılandırır ve arka plan programlarını başlatır.
Uygulama: init.rc ne zaman ve nasıl değiştirilir, hangi araçlar kullanılır?
Değişikliklerin uygulandığı alanlar:
- Özel ROM'lar (custom firmware) ve donanıma yönelik adaptasyonlar.
- Erken ADB erişimi sağlama, kendi servislerinizi ekleme, SELinux politikalarını değiştirme. Güvenli düzenleme adımları:
- Önyükleyicinin kilidini açın ve boot.img ile userdata'nın tam yedeğini alın.
- boot.img'i açın, /init.rc dosyasını düzenleyin veya import yoluyla init.custom.rc ekleyin.
- Sözdizimini ve izinleri kontrol edin, imajı yeniden derleyin ve test cihazına flashlayın.
- Hata ayıklama için erken aşama günlüğünü (early logd, dmesg, netconsole) kullanın.
Riskler: Sözdizimi hatası, yanlış izinler veya kritik servislerin devre dışı bırakılması bootloop'a (önyükleme döngüsü) veya cihazın tamamen kullanılamaz hale gelmesine (brick) yol açar.
Çalışan cihazda init.rc dosyasını asla tam yedek (boot.img ve bölümler) almadan düzenlemeyin. Hatalar cihazı kolayca çalışmaz hale getirebilir.
Sık yapılan hatalar
- Eksik imports: Ek init.*.rc dosyaları yüklenmez — servisler başlamaz.
- /dev için yanlış izinler/sahiplik — arka plan programları cihazlara erişemez.
- Yanlış servis sınıfları — kritik servisler çok geç başlar.
- restorecon eksikliği veya yanlış SELinux politikası — süreçler yanlış bağlamlar nedeniyle çöker.
SSS
- Flashlama yapmadan kendi servisimi ekleyebilir miyim? Yalnızca root erişiminiz ve ilgili bölümlere erişiminiz varsa mümkündür; çoğu fabrika çıkışlı cihazda boot.img'in yeniden derlenmesi gerekir.
- init.rc düzenlemesinden sonraki bootloop'u hızlıca nasıl hallederim? Recovery/fastboot üzerinden orijinal boot.img'i geri yükleyin veya parsing hatasını bulmak için serial/adb-early günlüğünü kullanın.
- Cihazdaki mevcut init dosyalarını nerede görebilirim? Açılmış boot.img içinde veya erişiminiz varsa (root veya ROM derleme sırasında) /vendor, /system içinde.
Telefonunuzun önyükleme sürecini inceliyorsanız, boot.img'i açıp tüm init.*.rc dosyalarını görüntülemekle başlayın; bu, modeliniz için gerçek bağlantı ve servis başlatma sırasını gösterecektir.