ตั้งแต่ Android 11 เป็นต้นไป บริการ AIDL เดิมที่ทำงานในพาร์ติชันระบบจะเริ่มต้นและหยุดแบบไดนามิกได้ตามต้องการ บริการแบบไดนามิกจะเริ่มต้นเมื่อมีการขอเป็นครั้งแรกและจะหยุดโดยอัตโนมัติเมื่อไม่มีการใช้งาน
บริการที่ทำงานแบบไดนามิกได้
ฟีเจอร์นี้ใช้ได้กับบริการเดิมเท่านั้นที่ init
และ servicemanager
ควบคุมวงจรชีวิตของบริการได้ ระบบไม่รองรับบริการภายในแพ็กเกจแอป และคุณควรใช้บริการที่เชื่อมโยงแทน
การปิดระบบแบบไดนามิกจะทำงานโดยการปิดกระบวนการที่บริการทำงานอยู่ หากมีหลายบริการอยู่ในกระบวนการเดียวกัน บริการทั้งหมดจะต้องลงทะเบียนเป็นแบบไดนามิกเพื่อให้เข้ากันได้กับฟีเจอร์นี้ จากนั้นกระบวนการดังกล่าวจะปิดลงเมื่อไม่มีการใช้งานบริการทั้งหมด
กำหนดค่าไฟล์ init .rc ของบริการ
หากต้องการเรียกใช้บริการแบบไดนามิก ให้เพิ่มตัวเลือกต่อไปนี้ลงในไฟล์ init.rc
ของบริการหลังบรรทัด service <name> <cmd>
นำหน้า
interface aidl serviceName
disabled
oneshot
ตัวเลือกเหล่านี้จะทําสิ่งต่อไปนี้
interface aidl serviceName
: อนุญาตให้servicemanager
ค้นหาบริการ หากบริการใช้อินเทอร์เฟซหลายรายการ ให้ประกาศอินเทอร์เฟซแต่ละรายการในบรรทัดของตัวเอง ชื่อเหล่านี้ต้องเป็นชื่อเดียวกับที่servicemanager
คาดหวังและอาจต่างจากชื่อกระบวนการdisabled
: ป้องกันไม่ให้บริการเริ่มทำงานโดยอัตโนมัติเมื่อเปิดเครื่องoneshot
: ป้องกันไม่ให้บริการรีสตาร์ทโดยอัตโนมัติทุกครั้งที่หยุด
ดูข้อมูลเพิ่มเติมได้ที่Readme ภาษา Init ของ Android ใน AOSP
ตัวอย่าง
ลงทะเบียนบริการ
บริการแต่ละรายการสร้างขึ้นและจดทะเบียนกับ servicemanager
โดยทั่วไปการลงทะเบียนจะเกิดขึ้นในไฟล์ชื่อ main.cpp
แต่การใช้งานอาจแตกต่างกันไป โดยปกติการลงทะเบียนจะมีลักษณะดังนี้
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
บางครั้งการลงทะเบียนจะแสดงเป็น BinderService::publish
หรือ
BinderService::instantiate
ซึ่งเรียกใช้โค้ดข้างต้น
หากต้องการลงทะเบียนบริการเป็นแบบไดนามิก ให้แทนที่รหัสการลงทะเบียนด้วยข้อมูลต่อไปนี้
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
สื่อสารกับ LazyServiceRegistrar
เพื่อปิดบริการโดยอิงตามจํานวนการอ้างอิง
ตัวอย่าง
กำหนดค่าไคลเอ็นต์บริการ AIDL
รับบริการ
หากต้องการเรียกข้อมูลบริการแบบ Lazy คุณต้องเริ่มบริการแล้วจึงเรียกข้อมูล
การเรียกใช้ getService
ในเครื่องมือจัดการบริการจะเริ่มต้นบริการ แต่โดยปกติแล้ว คุณจะต้องใช้บริการทันทีที่พร้อมใช้งาน และควรใช้ตัวแปร waitForService
ดูเอกสารประกอบเกี่ยวกับวิธีใช้ฟีเจอร์เหล่านี้สำหรับแบ็กเอนด์แต่ละประเภท
ปล่อยบริการ
การปิดเครื่องแบบไดนามิกจะเป็นไปตามการนับข้อมูลอ้างอิง ดังนั้นไคลเอ็นต์จะต้องไม่เก็บบริการไว้เมื่อไม่ได้ใช้งาน
ตัวอย่าง
ปิดใช้การปิดเครื่องชั่วคราว
หากต้องการให้บริการทำงานอย่างอิสระจนกว่างานบางอย่างจะเสร็จสมบูรณ์ แล้วเปลี่ยนไปใช้ลักษณะการทำงานแบบไดนามิก คุณสามารถใช้ LazyServiceRegistrar::forcePersist
เพื่อเปิดและปิดการปิดระบบแบบไดนามิกได้ หากเรียกใช้จากฝั่งเซิร์ฟเวอร์ ก็ควรเรียกใช้ก่อน registerService
ตัวอย่างเช่น apexservice