Android 9 ve önceki sürümlerde libsuspend'de bir iş parçacığı vardır
askıya alma sürecini başlatabilirsiniz. Android 10
SystemAskıya Alma HIDL hizmetinde eşdeğer bir işlev sunar.
Bu hizmet sistem görüntüsünde bulunur ve Android platformu tarafından sunulur.
libsuspend
işlevinin mantığı, tüm kullanıcı alanları hariç büyük ölçüde aynı kalır
Sistem askıya alma işlemini engelleyen işlemin System aktarılırken kullanılabilmesi gerekir.
libsuspend ve libpower
Android 10'da Systemsuspended hizmeti
libsuspend
libpower
,
/sys/power/wake[un]lock
C API'sini değiştirmeden kullanabilirsiniz.
Bu sözde kod, acquire_wake_lock
özelliğinin nasıl uygulanacağını gösterir
ve release_wake_lock
.
static std::unordered_map<std::string, sp<IWakeLock>> gWakeLockMap;
int acquire_wake_lock(int, const char* id) {
...
if (!gWakeLockMap[id]) {
gWakeLockMap[id] = suspendService->acquireWakeLock(WakeLockType::PARTIAL, id);
}
...
return 0;
}
int release_wake_lock(const char* id) {
...
if (gWakeLockMap[id]) {
auto ret = gWakeLockMap[id]->release();
gWakeLockMap[id].clear();
return 0;
}
...
return -1;
}
Yürütme ileti dizileri
Systemsuspended hizmeti, askıya alma sayacı. İki yürütme dizisi vardır:
- Ana ileti dizisi, bağlayıcı çağrılarını yanıtlar.
- Askıya alma ileti dizisi, sistemi askıya alma işlemini kontrol eder.
Ana iş parçacığı
Ana iş parçacığı, müşterilerden gelen yeni uyanık kalma kilitleri ayırma isteklerini yanıtlar. askıya alma sayacını artırma/azaltma.
İleti dizisini askıya al
Askıya alma ileti dizisi, bir döngüde aşağıdakileri gerçekleştirir:
/sys/power/wakeup_count
üzerinden okundu.- Eşkensizi alın. Bu, askıya alma ileti dizisinin ana iş parçacığı aşağıdaki işlemleri yapmaya çalışırken askıya alma sayacını nasıl azaltacağınızı belirleyebilirsiniz. Ana ileti dizisi engellendi askıya alma sayacı sıfıra ulaştığında uyanık kalma kilitlerinin verilmesi veya kaldırılması hakkında ve askıya alma ileti dizisinin çalıştırılmaya çalışıldığı anlamına gelir.
- Sayaç sıfıra eşit olana kadar bekleyin.
/sys/power /wakeup_count
adımından okunan değeri (1. adımdan) bu dosyaya yazın. Yazma işlemi başarısız olursa döngünün başına dönün- Şu adrese
mem
yazarak sistemi askıya alma işlemini başlatın:/sys/power/state
. - Yoksaymayı bırakın.
Uyanık kalma kilidi isteği başarıyla geri döndüğünde, askıya alma iş parçacığı engellendi.
'nı inceleyin.SystemAskıya Alma API'sı
Systemsuspended API iki arayüzden oluşur. HIDL arayüzü kullanılır uyanık kalma kilitleri edinmek için yerel işlemler tarafından kullanılıyor ve AIDL arayüzü SystemServer ile SystemStorage arasındaki iletişimi sağlar.
ISystemsuspended HIDL arayüzü
enum WakeLockType : uint32_t {
PARTIAL,
FULL
};
interface IWakeLock {
oneway release();
};
interface ISystemSuspend {
acquireWakeLock(WakeLockType type, string debugName)
generates (IWakeLock lock);
};
Uyanık kalma kilidi isteyen her istemci benzersiz bir sinyal alır
IWakeLock
örneği. Bu,
Birden fazla izin veren /sys/power/wake_lock
aynı ad altında uyanık kalma kilidini kullanmalarını sağlar. Bir müşterinin
IWakeLock
örneği sonlandırılır, bağlayıcı sürücüsü ve
SystemPending hizmeti temizler.
IsuspendedControlService AIDL arayüzü
IsuspendedControlService yalnızca SystemServer tarafından kullanılmak üzere tasarlanmıştır.
interface ISuspendCallback {
void notifyWakeup(boolean success);
}
interface ISuspendControlService {
boolean enableAutosuspend();
boolean registerCallback(ISuspendCallback callback);
boolean forceSuspend();
}
Android HIDL'den yararlanma şu avantajları sağlar:
- Askıya alma işlemini engelleyen bir işlem sona ererse Systemsuspended bilgilendirilebilir.
- Sistemin askıya alınmasından sorumlu iş parçacığına bir geri çağırma verilebilir.