Всегда ли триггеры свойств инициализации Android происходят при загрузке, и если да, то когда именно? - PullRequest
0 голосов
/ 27 августа 2018

Документация от Google по Android init на https://android.googlesource.com/platform/system/core/+/oreo-release/init/README.md гласит следующее

Действие может иметь несколько триггеров свойств, но может иметь только один триггер события.

Например: on boot && property:a=b определяет действие, которое является только выполняется, когда происходит событие «boot» и свойство a равно б.

on property:a=b && property:c=d определяет действие, которое выполняется в три раза:

  1. Во время начальной загрузки, если свойство a = b и свойство c = d.
  2. Каждый раз, когда это свойство a переходит к значению b, а свойство c уже равно d.
  3. Каждый раз, когда свойство c переходит к значению d, а свойство a уже равно b.

В первом примере триггер on boot представляется необходимым условием для выполнения действия при загрузке. Однако во втором примере триггер on boot не используется, хотя в документации сказано, что действие все равно будет выполняться при загрузке.

Так что, похоже, только одно из двух утверждений верно:

  1. property триггеры никогда не происходят при загрузке автоматически, и в этом случае описание второго примера неверно для случая # 1
  2. property всегда выполняются при загрузке, когда они истинны, а не только при переходе, в этом случае первый пример не должен включать триггер boot.

Если второе утверждение верно, то это определенно фаза boot и не сказать late-init?

1 Ответ

0 голосов
/ 28 августа 2018

Я решил пойти дальше и запустить несколько тестов. Свидетельства показывают, что документация верна о том, что происходит, но не содержит подробных сведений о том, почему.

Первый пример on boot && property:a=b будет выполняться во время загрузки, когда init запускает событие boot. Обратите внимание, что не все свойства инициализируются одновременно, и это может повлиять на их доступность во время различных событий загрузки. Также обратите внимание, что этот пример не будет работать при изменении свойства. Основная путаница заключается в том, что свойства в init являются как событиями, так и состояниями, где фазы init являются только событиями.

Второй пример запускается во время загрузки, но он не связан с событием boot! Он запускается при первой инициализации свойства при загрузке. Также, как описано, оно запускается, когда одно из свойств изменяется на объявленное значение, а другое условие свойства имеет значение true.

Результаты испытаний:

on boot
    exec /system/bin/echo "Trigger test A"

Запускать, когда init запускает событие «boot» во время загрузки

on late-init
    exec /system/bin/echo "Trigger test B"

Запускать, когда init запускает событие "late-init" во время загрузки

on property:persist.testing=1
    exec /system/bin/echo "Trigger test C"

Запускается, когда свойство загружается из постоянных свойств файловой системы во время загрузки, также запускается, когда свойство переходит к указанному значению

on boot && property:persist.testing=1
    exec /system/bin/echo "Trigger test D"

Не запускается во время процесса загрузки (свойство persist в данный момент недоступно), не запускается при переходе свойства к указанному значению

on post-fs-data && property:persist.testing=1
    exec /system/bin/echo "Trigger test E"

Не запускается во время процесса загрузки (свойство persist в данный момент недоступно), не запускается при переходе свойства к указанному значению

on property:ro.build.type=eng
    exec /system/bin/echo "Trigger test F"

Запуск во время процесса загрузки, когда это конкретное свойство загружается впервые

on boot && property:ro.build.type=eng
    exec /system/bin/echo "Trigger test G"

Запуск во время процесса загрузки, когда init запускает событие «boot» (свойство было доступно в то время)

on post-fs-data && property:ro.build.type=eng
    exec /system/bin/echo "Trigger test H"

Запускать во время процесса загрузки дважды, когда init запускает событие post-fs-data, один раз, когда данные монтируются до расшифровки, и один раз, когда данные монтируются после дешифрования

on late-init && property:ro.build.type=eng
    exec /system/bin/echo "Trigger test I"

Не запускается во время процесса загрузки (свойство в данный момент недоступно)

Исторические свидетельства:

01-20 20:33:14.986     0     0 I init    : processing action (late-init) from (/init.rc:270)
01-20 20:33:15.001     0     0 I init    : starting service 'exec 1 (/system/bin/echo Trigger test B)'...
01-20 20:33:15.652     0     0 I init    : processing action (post-fs-data) from (/init.rc:373)
01-20 20:33:15.841     0     0 I init    : processing action (ro.build.type=eng && post-fs-data) from (/vendor/etc/init/hw/init.device.log.rc:69)
01-20 20:33:15.841     0     0 I init    : starting service 'exec 11 (/system/bin/echo Trigger test H)'...
01-20 20:33:17.025     0     0 I init    : processing action (boot) from (/init.rc:556)
01-20 20:33:17.250     0     0 I init    : processing action (boot) from (/vendor/etc/init/hw/init.device.log.rc:48)
01-20 20:33:17.251     0     0 I init    : starting service 'exec 14 (/system/bin/echo Trigger test A)'...
01-20 20:33:17.301     0     0 I init    : processing action (ro.build.type=eng && boot) from (/vendor/etc/init/hw/init.device.log.rc:66)
01-20 20:33:17.301     0     0 I init    : starting service 'exec 15 (/system/bin/echo Trigger test G)'...
01-20 20:33:17.361     0     0 I init    : processing action (enable_property_trigger) from (<Builtin Action>:0)
01-20 20:33:17.386     0     0 I init    : processing action (ro.build.type=eng) from (/vendor/etc/init/hw/init.device.log.rc:63)
01-20 20:33:17.388     0     0 I init    : starting service 'exec 16 (/system/bin/echo Trigger test F)'...
01-20 20:33:19.272     0     0 I init    : processing action (vold.decrypt=trigger_post_fs_data) from (/init.rc:671)
01-20 20:33:19.272     0     0 I init    : processing action (post-fs-data) from (/init.rc:373)
01-20 20:33:19.495     0     0 I init    : processing action (ro.build.type=eng && post-fs-data) from (/vendor/etc/init/hw/init.device.log.rc:69)
01-20 20:33:19.495     0     0 I init    : starting service 'exec 21 (/system/bin/echo Trigger test H)'...
01-20 12:33:19.880     0     0 I init    : processing action (persist.testing=1) from (/vendor/etc/init/hw/init.device.log.rc:54)
01-20 12:33:19.881     0     0 I init    : starting service 'exec 24 (/system/bin/echo Trigger test C)'...
08-27 14:25:06.256     0     0 I init    : processing action (persist.testing=1) from (/vendor/etc/init/hw/init.device.log.rc:54)
08-27 14:25:06.257     0     0 I init    : starting service 'exec 29 (/system/bin/echo Trigger test C)'...
...