Bu sayfada, derlemeler arasında gereksiz dosya değişikliklerini azaltmak için AOSP'ye eklenen değişiklikler açıklanmaktadır. Kendi derleme sistemlerini koruyan cihaz uygulayıcıları, bu bilgileri kablosuz (OTA) güncellemelerinin boyutunu küçültmek için kılavuz olarak kullanabilir.
Android OTA güncellemeleri bazen kod değişikliklerine karşılık gelmeyen değiştirilmiş dosyalar içerir. Bunlar aslında derleme sistemi yapılarıdır. Bu durum, farklı zamanlarda, farklı dizinlerden veya farklı makinelerde oluşturulan aynı kod çok sayıda değiştirilmiş dosya ürettiğinde ortaya çıkabilir. Bu tür fazla dosyalar, OTA yamasının boyutunu artırır ve hangi kodun değiştiğini belirlemeyi zorlaştırır.
AOSP, OTA'ların içeriğini daha şeffaf hale getirmek için OTA yamalarının boyutunu küçültmek üzere tasarlanmış derleme sistemi değişiklikleri içerir. Derlemeler arasında gereksiz dosya değişiklikleri ortadan kaldırıldı ve OTA güncellemelerinde yalnızca yama ile ilgili dosyalar yer alıyor. AOSP'de ayrıca, daha temiz bir derleme dosyası farkı sağlamak için derlemeyle ilgili yaygın dosya değişikliklerini filtreleyen bir derleme farkı aracı ve blok ayırmayı tutarlı tutmanıza yardımcı olan bir blok eşleme aracı da bulunur.
Derleme sistemi, çeşitli şekillerde gereksiz yere büyük yamalar oluşturabilir. Bu sorunu azaltmak için Android 8.0 ve sonraki sürümlerde her dosya farkı için yama boyutunu küçültecek yeni özellikler uygulandı. OTA güncelleme paketi boyutlarını küçülten iyileştirmeler şunlardır:
-
A/B bölümü olmayan cihaz güncellemelerinde tam görüntüler için genel amaçlı, kayıpsız sıkıştırma algoritması olan ZSTD'nin kullanımı. ZSTD, sıkıştırma düzeyi artırılarak daha yüksek sıkıştırma oranları için özelleştirilebilir. Sıkıştırma düzeyi, OTA oluşturma sırasında belirlenir ve
--vabc_compression_param=zstd,$COMPRESSION_LEVEL
işaretini ileterek ayarlanabilir. -
OTA sırasında kullanılan sıkıştırma penceresi boyutunu artırma. Maksimum sıkıştırma penceresi boyutu, bir cihazın
.mk
dosyasındaki derleme parametresi özelleştirilerek ayarlanabilir. Bu değişken,PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 262144
olarak ayarlanır. - Puffin yeniden sıkıştırma özelliğinin kullanımı: Bu özellik, deflate akışları için deterministik bir yama aracıdır ve A/B OTA güncelleme oluşturma için sıkıştırma ve farklılık işlevlerini yönetir.
-
Yama oluşturma aracı kullanımında yapılan değişiklikler (ör. yamaları sıkıştırmak için
bsdiff
kitaplığının kullanılma şekli) Android 9 ve sonraki sürümlerde,bsdiff
aracı, bir yama için en iyi sıkıştırma sonuçlarını verecek sıkıştırma algoritmasını seçer. -
update_engine
ile ilgili iyileştirmeler, A/B cihaz güncellemeleri için yamalar uygulandığında daha az bellek tüketilmesini sağladı.
Aşağıdaki bölümlerde, OTA güncelleme boyutlarını etkileyen çeşitli sorunlar, çözümleri ve AOSP'deki uygulama örnekleri ele alınmaktadır.
Dosya sırası
Sorun: Dosya sistemleri, bir dizindeki dosyaların listesi istendiğinde dosya sırasını garanti etmez. Ancak aynı ödeme için genellikle aynı sıra kullanılır. ls
gibi araçlar sonuçları varsayılan olarak sıralar ancak find
ve make
gibi komutlar tarafından kullanılan joker karakter işlevi sıralama yapmaz. Bu araçları kullanmadan önce çıktıları sıralamanız gerekir.
Çözüm: Joker karakter işleviyle find
ve make
gibi araçları kullandığınızda bu komutların çıkışını kullanmadan önce sıralayın. $(wildcard)
veya $(shell find)
simgelerini Android.mk
dosyalarında kullanırken bunları da sıralayın. Java gibi bazı araçlar girişleri sıralar. Bu nedenle, dosyaları sıralamadan önce kullandığınız aracın bunu yapmadığını doğrulayın.
Örnekler: Yerleşik all-*-files-under
makrosu kullanılarak temel derleme sisteminde birçok örnek düzeltildi. Bu makro, all-cpp-files-under
öğesini de içerir (çünkü çeşitli tanımlar diğer makefile'lara yayılmıştı).
Ayrıntılar için aşağıdaki makaleleri inceleyin:
- https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f
- https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410
- https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653
- https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c
Derleme dizini
Sorun: Öğelerin oluşturulduğu dizinin değiştirilmesi, ikili dosyaların farklı olmasına neden olabilir. Android derlemesindeki çoğu yol göreli yoldur. Bu nedenle, C/C++'da __FILE__
sorun oluşturmaz. Ancak hata ayıklama sembolleri, varsayılan olarak tam yol adını kodlar ve .note.gnu.build-id
, önceden temizlenmiş ikili dosyanın karma oluşturma işleminden üretilir. Bu nedenle, hata ayıklama sembolleri değişirse .note.gnu.build-id
da değişir.
Çözüm: AOSP artık hata ayıklama yollarını göreli hale getiriyor. Ayrıntılar için CL: https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02 adresine bakın.
Zaman damgaları
Sorun: Derleme çıkışındaki zaman damgaları, gereksiz dosya değişikliklerine neden oluyor. Bu durumun yaşanması muhtemel olan yerler:
- C veya C++ kodundaki
__DATE__/__TIME__/__TIMESTAMP__
makroları. - ZIP tabanlı arşivlere yerleştirilmiş zaman damgaları.
Çözümler/Örnekler: Derleme çıktısından zaman damgalarını kaldırmak için __DATE__/__TIME__/__TIMESTAMP__ in C/C++. ve Embedded timestamps in archives bölümlerinde verilen talimatları kullanın.
C/C++'da __DATE__/__TIME__/__TIMESTAMP__
Bu makrolar, farklı derlemeler için her zaman farklı çıktılar üretir. Bu nedenle, bunları kullanmayın. Bu makroları kaldırmak için kullanabileceğiniz birkaç seçeneği aşağıda bulabilirsiniz:
- Kaldırın. Örnek için https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f adresini inceleyin.
- Çalışan ikili dosyayı benzersiz şekilde tanımlamak için ELF üstbilgisinden derleme kimliğini okuyun.
-
İşletim sisteminin ne zaman oluşturulduğunu öğrenmek için
ro.build.date
(bu, bu tarihi güncellemeyebilecek artımlı derlemeler hariç her şey için geçerlidir) bölümünü okuyun. Örnek için https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84 adresine bakın.
Arşivlere (zip, jar) yerleştirilmiş zaman damgaları
Android 7.0, zip
komutunun tüm kullanımlarına -X
ekleyerek zip arşivlerindeki yerleştirilmiş zaman damgaları sorununu düzeltti. Bu işlem, oluşturucunun UID/GID'sini ve genişletilmiş Unix zaman damgasını zip dosyasından kaldırdı.
ziptime
(/platform/build/+/android16-release/tools/ziptime/
içinde bulunur) adlı yeni bir araç, zip üstbilgilerindeki normal zaman damgalarını sıfırlar. Ayrıntılı bilgi için README dosyasına bakın.
signapk
aracı, APK dosyaları için zaman damgaları ayarlar. Bu zaman damgaları, sunucu saat dilimine bağlı olarak değişebilir. Ayrıntılar için CL
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028 adresine bakın.
signapk
aracı, APK dosyaları için zaman damgaları ayarlar. Bu zaman damgaları, sunucu saat dilimine bağlı olarak değişebilir. Ayrıntılar için CL
https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028 adresine bakın.
Sürüm dizeleri
Sorun: APK sürüm dizelerine genellikle sabit kodlanmış sürümlerine BUILD_NUMBER
ekleniyordu. Bir APK'da başka hiçbir şey değişmese bile sonuç olarak APK yine de farklı olur.
Çözüm: Derleme numarasını APK sürüm dizesinden kaldırın.
Örnekler:
- https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27
- https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c
Cihaz üzerinde doğruluk hesaplamasını etkinleştirme
Cihazınızda dm-verity etkinse OTA araçları, doğruluk yapılandırmanızı otomatik olarak alır ve cihazda doğruluk hesaplamasını etkinleştirir. Bu, doğruluk bloklarının OTA paketinizde ham bayt olarak depolanmak yerine Android cihazlarda hesaplanmasına olanak tanır. Doğruluk blokları, 2 GB'lık bir bölüm için yaklaşık 16 MB kullanabilir.
Ancak cihazda doğruluk hesaplaması uzun sürebilir. Özellikle İletme Hata Düzeltme Kodu uzun sürebilir. Pixel cihazlarda bu işlem genellikle 10 dakika kadar sürer. Düşük özellikli cihazlarda bu işlem daha uzun sürebilir. Cihaz üzerinde doğruluk hesaplamasını devre dışı bırakmak ancak dm-verity'yi etkinleştirmek istiyorsanız OTA güncellemesi oluştururken --disable_fec_computation
aracına ota_from_target_files
değerini ileterek bunu yapabilirsiniz. Bu işaret, OTA güncellemeleri sırasında cihaz üzerinde doğruluk hesaplamasını devre dışı bırakır.
Bu yöntem, OTA yükleme süresini kısaltır ancak OTA paket boyutunu artırır. Cihazınızda dm-verity etkin değilse bu işaretin iletilmesinin hiçbir etkisi olmaz.
Tutarlı derleme araçları
Sorun: Yüklü dosyalar oluşturan araçlar tutarlı olmalıdır (belirli bir giriş her zaman aynı çıkışı vermelidir).
Çözümler/Örnekler: Aşağıdaki derleme araçlarında değişiklik yapılması gerekiyordu:
- NOTICE dosyası oluşturucu. NOTICE dosyası oluşturucu, tekrarlanabilir NOTICE koleksiyonları oluşturmak için değiştirildi. CL'ye bakın: https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64.
- Java Android Compiler Kit (Jack). Jack araç zincirinin, oluşturulan oluşturucu sıralamasındaki ara sıra yapılan değişiklikleri işlemek için güncellenmesi gerekiyordu. Araç zincirine, oluşturucular için deterministik erişimciler eklendi: https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b.
- ART AOT derleyicisi (dex2oat). ART derleyici ikilisi, deterministik bir görüntü oluşturma seçeneği ekleyen bir güncelleme aldı: https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9.
-
libpac.so dosyası (V8). V8 anlık görüntüsü her derlemede değiştiğinden her derleme farklı bir
/system/lib/libpac.so
dosyası oluşturur. Çözüm, anlık görüntüyü kaldırmaktı: https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29. - Uygulama önceden dexopt (.odex) dosyaları. Önceden dexopt edilmiş (.odex) dosyalar 64 bit sistemlerde başlatılmamış dolgu içeriyordu. Bu sorun düzeltildi: https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029.
Derleme farkı aracını kullanma
Derlemeyle ilgili dosya değişikliklerinin ortadan kaldırılmasının mümkün olmadığı durumlarda AOSP, iki dosya paketini karşılaştırmak için kullanılacak bir derleme karşılaştırma aracı target_files_diff.py
içerir. Bu araç, iki derleme arasında yinelemeli bir karşılaştırma yapar. Bu karşılaştırma, derlemeyle ilgili yaygın dosya değişikliklerini (ör.
- Derleme çıktısında beklenen değişiklikler (ör. derleme numarası değişikliği nedeniyle).
- Mevcut derleme sistemindeki bilinen sorunlar nedeniyle yapılan değişiklikler.
Derleme karşılaştırma aracını kullanmak için aşağıdaki komutu çalıştırın:
target_files_diff.py dir1 dir2
dir1
ve dir2
, her derleme için çıkarılan hedef dosyaları içeren temel dizinlerdir.
Blok ayırmayı tutarlı tutun
Belirli bir dosyanın içeriği iki derleme arasında aynı kalsa da verileri tutan gerçek bloklar değişmiş olabilir. Sonuç olarak, güncelleyicinin OTA güncellemesi için blokları taşımak üzere gereksiz G/Ç işlemleri yapması gerekir.
Sanal A/B OTA güncellemesinde gereksiz G/Ç, yazma sırasında kopyalama anlık görüntüsünü depolamak için gereken depolama alanını büyük ölçüde artırabilir. A/B olmayan bir OTA güncellemesinde, blokların OTA güncellemesi için taşınması, blok hareketleri nedeniyle daha fazla G/Ç olduğundan güncelleme süresine katkıda bulunur.
Bu sorunu gidermek için Google, Android 7.0'da blok ayırmayı derlemeler arasında tutarlı tutmak için make_ext4fs
aracını genişletti. make_ext4fs
aracı, ext4
resmi oluştururken dosyaları aynı bloklara ayırmaya çalışan isteğe bağlı bir -d base_fs
işaretini kabul eder. Blok eşleme dosyalarını (ör. base_fs
harita dosyaları) önceki bir derlemenin hedef dosyalarının ZIP dosyasından çıkarabilirsiniz. Her ext4
bölümü için IMAGES
dizininde bir .map
dosyası bulunur (örneğin, IMAGES/system.map
, system
bölümüne karşılık gelir). Bu base_fs
dosyalar daha sonra bu örnekte olduğu gibi PRODUCT_<partition>_BASE_FS_PATH
aracılığıyla kullanıma sunulabilir ve belirtilebilir:
PRODUCT_SYSTEM_BASE_FS_PATH := path/to/base_fs_files/base_system.map PRODUCT_SYSTEM_EXT_BASE_FS_PATH := path/to/base_fs_files/base_system_ext.map PRODUCT_VENDOR_BASE_FS_PATH := path/to/base_fs_files/base_vendor.map PRODUCT_PRODUCT_BASE_FS_PATH := path/to/base_fs_files/base_product.map PRODUCT_ODM_BASE_FS_PATH := path/to/base_fs_files/base_odm.map
Bu işlem, genel OTA paket boyutunu küçültmese de G/Ç miktarını azaltarak OTA güncelleme performansını artırır. Sanal A/B güncellemelerinde, OTA'yı uygulamak için gereken depolama alanı miktarını önemli ölçüde azaltır.
Uygulamaları güncellemekten kaçının
Derleme farklılıklarını en aza indirmenin yanı sıra, uygulama mağazaları üzerinden güncelleme alan uygulamaların güncellemelerini hariç tutarak OTA güncelleme boyutlarını da küçültebilirsiniz. APK'lar genellikle bir cihazdaki çeşitli bölümlerin önemli bir kısmını oluşturur. Uygulama mağazaları tarafından OTA güncellemesiyle güncellenen uygulamaların en son sürümlerinin dahil edilmesi, OTA paketlerinin boyutunu büyük ölçüde etkileyebilir ve kullanıcıya çok az fayda sağlayabilir. Kullanıcılar OTA paketini aldığında güncellenmiş uygulamayı veya uygulama mağazalarından doğrudan alınan daha yeni bir sürümü zaten kullanıyor olabilir.