You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
4.2 KiB
108 lines
4.2 KiB
# Manifest Split
|
|
|
|
## Overview
|
|
|
|
Split manifests are Android repo manifests that contain the minimum set of
|
|
projects necessary to build a given target. If a project isn't used for building
|
|
the target, it shouldn't be in the split manifest. This smaller manifest can be
|
|
used to sync the Android source tree and build the specific target. This sync
|
|
should be faster and smaller than a sync of a full manifest because it is
|
|
syncing less projects.
|
|
|
|
The `treble_manifest_split` tool is used to automatically create a split
|
|
manifest from a full manifest using dependency information from the source tree
|
|
and the build outputs. The tool attempts to infer as many dependencies as it
|
|
can, but some will be missed due to implicit dependencies in the build system
|
|
and source tree. This is solved by manually fine-tuning a tool configuration XML
|
|
specific to your target.
|
|
|
|
## Example for aosp_arm64
|
|
|
|
### 1. Run a full build using a full manifest
|
|
|
|
The `treble_manifest_split` tool needs the ninja build graph and deps log from a
|
|
completed build in order to have a full view of the dependency graph. While the
|
|
build graph is created at the beginning of a ninja build, the deps log is not
|
|
complete until the build finishes.
|
|
|
|
Use standard Android build commands to build your target.
|
|
|
|
### 2. Use the treble_manifest_split tool
|
|
|
|
```shell
|
|
# Change to the directory where you ran the full build.
|
|
cd /path/to/android
|
|
|
|
# Set command line variables for the Android target you are using and the build
|
|
# target that should be buildable from your split manifest.
|
|
ANDROID_TARGET=aosp_arm64-userdebug
|
|
BUILD_TARGET=droid
|
|
|
|
# Build treble_manifest_split as a python binary.
|
|
lunch $ANDROID_TARGET
|
|
m treble_manifest_split
|
|
|
|
# Create the split manifest using a sample config XML specific to aosp_arm64.
|
|
out/host/linux-x86/bin/treble_manifest_split \
|
|
--manifest .repo/manifests/default.xml \
|
|
--split-manifest split_default.xml \
|
|
--debug-file debug.json \
|
|
--config tools/treble/split/sample_config.xml \
|
|
$BUILD_TARGET
|
|
```
|
|
|
|
### 3. Build using the split manifest
|
|
|
|
You should test that the split manifest created by the tool can be used to build
|
|
the partial target files package.
|
|
|
|
1. Initialize a new repo directory using the steps in
|
|
https://source.android.com/setup/build/downloading#initializing-a-repo-client.
|
|
1. Replace the `.repo/manifests/default.xml` full manifest with the
|
|
newly-generated split manifest.
|
|
1. Use standard `repo sync` commands to sync your repo.
|
|
1. Attempt a build of your target.
|
|
|
|
### 4. Fix build errors
|
|
|
|
Build errors may arise due to missing dependencies that were previously provided
|
|
by now-removed projects. These dependencies may be implicit in the source code,
|
|
or an explicit dependency type that is not yet able to be automatically detected
|
|
by the tool.
|
|
|
|
1. Find the dependency source project in your full-manifest repo directory.
|
|
1. Update your config XML to manually add projects to your split manifest.
|
|
|
|
- For example, the following line in `sample_config.xml` in this tool
|
|
directory specifies a project that should be included in the split
|
|
manifest even if the tool doesn't automatically detect that it is
|
|
necessary.
|
|
|
|
```
|
|
<add_project name="platform/external/python/cpython3" />
|
|
```
|
|
|
|
1. Regenerate the split manifest using `treble_manifest_split` in your
|
|
full-manifest directory. Remember to pass the path of your config XML to the
|
|
script's `--config` flag.
|
|
|
|
### 5. Compare built artifacts
|
|
|
|
A successful build alone is not sufficient to have full confidence in the split
|
|
manifest. You should diff the output artifacts of the split-manifest build
|
|
against the output artifacts of the full-manifest build.
|
|
|
|
Suggestions for viewing diffs:
|
|
|
|
- Use an external directory diffing tool on the output directories for each
|
|
partition, such as `out/target/product/<device>/system`.
|
|
- Use `development/vndk/tools/image-diff-tool/diff.py` on output directories,
|
|
or on a zipped target-files archive if you are creating `dist` builds.
|
|
|
|
The following may cause differences between output artifacts:
|
|
|
|
- Non-hermetic inputs used in the module build rule, such as timestamps. Can
|
|
be fixed by removing the timestamp from the build rule.
|
|
- An implicit and optional source dependency. Can be fixed by manually adding
|
|
the project that defines the missing source.
|