AOSP Integration Guide
The following guide will walk you through step-by-step how to integrate and validate Memfault's Android SDK in your custom AOSP project.
1. Create a Project
Create a Project and get a Project Key
Go to app.memfault.com and from the "Select A Project" dropdown, click on "Create Project" to setup your first project. Choose a name that reflects your product, such as "smart-sink-dev".
Select "Android (AOSP)" as your Project Type.
By default, the Device's Serial Number is used as the Device ID, collected from the ro.serialno
system property. Make sure that it is unique for every device in the same Project.
See our reference documentation on Hardware and Software Versions for further details about how to choose the right versions for your project. Note that these settings cannot be changed once the project is created!
Once you've created your project, you'll be automatically taken to an page that includes your project key. Copy the key and follow the rest of this guide.
2. Build your AOSP project with the Android SDK integrated
i. Clone the Android SDK into your project
Using a Git client, clone the bort
repository from:
git clone https://github.com/memfault/bort.git
Add this repo to your tree at vendor/memfault/bort
(i.e. add it to your repo
manifest).
ii. Include the Memfault Android SDK into your project Makefiles
We recommend placing the include
s below at the end of the respective
Makefile
s. This is because include
directives are used to append to
variables in the build script; placing them at the end of the file reduces the
chances that subsequent lines in the Makefile
do not redefine those variables
and discard the effect of the include
. If it is not possible to place the
include
at the end of the file, ensure that the respective variables are not
redefined (look for the :=
syntax).
Add this line to your device.mk
file to get the components included in your
build; this appends to the PRODUCT_PACKAGES
variable:
include vendor/memfault/bort/product.mk
Add this line to your BoardConfig.mk
file to get the sepolicy files picked up
by the build system; this appends to the BOARD_SEPOLICY_DIRS
and
BOARD_PLAT_PRIVATE_SEPOLICY_DIR
variables:
include vendor/memfault/bort/BoardConfig.mk
iii. Patch AOSP
Before Memfault Android SDK version 5.0, it is required to apply patches to the AOSP source code in order to integrate the Android SDK. After 5.0, patches are only required for the SDK to function on Android 8. Not all patches are required - some enhance enable/enhanced specific SDK features:
AOSP Version | Memfault Android SDK Version | Required AOSP Patches |
---|---|---|
8 | All | build/core/tasks / system/sepolicy |
11+ | < 5.0 | build/make/target/product/mainline |
For full details, see AOSP Patches.
Apply using the bort_cli.py
tool (requires Python 3.6+). Be sure to call this
using the correct Android OS version (--android-release
) for your build.
vendor/memfault/bort/bort_cli.py patch-aosp \
--android-release 14 \
<AOSP_ROOT>
iv. Patch Bort's application ID
Decide on an application ID for the Bort application. We recommend placing the
application under your domain, and appending bort
to your
reverse domain name
in some fashion. For example, com.mycorp.bort
.
If you're using the OTA Update Client, the OTA
application ID must also be set. For example, com.mycorp.bort.ota
.
OTA must be explicitly enabled — instructions here.
Patch Bort with your own application IDs:
vendor/memfault/bort/bort_cli.py patch-bort \
--bort-app-id <YOUR_BORT_APPLICATION_ID> \
--bort-ota-app-id <YOUR_BORT_OTA_APPLICATION_ID> \
<AOSP_ROOT>/vendor/memfault/bort/MemfaultPackages
This command will patch bort.properties
, setting the BORT_APPLICATION_ID
(and BORT_OTA_APPLICATION_ID
) properties to <YOUR_BORT_APPLICATION_ID>
and
YOUR_BORT_OTA_APPLICATION_ID
.
v. Configure bort.properties
You must set your Project Key in the Bort app. This is set in
MemfaultPackages/bort.properties
; the app will not compile without this
property.
If your devices will have
Google Mobile Services (GMS) and must
run the
Compatibility Test Suite (CTS),
you may need to update the target SDK version to match the API level of your
OS. This can be done by updating the TARGET_SDK_VERSION
property in
MemfaultPackages/bort.properties
.
Additional settings can be configured via the Android SDK over-the-air SDK settings system.
vi. Create a keystore for the Android SDK
Bort app
The Bort app requires a Java keystore file so that the app can be signed.
To generate a keystore, run the following command in the
<AOSP_ROOT>/vendor/memfault/bort/MemfaultPackages
directory:
$JAVA_HOME/bin/keytool -genkeypair -alias release_key -keypass secretPassword -keystore bort_keystore.jks -storepass secretPassword -validity 10000 -keyalg rsa
Make sure to change the secretPassword
to a uniquely generated password and
store that password securely. Please note that the -keypass
and -storepass
must be the same.
Alternatively, instructions on how to create a keystore in Android Studio can be found here. If you plan to update the app via the Play Store, you may wish to follow the additional instructions on that page.
- The key that is used to sign the Bort app must NOT be the platform signing key, otherwise the SDK will not function correctly.
- The key must ONLY be used to sign the Bort app and no other apps. Special permissions are assigned to Bort app based on the signing certificate.
Once you have a keystore, set up a keystore.properties
file and provide the
path to it via the bort.properties
file:
BORT_KEYSTORE_PROPERTIES_PATH=keystore.properties
The keystore.properties
file must contain these properties with the
appropriate values:
keyAlias=release_key # e.g. key0
keyPassword=secretPassword
storeFile=bort_keystore.jks
storePassword=secretPassword
OTA Update Client app
This step is only required if you are using the OTA Update Client.
If using the OTA Update Client, a separate keystore should be created, following the same steps as for the Bort app.
Once you have a keystore, set up a ota_keystore.properties
file and provide
the path to it via the bort.properties
file:
BORT_OTA_KEYSTORE_PROPERTIES_PATH=ota_keystore.properties
If using OTA, then this must be explicitly enabled - instructions here.
vii. Build the Android SDK APKs
Build the Bort APK
The MemfaultBort
app is built using gradle. Building the release APK will
automatically invoke a task to copy the resulting APK and place it in the root
directory where it will be picked up by the AOSP build system.
Building the Bort app with gradle requires the Android SDK location to be
configured. This can either be set with the ANDROID_HOME
environment variable,
or by opening the project with Android Studio (e.g. opening the root
build.gradle
) which will auto-generate a local.properties
file with the
sdk.dir
property. We recommend installing
Android Studio, which will automatically
install many Android SDK tools.
cd MemfaultPackages && ./gradlew :bort:assembleRelease
This will create a signed MemfaultBort.apk
and MemfaultBort.x509.pem
file.
The pem
file is a public certificate used by the system when enforcing the SE
policy.
Build the OTA Update Client APK
The MemfaultBortOta
app is built using gradle. Building the release APK will
automatically invoke a task to copy the resulting APK and place it in the root
directory where it will be picked up by the AOSP build system.
cd MemfaultPackages && ./gradlew :bort-ota:assembleRelease
This will create a signed MemfaultBortOta.apk
and MemfaultBortOta.x509.pem
file. The pem
file is a public certificate used by the system when enforcing
the SE policy.
Build the UsageReporter APK
The MemfaultUsageReporter
app is built using gradle. Building the release APK
will automatically invoke a task to copy the resulting APK and place it in the
root directory where it will be picked up by the AOSP build system.
cd MemfaultPackages && ./gradlew :reporter:assembleRelease
Build all APKs at once (Recommended)
All of the above APKs can be built using a single command! We recommend using the full command and letting gradle automatically optimize the recompilation.
cd MemfaultPackages && ./gradlew assembleRelease
viii. Compile and run the AOSP image on your device
After the APKs are built and the Makefiles are included in your AOSP project, compile your AOSP image, and flash it to your device.
By default, Memfault expects the MemfaultBort.apk
,
MemfaultUsageReporter.apk
, and MemfaultBort.x509.pem
files to exist in the
vendor/memfault/bort/MemfaultPackages
folder, so the Bort and UsageReporter
apps can be installed in the AOSP image.
If using OTA, the MemfaultBortOta.apk
and MemfaultBortOta.x509.pem
must also
exist in that folder.
Building these APKs using gradle will automatically copy the apk and certificates to the correct location, but you can define your own process as long as those files are written to that location before the image AOSP is built.