SystemAskıya Alma hizmeti

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:

  1. /sys/power/wakeup_count üzerinden okundu.
  2. 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.
  3. Sayaç sıfıra eşit olana kadar bekleyin.
  4. /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
  5. Şu adrese mem yazarak sistemi askıya alma işlemini başlatın: /sys/power/state.
  6. Yoksaymayı bırakın.

Uyanık kalma kilidi isteği başarıyla geri döndüğünde, askıya alma iş parçacığı engellendi.

Şekil 1. İleti dizisi döngüsünü askıya alın
'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.