Skip to content
Create a gist now

Instantly share code, notes, and snippets.

google-play-services-strip-script
actions=true
ads=true
analytics=true
appindexing=true
appstate=true
auth=true
cast=true
common=true
drive=false
dynamic=true
games=false
gcm=true
identity=true
internal=true
location=false
maps=false
panorama=false
plus=true
security=true
tagmanager=true
wallet=false
wearable=true
#!/bin/sh
#
# Strips the Google Play Services JAR archive and removes the folders that are specified below.
# This should lower the methods count of the final DEX file and should lower the chance of hitting
# the (dreaded) 64K methods limit.
#
#
# Author: Sebastiano Gottardo
# @rotxed - dextorer[at]gmail[dot]com
#
PLAY_SERVICES_FILENAME="google-play-services.jar"
PLAY_SERVICES_TEMP_DIR="google-play-services-temp"
PLAY_SERVICES_STRIP_FILE="strip.conf"
PLAY_SERVICES_NESTED_PATH="com/google/android/gms"
PLAY_SERVICES_OUTPUT_FILE="google-play-services-STRIPPED.jar"
# Check if file exists in the same directory
if [ ! -f $PLAY_SERVICES_FILENAME ]; then
echo "\nPlease put this script in the Play Services JAR location, then run it again\n\n"
exit -1
fi
# Preventive cleanup
rm -rf $PLAY_SERVICES_TEMP_DIR
# Create temporary work folder
mkdir $PLAY_SERVICES_TEMP_DIR
cp $PLAY_SERVICES_FILENAME $PLAY_SERVICES_TEMP_DIR/
cd $PLAY_SERVICES_TEMP_DIR
# Extract the content of the Play Services JAR archive
echo "Extracting archive, please wait.."
jar xvf $PLAY_SERVICES_FILENAME > /dev/null
echo "Extracted.\n"
# If the configuration file doesn't exist, create it
if [ ! -f ../$PLAY_SERVICES_STRIP_FILE ]; then
# Create the file
touch ../$PLAY_SERVICES_STRIP_FILE
FOLDERS=`ls $PLAY_SERVICES_NESTED_PATH`
for index in $FOLDERS
do
echo "$index=true" >> ../$PLAY_SERVICES_STRIP_FILE
done
fi
# Read configuration from file
while read -r FOLDERS
do
CURRENT_FOLDER=$FOLDERS
CURRENT_FOLDER_NAME=`echo $CURRENT_FOLDER | awk -F'=' '{print $1}'`
CURRENT_FOLDER_ENABLED=`echo $CURRENT_FOLDER | awk -F'=' '{print $2}'`
if [ "$CURRENT_FOLDER_ENABLED" = false ]; then
echo "Removed $CURRENT_FOLDER_NAME folder"
rm -rf "$PLAY_SERVICES_NESTED_PATH/$CURRENT_FOLDER_NAME"
fi
done < ../"$PLAY_SERVICES_STRIP_FILE"
# Create final stripped JAR
jar cf $PLAY_SERVICES_OUTPUT_FILE com/
cp $PLAY_SERVICES_OUTPUT_FILE ../
cd ..
# Clean up
echo "\nFolders removed, cleaning up.."
rm -rf $PLAY_SERVICES_TEMP_DIR
echo "All done, exiting!"
exit 0
@megatronxxx

while read -r FOLDERS misses last line
It fixes like that while read -r FOLDERS || [[ -n "$FOLDERS" ]];

@sliskiCode

When I use your script with only maps=true I get java.lang.NoClassDefFoundError: com.google.android.gms.maps.MapView$b. Any ideas?

@medvedev84

I recommend to use "-p" flag for copying jar into temp directory to avoid permissions issue:
cp -p $PLAY_SERVICES_FILENAME $PLAY_SERVICES_TEMP_DIR/

@Daemon-Devarshi

I am trying to run above shell script in a mac machine, but I am always getting error: ' syntax error near unexpected token `do' :(

Any clues?

@ilya-shknaj

line 36: jar command not found
line 63: jar: command not found
cp: cannot stat 'google-play-services-STRIPPED.jar' : No suc file or directory

What do I wrong?

@aftabsikander

Can anyone tell me how to run this script a short tutorial will help
Thanks

@hoolrory

As a hint to anyone else who comes along, you will probably need to keep common, internal, and dynamic as it looks like those are used by a few of the other ones. Still getting a handle on it myself

@marinomeneghel

Found a problem using the stripped library. The file strip.conf is the same of the sample, except for the location that's true. When I check if play services are available, I get the error java.lang.NoClassDefFoundError: com.google.android.gms.R$string
on the line that shall show the error dialog from play service:
GooglePlayServicesUtil.getErrorDialog(resultCode, this,
PLAY_SERVICES_ERROR_REQUEST_CODE).show();
Do anyone have a solution for this?

@MoMannn

I have the same problem as: ilya-shknaj

EDIT: the problem was that I did not have java in PATH.

@NovopayVinay

maps=true I get java.lang.NoClassDefFoundError: com.google.android.gms.maps.MapView$b while doing maps with stripped google play services

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.