blob: 90077552ac11ea0f5d518193db97fcac95973095 [file] [edit]
#!/usr/bin/env bash
function usage() {
echo "Usage: studiow [--clear-caches] [--clean] [--reinstall] <project subset>|<comma-separated project prefixes>"
echo
echo "OPTIONS"
echo
echo " --clear-caches"
echo " Clear generated caches (but not user settings) before launching"
echo
echo " --clean"
echo " Clear (with backup) generated files (settings, caches, etc) before launching"
echo " Also implies --clear-caches"
echo
echo " --reinstall"
echo " Remove and re-download Studio itself. Also implies --clean"
echo
echo "Project subsets:"
echo " m, main"
echo " Open the project subset main: non-Compose Jetpack libraries"
echo
echo " c, compose"
echo " Open the project subset compose"
echo
echo " ca, camera"
echo " Open the project subset camera"
echo
echo " f, flan"
echo " Open the project subset flan: Fragment, Lifecycle, Activity, and Navigation"
echo
echo " m3, material3"
echo " Open the project subset material3 and material catalog"
echo
echo " media"
echo " Open the project subset media: Media, Media2, and MediaRouter"
echo
echo " kmp"
echo " Open the project subset KMP: Projects that have KMP builds"
echo
echo " w, wear"
echo " Open the project subset for Wear OS libraries"
echo
echo " g, glance"
echo " Open the project subset for glance projects"
echo
echo " x, xr"
echo " Open the project subset for XR projects"
echo
echo
echo " native"
echo " Open the project subset for native projects"
echo
echo " a, all"
echo " Open the project subset all"
echo
echo "Or use project prefixes to scope down even further. For example:"
echo " studiow :palette:palette"
echo " studiow :room3,:sqlite"
echo
exit 1
}
cd "$(dirname $0)"
subsetArg=""
clearCaches=false
cleanSettings=false
reinstall=false
projectSubset=""
projectPrefix=""
acceptTos=false
while [ "$1" != "" ]; do
arg="$1"
shift
# parse options
if [ "$arg" == "--acceptTos" ]; then
acceptTos=true
continue
fi
if [ "$arg" == "--clear-caches" ]; then
clearCaches=true
continue
fi
if [ "$arg" == "--clean" ]; then
clearCaches=true
cleanSettings=true
continue
fi
if [ "$arg" == "--reinstall" ]; then
clearCaches=true
cleanSettings=true
reinstall=true
continue
fi
# parse arguments
subsetArg="$arg"
newSubset=""
newPrefix=""
if [ "$subsetArg" == "m" -o "$subsetArg" == "main" ]; then
newSubset=main
fi
if [ "$subsetArg" == "c" -o "$subsetArg" == "compose" ]; then
newSubset=compose
fi
if [ "$subsetArg" == "ca" -o "$subsetArg" == "camera" ]; then
newSubset=camera
fi
if [ "$subsetArg" == "f" -o "$subsetArg" == "flan" ]; then
newSubset=flan
fi
if [ "$subsetArg" == "m3" -o "$subsetArg" == "material3" ]; then
newPrefix=":compose:material3,:compose:integration-tests:material-catalog"
fi
if [ "$subsetArg" == "media" ]; then
newSubset=media
fi
if [ "$subsetArg" == "w" -o "$subsetArg" == "wear" ]; then
newSubset=wear
fi
if [ "$subsetArg" == "g" -o "$subsetArg" == "glance" ]; then
newSubset=glance
fi
if [ "$subsetArg" == "k" -o "$subsetArg" == "kmp" ]; then
newSubset=kmp
fi
if [ "$subsetArg" == "native" ]; then
newSubset=native
fi
if [ "$subsetArg" == "a" -o "$subsetArg" == "all" ]; then
newSubset=all
fi
if [ "$subsetArg" == "t" -o "$subsetArg" == "tools" ]; then
newSubset=tools
fi
if [ "$subsetArg" == "wm" -o "$subsetArg" == "window" ]; then
newSubset=window
fi
if [ "$subsetArg" == "x" -o "$subsetArg" == "xr" ]; then
newSubset=xr
fi
if [[ $subsetArg == :* ]]; then
newPrefix=$subsetArg
fi
if [ "$newSubset" == "" ] && [ "$newPrefix" == "" ]; then
echo "Unrecognized argument: '$subsetArg'"
usage
fi
if [ "$projectSubset" != "" ]; then
echo "Unrecognized argument '$subsetArg', cannot specify project subset more than once"
usage
fi
if [ "$projectPrefix" != "" ]; then
echo "Unrecognized argument '$subsetArg', cannot specify project prefix more than once"
usage
fi
projectSubset=$newSubset
projectPrefix=$newPrefix
done
if [ "$projectSubset" == "" ] && [ "$projectPrefix" == "" ]; then
echo "Project subset or project prefix is required"
usage
fi
if [ "$projectSubset" != "" ]; then
unset PROJECT_PREFIX
export ANDROIDX_PROJECTS=$projectSubset
echo "Tip: Opening a full project subset ('$projectSubset') can be slow and memory-intensive."
echo " If you only need a specific module or set of modules, specify them using project prefixes to speed up launch time."
echo " Studiow will automatically load all required dependencies for you."
echo " Example: ./studiow :compose:material"
echo " Example: ./studiow :compose:material,:paging:paging-common"
echo
else
unset ANDROIDX_PROJECTS
export PROJECT_PREFIX=$projectPrefix
fi
# ensures the nonexistence of a file or directory, and makes a backup
function remove() {
path="$1"
backup="$(dirname $path)/studio-backup/$(basename $path)"
if [ -e "$path" ]; then
echo "Moving $path to $backup"
rm -rf "$backup"
mkdir -p "$(dirname $backup)"
mv "$path" "$backup"
fi
}
if [ "$reinstall" == "true" ]; then
# remove Studio itself so Gradle will re-download it
rm -rf studio
fi
# remove studio-specific caches
if [ "$cleanSettings" == "true" ]; then
# make backups of files that users might have customized
remove ~/.AndroidStudioAndroidX
remove ~/.AndroidStudioAndroidXPlayground
remove ~/.android
fi
if [ "$clearCaches" == "true" ]; then
# delete (without backup) files that users won't have customized
git clean -fdX .idea/
# remove gradle caches too and build
./cleanBuild.sh -y studio
else
# ask gradle to launch studio
if [ "$acceptTos" == "true" ]; then
./gradlew :studio --acceptTos
else
./gradlew :studio
fi
fi