Chrome Release Bot (LUCI) 4762b62e7d Publish DEPS for 106.0.5249.13 | 1 year ago | |
---|---|---|
.. | ||
java | 1 year ago | |
BUILD.gn | 1 year ago | |
README.md | 1 year ago | |
__init__.py | 1 year ago | |
generate_android_manifest.py | 1 year ago | |
generate_android_manifest.pydeps | 1 year ago | |
installer.py | 1 year ago | |
write_installer_json.py | 1 year ago | |
write_installer_json.pydeps | 1 year ago |
Incremental Install is a way of building & deploying an APK that tries to
minimize the time it takes to make a change and see that change running on
device. They work best with is_component_build=true
, and do not require a
rooted device.
Add the gn arg:
incremental_install = true
This causes all apks to be built as incremental except for denylisted ones.
It is not enough to adb install
them. You must use the generated wrapper
script:
out/Debug/bin/your_apk run
out/Debug/bin/run_chrome_public_test_apk # Automatically sets --fast-local-dev
The basic idea is to sideload .dex and .so files to /data/local/tmp
rather
than bundling them in the .apk. Then, when making a change, only the changed
.dex / .so needs to be pushed to the device.
Faster Builds:
final_dex
step (where all .dex files are merged into one)Faster Installs:
adb install
for code-only changes.Slower Initial Runs:
DexOpt
needs to run on all
.dex files. This step is normally done during adb install
, but is done on
start-up for incremental apks.
Caveats:
loadable_modules
are not sideloaded (they
remain in the apk), so builds & installs that modify any of these are not as
fast as those that modify only .java / .cc./data/local/tmp
, you need to use the wrapper
scripts to uninstall them fully. E.g.:
shell
out/Default/bin/chrome_public_apk uninstall
## The Code
All incremental apks have the same classes.dex, which is built from:
//build/android/incremental_install:bootstrap_java
They also have a transformed AndroidManifest.xml
, which overrides the the
main application class and any instrumentation classes so that they instead
point to BootstrapApplication
. This is built by:
//build/android/incremental_install/generate_android_manifest.py
Wrapper scripts and install logic is contained in:
//build/android/incremental_install/create_install_script.py
//build/android/incremental_install/installer.py
Finally, GN logic for incremental apks is sprinkled throughout.