| Android persistent Properties command overview |
| |
| 1. OVERVIEW |
| --------------------------------- |
| Android system properties are widely used among Android native services |
| to control runtime behaviour or pass information between processes. |
| Android's Init deamon can also trigger actions upon property changes [1] |
| Some of these properties will persist accross reboots. |
| They are stored in mmc, usually on the userdata partition [2] |
| |
| Persistent properties contain useful information which we might want to |
| inspect for debugging. |
| |
| One of particular interest is "persist.sys.boot.reason", which allows to |
| determine the boot reason without relying on BCB. |
| |
| DISCLAIMER: this is *debug* command. Should not be used in production. |
| Also probably won't work in production as userdata is usually encrypted. |
| |
| |
| 2. 'APROP'. SHELL COMMAND OVERVIEW |
| ----------------------------------- |
| |
| The 'aprop' command provides a CLI to facilitate the development of the |
| requirements enumerated above. Below is the command's help message: |
| |
| => aprop |
| aprop - Load/get/set/test/dump/store Android persistent properties |
| |
| Usage: |
| aprop load <dev> <part> - load properties from mmc <dev>:<part> |
| aprop get <key> - retrieves the <val> for <key> |
| aprop set <key> <val> - sets <key> to <val> |
| aprop test <key> <op> <val> - test <key> agains <val> |
| aprop dump - dump all properties in <key>=<val> format |
| aprop store - store all properties back to mmc |
| Legend: |
| <dev> - MMC device index containing the aprop partition |
| <part> - MMC partition index or name containing the property file |
| <key> - string/text representing a property key |
| <val> - string/text representing a property value |
| <op> - the binary operator used in 'aprop test': |
| '=' returns true if <val> matches <key>'s value |
| '~' returns true if <val> matches a subset of <key>'s value |
| |
| |
| 3. 'APROP'. EXAMPLE OF GETTING BOOT REASON |
| ----------------------------------- |
| if aprop load 0 userdata; then |
| # valid persist property file found |
| if aprop test persist.sys.bootreason = recovery; then |
| aprop set persist.sys.bootreason "none"; aprop store; |
| # do the equivalent of AOSP ${recoverycmd} |
| # i.e. do anything required for booting into recovery |
| else |
| # boot Android OS normally |
| fi |
| else |
| # encrypted/corrupted/non-existent property file |
| # continue boot Android OS or report error (platform-specific) |
| fi |
| |
| |
| 4. ENABLE ON YOUR BOARD |
| ----------------------------------- |
| The following Kconfig options must be enabled: |
| CONFIG_PARTITIONS=y |
| CONFIG_MMC=y |
| CONFIG_APROP=y |
| |
| Additionally, filesystem read/write support for the partition |
| must be enabled. Usually, the partition is in EXT4: |
| CONFIG_FS_EXT4=y |
| CONFIG_EXT4_WRITE=y |
| |
| [1] https://android.googlesource.com/platform/system/core/+/master/init/README.md |
| [2] https://android.googlesource.com/platform/system/core/+/refs/heads/master/init/persistent_properties.cpp#42 |