Düşük RAM Yapılandırması

Android, 512 MB RAM'e sahip cihazları destekler. Bu belge, OEM'lerin düşük bellekli cihazlar için Android çekirdeği 4.4'ü optimize etmesine ve yapılandırmasına yardımcı olmayı amaçlamaktadır. Bu optimizasyonların birçoğu, önceki sürümlere de uygulanabilecek kadar geneldir.

Android çekirdek 4.4 platform optimizasyonları

Geliştirilmiş bellek yönetimi

  • Doğrulanmış bellek tasarrufu sağlayan çekirdek yapılandırmaları: zram'a geçin.
  • Önbelleğe alınmak üzereyse ve çok büyükse, önbelleğe alınmış işlemleri durdurun.
  • Büyük hizmetlerin kendilerini tekrar A Hizmetleri sınıflandırmasına sokmasına izin vermeyin (böylece başlatıcının durdurulmasına neden olamazlar).
  • Boşta bakımda çok büyük olan süreçleri (mevcut IME gibi normalde durdurulamaz olanları bile) durdurun.
  • Arka plan hizmetlerinin başlatılmasını seri hale getirin.
  • Düşük RAM aygıtlarının bellek kullanımını ayarlayın: daha sıkı bellek yetersiz (OOM) ayar seviyeleri, daha küçük grafik önbellekleri.

Azaltılmış sistem belleği

  • Kesilen system_server ve Sistem UI işlemleri (birkaç megabayt kaydedilir).
  • Dalvik'te önceden yüklenmiş dex önbellekleri (birkaç megabayt kaydedildi).
  • Doğrulanmış JIT-off seçeneği (işlem başına 1,5 MB'a kadar tasarruf sağlar).
  • Azaltılmış işlem başına yazı tipi önbellek yükü.
  • Tanıtılan ArrayMap / ArraySet ve bir hafif-ayak yerine çerçeve yaygın olarak kullanılan HashMap / HashSet .

prokstatlar

Ne sıklıkla çalıştıklarına ve tüketilen bellek miktarına göre sıralanmış bellek durumunu ve uygulama belleği kullanımını gösteren bir geliştirici seçeneği eklendi.

API

Katma ActivityManager.isLowRamDevice() uygulamalar düşük bellek cihazlar üzerinde çalışan algılamak ve devre dışı büyük RAM özelliklerine seçmek için izin vermek.

Bellek takibi

Eklenen memtrack HAL grafik bellek ayırmalarını, ek bilgileri izlemek için dumpsys MemInfo, meminfo'dan netleştirilmiştir özetleri (örneğin, boş RAM OEM yanlış şey optimize etmeye kalkma böylece, önbelleğe süreçlerin RAM içeren rapor).

Derleme zamanı yapılandırması

Düşük RAM Aygıtı bayrağı

ActivityManager.isLowRamDevice() bayrağı, uygulamaların belirli bellek yoğun özelliklerini kapatmak gerekirse belirlediği düşük bellek cihazlarında kötü çalışma.

512 MB cihazlar için, bu bayrak dönmesi bekleniyor true . Cihaz makefile'de aşağıdaki sistem özelliği ile etkinleştirilebilir.

PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true

Başlatıcı Yapılandırmaları

Başlatıcıda varsayılan duvar kağıdı kurulum canlı duvar kağıdı kullanmamalısınız. Düşük bellekli cihazlar herhangi bir canlı duvar kağıdını önceden yüklememelidir.

Çekirdek yapılandırması

Doğrudan geri kazanımı azaltmak için çekirdek/ActivityManager'ı ayarlama

Doğrudan geri alma, bir işlem veya çekirdek bir bellek sayfası ayırmaya çalıştığında (doğrudan veya yeni bir sayfadaki hata nedeniyle) ve çekirdek kullanılabilir tüm boş belleği kullandığında gerçekleşir. Bu, çekirdeğin bir sayfayı boşaltırken ayırmayı engellemesini gerektirir. Bu da genellikle G / Ç kirli bir dosya destekli sayfasını dışarı floş veya beklemek disk gerektirir lowmemorykiller bir süreci durdurmak için. Bu, bir UI iş parçacığı dahil olmak üzere herhangi bir iş parçacığında fazladan G/Ç ile sonuçlanabilir.

Doğrudan yeniden hak önlemek için çekirdek tetik o filigran vardır kswapd veya arka plan talebiyle. Bu, sayfaları boşaltmaya çalışan bir iş parçacığıdır, böylece bir dahaki sefere gerçek bir iş parçacığı tahsis edildiğinde, hızlı bir şekilde başarılı olabilir.

Arka plan geri almayı tetiklemek için varsayılan eşik, 2 GB cihazda yaklaşık 2 MB ve 512 MB cihazda 636 KB olmak üzere oldukça düşüktür. Çekirdek, arka plan geri alma işleminde yalnızca birkaç megabayt belleği geri alır. Bu, birkaç megabayttan fazlasını hızlı bir şekilde tahsis eden herhangi bir işlemin hızlı bir şekilde doğrudan geri kazanmayı vuracağı anlamına gelir.

Bir çekirdek ayarlanabilir desteği, Android-3.4 çekirdek dalında 92189d47f66c67e5fd92eafaa287e153197a454f ("ayarlanabilir ekstra ücretsiz kbayt ekle") olarak eklenir. Kiraz-toplama bir cihazın çekirdeğe bu yamayı verir ActivityManager ücretsiz üç tam ekranı bellek 32 bpp tamponlarını tutmaya çalışmak çekirdek anlatmak için.

Bu eşikler ile yapılandırılabilir config.xml çerçevesi.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists).  A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller.  Overrides the default value chosen by ActivityManager based
on screen size.  0 prevents keeping any extra memory over what the kernel keeps
by default.  -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists).  0 uses the default value chosen by
ActivityManager.  A positive value  will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller.  Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

