Watch your Manifest. Lin Wang | Android Efficiency Engineer | by Pinterest Engineering | Pinterest Engineering Weblog
3 min read
Lin Wang | Android Efficiency Engineer
It’s a widely known truth for Android builders that an app’s manifest (AndroidManifest.xml) holds essential software declarations. It’s hardly ever monitored after being arrange as a result of we assume it hardly adjustments. At Pinterest, nonetheless, we’ve been actively monitoring the manifest after realizing it does change every now and then.
Whereas constructing an app, Gradle downloads all of the dependent libraries to compile and hyperlink them with the app. These dependent libraries every have their very own mini manifest. In the course of the construct course of, Android Gradle Plugin (AGP) merges them with the app’s primary manifest to kind the ultimate manifest. Due to this merging course of, the ultimate manifest usually appears to be like fairly completely different from the unique one and comprises extra declarations. Most often, these further declarations are mandatory for dependent libraries to operate. Nevertheless, typically they will have unintended behaviors.
It first caught our consideration throughout a chilly begin regression investigation. We discovered a third occasion Software program Improvement Equipment (SDK) declaring a particular ContentProvider in its manifest to heat up itself as early as potential. It’s because content material suppliers get initialized very early through the software startup, even earlier than the Utility’s onCreate() methodology is invoked. Nevertheless, we wish to management each third occasion libraries’ initialization and solely initialize them when it’s mandatory. Subsequently, we added the next declaration:
Including this declaration to the manifest will trigger the SdkEarlyInitializer to be faraway from the ultimate merged manifest. This transformation resulted in a chilly begin enchancment of 130ms.
From then on, we created the next course of to commonly monitor the merged manifest adjustments earlier than touchdown a commit, beginning with taking a snapshot of the present merged manifest and protecting it within the codebase:
- As a part of the PR construct, we evaluate the merged manifest towards the snapshot.
- If a distinction is detected, we fail the construct.
- The PR developer should then regulate the snapshot manifest if the adjustments are mandatory, or add the right “take away” tags to maintain the brand new elements out of the ultimate manifest.
A small group of blocking reviewers will assessment each manifest change.
- Found the WorkManagerInitializer (ContentProvider), which was added by the work supervisor library. We firstly eliminated it and notified Google, who ultimately added assist for initializing the work supervisor with a custom configuration.
- Discovered a brand new intent was added by upgrading of the exoplayer library to 2.15.0. We then contributed to the continued issue discussion with Google to lastly have this pointless intent eliminated.
- Detected the AD_ID permission was added by a library.
- The common cshell diff is enough to check manifests
- AGP does typically reorder the gadgets in manifest with out altering the content material, wherein case the snapshot must be adjusted
- Ignoring white areas and newlines is important
- Steadily modified gadgets within the manifest must be explicitly ignored (e.g. UUIDs, model codes)
With this method, we shall be alerted when any new part will get added to our app and really feel extra assured each time we add new dependencies.
Android Efficiency Workforce: Arun Okay, Ernesto Duhart, Lin Wang, Sheng Liu, Tom Harman
Particular Thanks: Sha Sha Chu (She Her)
To study extra about engineering at Pinterest, take a look at the remainder of our Engineering Weblog and go to our Pinterest Labs website. To discover life at Pinterest, go to our Careers web page.