| # Mobly Android Device Service |
| |
| This tutorial shows how to use the service mechanism in Mobly's `AndroidDevice` |
| controller. |
| |
| ## Purpose |
| Mobly's `AndroidDevice` controller is a Python module that lets users interact |
| with Android devices with Python code. |
| |
| Often times, we need long-running services associated with `AndroidDevice` |
| objects that persist during a test, e.g. adb logcat collection, screen |
| recording. Meanwhile, we may want to alter the device's state during the |
| test, e.g. reboot. |
| |
| `AndroidDevice` services makes it easier to implement long-running services. |
| |
| ## Usage |
| |
| Implement your service per the |
| [`BaseService` interface](https://github.com/google/mobly/blob/master/mobly/controllers/android_device_lib/services/base_service.py). |
| |
| Here is a dummy service example: |
| |
| `my_service.py` |
| |
| ```python |
| class Configs: |
| def __init__(self, secret=None): |
| self.secret = secret |
| |
| |
| class MyService(base_service.BaseService): |
| """Dummy service demonstrating the service interface.""" |
| def __init__(self, device, configs=None): |
| self._device = device |
| self._configs = configs |
| self._is_alive = False |
| |
| def get_my_secret(self): |
| return self._configs.secret |
| |
| @property |
| def is_alive(self): |
| """Override base class.""" |
| return self._is_alive |
| |
| def start(self): |
| """Override base class.""" |
| self._is_alive = True |
| |
| def stop(self): |
| """Override base class.""" |
| self._is_alive = False |
| ``` |
| |
| Once you have your service class, you can register your service with the |
| `ServiceManager`. Let's say we already have an `AndroidDevice` instance `ad`: |
| |
| ```python |
| ad.services.register('secret_service', |
| my_service.MyService, |
| my_service.Configs(secret=42)) |
| ``` |
| |
| After registration, you can interact with the service instance: |
| |
| ```python |
| ad.services.secret_service.is_alive # True |
| ad.services.secret_service.get_my_secret() # 42 |
| ``` |
| |
| When the `ad` reboots or gets destroyed, the service manager will handle the |
| lifecycle changes of each service instance. So users don't have to explicitly |
| write code to handle device state changes for each service, which makes the |
| test verbose. |
| |
| The service interface also has optional methods `pause` and `resume` for |
| services that are sensitive to device disconnect without reboot. For more |
| details, see the docstrings of the |
| [`BaseService` interface](https://github.com/google/mobly/blob/master/mobly/controllers/android_device_lib/services/base_service.py). |