LowMemoryKiller'ı Ayarlama

ActivityManager eşikleri yapılandırır LowMemoryKiller dosya destekli sitelerinin çalışma kümesinin kendi beklentisini maç için (önbelleğe sayfaları) her bir öncelik seviyesi kova süreçleri çalıştırmak için gerekli. Bir cihazın çalışma grubu için yüksek gereksinimleri varsa, örneğin satıcı kullanıcı arayüzü daha fazla bellek gerektiriyorsa veya daha fazla hizmet eklenmişse, eşikler artırılabilir.

Dosya destekli sayfalar için çok fazla bellek ayrılmışsa, eşikler düşürülebilir, böylece önbelleğin çok küçük olması nedeniyle arka plan işlemleri disk thrashing meydana gelmeden çok önce öldürülür.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel.  A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory.  A low value will keep more
processes in memory but may cause thrashing if set too low.  Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets.  -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel.  A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory.  A low value will
keep more processes in memory but may cause thrashing if set too low.  Directly
added to the default value chosen by          ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>

zram'a geç

zram takas, bellek sayfalarını sıkıştırarak ve bunları dinamik olarak ayrılmış bir bellek takas alanına yerleştirerek sistemdeki kullanılabilir bellek miktarını artırabilir. Bu, CPU zamanını küçük bir bellek artışı için takas eder, bu nedenle zram takasının sisteminiz üzerindeki performans etkisini değerlendirirken bu gerçeği göz önünde bulundurun.

