| #! /bin/bash | |
| # Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file | |
| # for details. All rights reserved. Use of this source code is governed by a | |
| # BSD-style license that can be found in the LICENSE file. | |
| # This script will update the host art VM in tools/linux/host/art-<version>. | |
| # See tools/linux/README.art-versions for full details. | |
| # | |
| # Before running this script make sure that you have built the system image and | |
| # host Art version required in your Android checkout: | |
| # | |
| # source build/envsetup.sh | |
| # lunch aosp_akita-trunk_staging-userdebug | |
| # m systemimage | |
| # SISO_EXPERIMENTS=ignore-missing-targets art/tools/buildbot-build.sh --host | |
| # repo manifest -r -o build_spec.xml | |
| set -e | |
| ANDROID_CHECKOUT=~/android/master | |
| ANDROID_PRODUCT=akita | |
| ART_DIR=host/art-master | |
| DEST_ROOT=tools/linux | |
| function usage { | |
| echo "Usage: $(basename $0)" | |
| echo " [--android-checkout <android repo root>]" | |
| echo " [--art-dir <destination directory>]" | |
| echo " [--android-product <product name>]" | |
| echo " [--destination-dir <destination directory>]" | |
| echo "" | |
| echo " --android-checkout specifies the Android repo root" | |
| echo " Defaults to: $ANDROID_CHECKOUT" | |
| echo "" | |
| echo " --art-dir specifies the directory name inside the root destination" | |
| echo " directory for the art bundle" | |
| echo " Defaults to: $ART_DIR" | |
| echo "" | |
| echo " --android-product specifies the Android product for the framework to include" | |
| echo " Defaults to: $ANDROID_PRODUCT" | |
| echo "" | |
| echo " --destination-dir specifies the root destination directory for the art bundle" | |
| echo " Defaults to: $DEST_ROOT" | |
| echo "" | |
| echo "Update the master version of art from ~/android/master:" | |
| echo " " | |
| echo " $(basename $0)" | |
| echo " " | |
| echo "Update a specific version of art:" | |
| echo " " | |
| echo " $(basename $0) --android-checkout ~/android/checkout --art-dir host/art-17.1.0 --android-product akita" | |
| echo " " | |
| echo "Test the Art bundle in a temporary directory:" | |
| echo " " | |
| echo " $(basename $0) --android-checkout ~/android/checkout --art-dir host/art-17.1.0 --android-product akita --destination-dir /tmp/art" | |
| echo " " | |
| exit 1 | |
| } | |
| # Process options. | |
| while [ $# -gt 0 ]; do | |
| case $1 in | |
| --android-checkout) | |
| ANDROID_CHECKOUT="$2" | |
| shift 2 | |
| ;; | |
| --art-dir) | |
| ART_DIR="$2" | |
| shift 2 | |
| ;; | |
| --android-product) | |
| ANDROID_PRODUCT="$2" | |
| shift 2 | |
| ;; | |
| --destination-dir) | |
| DEST_ROOT="$2" | |
| shift 2 | |
| ;; | |
| --help|-h|-H|-\?) | |
| usage | |
| ;; | |
| *) | |
| echo "Unkonwn option $1" | |
| echo "" | |
| usage | |
| ;; | |
| esac | |
| done | |
| ANDROID_HOST_BUILD=$ANDROID_CHECKOUT/out/host/linux-x86 | |
| ANDROID_TARGET_BUILD=$ANDROID_CHECKOUT/out/target | |
| DEST=$DEST_ROOT/$ART_DIR | |
| # Clean out the previous version of Art. | |
| rm -rf $DEST | |
| # Copy build_spec.xml for documentation. | |
| mkdir -p $DEST | |
| if [ -f $ANDROID_CHECKOUT/build_spec.xml ]; then | |
| cp $ANDROID_CHECKOUT/build_spec.xml $DEST | |
| # Remove the build spec to ensure it is created anew for a new build. | |
| rm $ANDROID_CHECKOUT/build_spec.xml | |
| else | |
| echo "File $ANDROID_CHECKOUT/build_spec.xml not found. Please run" | |
| echo | |
| echo " repo manifest -r -o build_spec.xml" | |
| echo | |
| echo "in $ANDROID_CHECKOUT" | |
| exit 1 | |
| fi | |
| # Required binaries and scripts. | |
| mkdir -p $DEST/bin | |
| if [ -f $ANDROID_HOST_BUILD/bin/art ]; then | |
| cp $ANDROID_HOST_BUILD/bin/art $DEST/bin | |
| else | |
| cp $ANDROID_CHECKOUT/art/tools/art $DEST/bin | |
| fi | |
| cp $ANDROID_HOST_BUILD/bin/dalvikvm64 $DEST/bin | |
| cp $ANDROID_HOST_BUILD/bin/dalvikvm32 $DEST/bin | |
| # Copy the dalvikvm link creating a regular file instead, as download_from_google_stroage.py does | |
| # not allow tar files with symbolic links (depending on Android/Art version dalvikvm links to | |
| # dalvikvm32 or dalvikvm64). | |
| cp $ANDROID_HOST_BUILD/bin/dalvikvm $DEST/bin | |
| cp $ANDROID_HOST_BUILD/bin/dex2oat $DEST/bin | |
| if [ -e $ANDROID_HOST_BUILD/bin/dex2oat64 ] | |
| then cp $ANDROID_HOST_BUILD/bin/dex2oat64 $DEST/bin | |
| fi | |
| if [ -e $ANDROID_HOST_BUILD/bin/patchoat ] | |
| # File patchoat does not exist on Q anymore. | |
| then cp $ANDROID_HOST_BUILD/bin/patchoat $DEST/bin | |
| fi | |
| # Required framework files. | |
| mkdir -p $DEST/framework | |
| mkdir -p $DEST/out/host/linux-x86/framework | |
| cp -R $ANDROID_HOST_BUILD/framework/* $DEST/framework | |
| cp $ANDROID_HOST_BUILD/framework/*.jar $DEST/out/host/linux-x86/framework | |
| # Required library files. | |
| mkdir -p $DEST/lib64 | |
| cp -r $ANDROID_HOST_BUILD/lib64/* $DEST/lib64 | |
| mkdir -p $DEST/lib | |
| cp -r $ANDROID_HOST_BUILD/lib/* $DEST/lib | |
| # Image files required for dex2oat of actual android apps. We need an actual android product | |
| # image containing framework classes to verify the code against. | |
| mkdir -p $DEST/product/$ANDROID_PRODUCT/system/framework | |
| cp -rL $ANDROID_TARGET_BUILD/product/$ANDROID_PRODUCT/system/framework/* $DEST/product/$ANDROID_PRODUCT/system/framework | |
| # Required auxillary files. | |
| if [ -e $ANDROID_HOST_BUILD/apex ]; then | |
| mkdir -p $DEST/apex | |
| cp -rL $ANDROID_HOST_BUILD/apex/* $DEST/apex | |
| if [ -e $ANDROID_HOST_BUILD/com.android.i18n ]; then | |
| mkdir -p $DEST/com.android.i18n | |
| cp -r $ANDROID_HOST_BUILD/com.android.i18n/* $DEST/com.android.i18n | |
| fi | |
| if [ -e $ANDROID_HOST_BUILD/com.android.tzdata ]; then | |
| mkdir -p $DEST/com.android.tzdata | |
| cp -r $ANDROID_HOST_BUILD/com.android.tzdata/* $DEST/com.android.tzdata | |
| fi | |
| if [ -e $ANDROID_HOST_BUILD/usr ]; then | |
| mkdir -p $DEST/usr | |
| cp -r $ANDROID_HOST_BUILD/usr/* $DEST/usr | |
| fi | |
| else | |
| if [ -e $ANDROID_HOST_BUILD/usr/icu ]; then | |
| mkdir -p $DEST/usr/icu | |
| cp -r $ANDROID_HOST_BUILD/usr/icu/* $DEST/usr/icu | |
| else | |
| mkdir -p $DEST/com.android.runtime/etc/icu/ | |
| cp -r $ANDROID_HOST_BUILD/com.android.runtime/etc/icu/* $DEST/com.android.runtime/etc/icu/ | |
| fi | |
| fi | |
| # Update links for vdex files for Android P and later. | |
| if [ -f $DEST/product/$ANDROID_PRODUCT/system/framework/boot.vdex ]; then | |
| for VDEXFILE in $DEST/product/$ANDROID_PRODUCT/system/framework/*.vdex; do | |
| VDEXNAME=$(basename ${VDEXFILE}); | |
| for ARCH in arm64; do | |
| rm $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME}; | |
| # This relative link command will create a symbolic link of the form | |
| # ../${VDEXNAME} for each architecture. | |
| # ln -r -s $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME}; | |
| # The Cloud Storage dependency tool (download_from_google_storage.py) does | |
| # not allow synlinks at all, so instad of the ln in the comment above just | |
| # copy the ${VDEXNAME} files. | |
| cp $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME}; | |
| done | |
| done | |
| fi | |
| # Allow failure for strip commands below. | |
| set +e | |
| strip $DEST/bin/* 2> /dev/null | |
| strip $DEST/lib/* | |
| strip $DEST/lib64/* | |
| strip $DEST/framework/x86/* 2> /dev/null | |
| strip $DEST/framework/x86_64/* 2> /dev/null | |
| echo "Now run" | |
| echo "(cd $(dirname $DEST); upload_to_google_storage.py -a --bucket r8-deps $(basename $DEST))" |