Android, zram'a geçişi çeşitli düzeylerde gerçekleştirir.

  • Öncelikle, zram takasını etkin bir şekilde kullanmak için bu çekirdek seçeneklerini etkinleştirin:
    • CONFIG_SWAP
    • CONFIG_ZRAM
  • Senin fstab bakışlar böyle bir satır ekleyin:
    /dev/block/zram0 none swap defaults zramsize=<size in bytes>,swapprio=<swap partition priority>
    
    • zramsize zorunludur ve muhafazasına zram alanı ne kadar istediğimi sıkıştırılmamış bellek gösterir. %30-50 aralığında sıkıştırma oranları bekleyebilirsiniz.
    • swapprio Birden fazla takas alanı varsa isteğe bağlıdır ve yalnızca kullanım içindir.

    Bir şekilde ilişkili blok aygıtı etiketleyin swap_block_device cihaza özgü olarak sepolicy/file_contexts bu SELinux'un düzgün işlem görmüştür, böylece.

    /dev/block/zram0 u:object_r:swap_block_device:s0
    
  • Varsayılan olarak, Linux çekirdeği bir seferde sekiz sayfa bellekte yer değiştirir. Zram kullanırken, bir seferde bir sayfa okumanın artan maliyeti ihmal edilebilir düzeydedir ve cihaz aşırı bellek baskısı altındaysa yardımcı olabilir. Bir seferde yalnızca bir sayfa okumak için not almak için şunları da eklemek init.rc :
    write /proc/sys/vm/page-cluster 0
    
  • Senin içinde init.rc sonra mount_all /fstab.X hattı ekleyin:
    swapon_all /fstab.X
    
  • Bu özellik çekirdekte etkinleştirilmişse, bellek grupları önyükleme sırasında otomatik olarak yapılandırılır.
  • Bellek cgroups varsa, ActivityManager işaretleri diğer ipliklerden daha değiştirilebilen olarak konuları öncelikli indirin. Bellek ihtiyaç duyulması halinde, Android çekirdek tarafından işaretlenen bellek sayfalarına daha yüksek bir öncelik verilmesi, zram takası için bellek sayfalarını göç başlar ActivityManager .

Oymalar, İyon ve bitişik bellek ayırma (CMA)

Düşük bellekli cihazlarda, özellikle güvenli video oynatma için oyma gibi tam olarak kullanılmayan oymalar konusunda dikkatli olmak önemlidir. Donanımınızın tam gereksinimlerine bağlı olarak oyma bölgelerinizin etkisini en aza indirmek için çeşitli çözümler vardır.

Donanım, bitişik olmayan bellek ayırmalarına izin veriyorsa, Ion sistem yığını, bir oyma ihtiyacını ortadan kaldırarak, sistem belleğinden bellek ayırmalarına izin verir. Ion ayrıca çevre birimleri üzerindeki çeviriye bakan arabellek (TLB) baskısını ortadan kaldırmak için büyük tahsisler yapmaya çalışır. Bellek bölgelerinin bitişik olması veya belirli bir adres aralığıyla sınırlı olması gerekiyorsa, CMA kullanılabilir.

Bu, sistemin hareketli sayfalar için de kullanabileceği bir oyma oluşturur. Bölgeye ihtiyaç duyulduğunda, hareketli sayfalar bunun dışına taşınır ve sistemin ücretsiz olduğunda başka amaçlar için büyük bir oyma kullanmasına izin verir. CMA'yı doğrudan Ion CMA yığınıyla kullanabilirsiniz.

Uygulama optimizasyonu ipuçları

  • İnceleme uygulamanızın belleğini yönetme ve bu blog yayınlarını:
  • Kullanılarak önceden yüklenmiş uygulamalar arasından kullanılmayan varlıklarını çıkarın development/tools/findunused (bu uygulama daha küçük olmasına yardımcı olur).
  • Varlıklar için, özellikle saydam alanları olduğunda PNG biçimini kullanın.
  • Yerel kod kullanın yazma Eğer calloc() yerine malloc / memset .
  • Parsel verilerini diske yazan ve daha sonra okuyan kodu etkinleştirmeyin.
  • Kurulan her pakete abone olmak yerine SSP filtrelemeyi kullanın. Böyle filtreleme ekleyin:
    <data android:scheme="package" android:ssp="com.android.pkg1" />
    <data android:scheme="package" android:ssp="com.myapp.act1" />
    

Android'deki çeşitli işlem durumlarını anlayın

Durum anlam Ayrıntılar
SERVICE
SERVICE_RESTARTING
Uygulamayla ilgili nedenlerle arka planda çalışan uygulamalar. SERVICE SERVICE_RESTARTING çok fazla arka planda çalıştırdığınızda en sık rastlanan sorunlar uygulamalar var bulunmaktadır. Kullanım% süresi * metrik bir "kötülük" olarak pss veya% süreleri. İdeal olarak, bu uygulamalar hiç çalışmamalıdır.
IMPORTANT_FOREGROUND
RECEIVER
Arka planda çalışan uygulamalar (kullanıcıyla doğrudan etkileşime girmeyen). Bunlar sisteme bellek yükü ekler. Bu işlemlerin sırası için (% süresini * pss) "kötülük" değerini kullanın. Ancak, bu uygulamaların çoğu iyi nedenlerle çalışır. PSS büyüklüğü kendi hafıza yükünün önemli bir parçasıdır.
PERSISTENT Kalıcı sistem süreci. Bu süreçlerin çok büyük almak için izlemek için PSS'YE izleyin.
TOP Kullanıcının şu anda etkileşimde olduğu süreç. pss kullanımda iken uygulaması oluşturur ne kadar bellek yükü gösteren Burada önemli ölçümdür.
HOME
CACHED_EMPTY
Sistemin tekrar ihtiyaç duyulması durumunda etrafında tuttuğu süreçler. Bu süreçler herhangi bir zamanda serbestçe öldürülebilir ve gerekirse yeniden oluşturulabilir. Bellek durumu (normal, orta, düşük, kritik), sistemin bu işlemlerden kaç tanesini çalıştırdığına bağlı olarak hesaplanır. Bu işlemler için metrik anahtar pss olduğunu. Bu durumda, bu işlemler, maksimum toplam işlem sayısının tutulmasına izin vermek için bellek ayak izlerini mümkün olduğunca azaltır. Bu durumda, bir iyi huylu uygulaması genellikle de yaptığından daha önemli ölçüde daha küçük pss ayak izi vardır TOP devlet.
CACHED_ACTIVITY
CACHED_ACTIVITY_CLIENT
İle karşılaştırıldığında TOP , bir uygulama arka planda belleği serbest bırakır ne kadar iyi bu gösteri. Hariç CACHED_EMPTY süreç kullanıcı ile etkileşim yanı sıra bazı nedenlerden dolayı başladığında bu durumları kaldırır çünkü devlet, daha iyi bu verileri yapar. UI havai uğraşan bu ortadan kaldırır CACHED_EMPTY zaman kullanıcı ilgili faaliyetleri alır.

analiz

Uygulama başlatma zamanını analiz etme

Uygulamanızın başlangıç zamanını analiz etmek, koşmak $ adb shell am start -P veya --start-profiler ve uygulamanızı başlatın. Profil oluşturucu, işlem zigottan çatallandıktan sonra ve çatala herhangi bir kod yüklenmeden önce başlar.

Hata raporlarını kullanarak analiz etme

Hata raporları dahil olmak üzere birçok hizmetler içerebilir batterystats , netstats , procstats ve usagestats ayıklama için de kullanılabilir. Raporlar aşağıdaki gibi satırları içerebilir:

------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------
7,0,h,-2558644,97,1946288161,3,2,0,340,4183
7,0,h,-2553041,97,1946288161,3,2,0,340,4183

Kalıcı süreçleri kontrol etme

Kalıcı işlemleri kontrol etmek için cihazı yeniden başlatın ve işlemleri kontrol edin. Ardından cihazı birkaç saat çalıştırın ve işlemleri tekrar kontrol edin. İki kontrol arasında uzun süren işlemler olmamalıdır.

Uzun ömür testleri yapmak

Uzun ömür testleri yapmak için cihazı daha uzun süre çalıştırın ve artıp artmadığını veya sabit kaldığını belirlemek için işlemlerin belleğini izleyin. Ardından standart kullanım senaryoları oluşturun ve bu senaryolar üzerinde uzun ömür testleri çalıştırın.