mirror of
https://github.com/opengapps/opengapps.git
synced 2025-11-08 07:54:31 +00:00
1426 lines
63 KiB
Bash
Executable File
1426 lines
63 KiB
Bash
Executable File
makeupdatebinary(){
|
|
get_fallback_arch "$ARCH" #make sure that $fallback_arch will be available
|
|
echo '#!/sbin/ash
|
|
#This file is part of The Open GApps script of @mfonville.
|
|
#
|
|
# The Open GApps scripts are free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version, w/Open GApps installable zip exception.
|
|
#
|
|
# These scripts are distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# This Open GApps Shell Script Installer file for Open GApps Installer is derived from the work of @TKruzze and @osm0sis,
|
|
# Their original work is used with permission, under the license that it may be re-used to continue the GApps package.
|
|
# This Open GApps Shell Script Installer includes code derived from the TK GApps of @TKruzze and @osm0sis,
|
|
# The TK GApps are available under the GPLv3 from http://forum.xda-developers.com/android/software/tk-gapps-t3116347
|
|
#
|
|
unzip -o "$3" '"$EXTRACTFILES"' -d /tmp;'> "$build/META-INF/com/google/android/update-binary"
|
|
case "$EXTRACTFILES" in
|
|
*xzdec*) echo 'chmod +x /tmp/xzdec'>> "$build/META-INF/com/google/android/update-binary";; #xz-decompression binary bundled
|
|
esac
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
. /tmp/installer.data;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Declare Variables
|
|
ZIP="$3";
|
|
zip_folder="$(dirname "$ZIP")";
|
|
OUTFD=/proc/self/fd/$2;
|
|
g_prop=/system/etc/g.prop;
|
|
bkup_tail=/tmp/bkup_tail.sh;
|
|
gapps_removal_list=/tmp/gapps-remove.txt;
|
|
g_log=/tmp/g.log;
|
|
calc_log=/tmp/calc.log;
|
|
conflicts_log=/tmp/conflicts.log;
|
|
rec_cache_log=/cache/recovery/log;
|
|
rec_tmp_log=/tmp/recovery.log;
|
|
user_remove_notfound_log=/tmp/user_remove_notfound.log;
|
|
user_remove_multiplefound_log=/tmp/user_remove_multiplefound.log;
|
|
|
|
log_close="# End Open GApps Install Log\n";
|
|
|
|
reclaimed_gapps_space_kb=0;
|
|
reclaimed_removal_space_kb=0;
|
|
reclaimed_aosp_space_kb=0;
|
|
total_install_size_kb=0;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Define Functions
|
|
abort() {
|
|
quit;
|
|
ui_print "- NO changes were made to your device";
|
|
ui_print " ";
|
|
ui_print "Installer will now exit...";
|
|
ui_print " ";
|
|
ui_print "Error Code: $1";
|
|
sleep 5;
|
|
exxit "$1";
|
|
}
|
|
|
|
ch_con() {
|
|
LD_LIBRARY_PATH=/system/lib /system/lib64 /system/toolbox chcon u:object_r:system_file:s0 "$1";
|
|
LD_LIBRARY_PATH=/system/lib /system/lib64 /system/bin/toolbox chcon u:object_r:system_file:s0 "$1";
|
|
chcon u:object_r:system_file:s0 "$1";
|
|
}
|
|
|
|
ch_con_recursive() {
|
|
dirs=$(echo "$@" | awk '{ print substr($0, index($0,$1)) }');
|
|
for i in $dirs; do
|
|
find "$i" -exec LD_LIBRARY_PATH=/system/lib /system/lib64 /system/toolbox chcon u:object_r:system_file:s0 {} +;
|
|
find "$i" -exec LD_LIBRARY_PATH=/system/lib /system/lib64 /system/bin/toolbox chcon u:object_r:system_file:s0 {} +;
|
|
find "$i" -exec chcon u:object_r:system_file:s0 {} +;
|
|
done;
|
|
}
|
|
|
|
complete_gapps_list() {
|
|
cat <<EOF
|
|
$full_removal_list
|
|
EOF
|
|
}
|
|
|
|
contains() {
|
|
case "$1" in
|
|
*"$2"*) return 0;;
|
|
*) return 1;;
|
|
esac;
|
|
}
|
|
|
|
clean_inst() {
|
|
if [ -f /data/system/packages.xml ] && [ "$forceclean" != "true" ]; then
|
|
return 1;
|
|
fi;
|
|
return 0;
|
|
}
|
|
|
|
extract_app() {
|
|
tarpath="/tmp/$1.tar.xz"
|
|
unzip -o "$ZIP" "$1.tar.xz" -d /tmp;
|
|
app_name="$(basename "$1")";
|
|
which_dpi "$app_name";
|
|
if [ "$dpiapkpath" != "unknown" ]; then #technically not necessary, 'unknown' folder would not exist anyway
|
|
folder_extract "$tarpath" "$dpiapkpath";
|
|
fi
|
|
folder_extract "$tarpath" "$app_name/common";
|
|
rm -f "$tarpath";
|
|
}
|
|
|
|
exxit() {
|
|
set_progress 0.98;
|
|
if ( ! grep -qi "nodebug" "$g_conf" ); then
|
|
if [ "$g_conf" ]; then # copy gapps-config files to debug logs folder
|
|
cp -f "$g_conf_orig" /tmp/logs/gapps-config_original.txt;
|
|
cp -f "$g_conf" /tmp/logs/gapps-config_processed.txt;
|
|
fi;
|
|
ls -alZR /system > /tmp/logs/System_Files_After.txt;
|
|
df -k > /tmp/logs/Device_Space_After.txt;
|
|
cp -f "$log_folder/open_gapps_log.txt" /tmp/logs;
|
|
cp -f $b_prop /tmp/logs;
|
|
cp -f /system/addon.d/70-gapps.sh /tmp/logs;
|
|
cp -f $gapps_removal_list "/tmp/logs/gapps-remove_revised.txt";
|
|
cp -f $rec_cache_log /tmp/logs/Recovery_cache.log;
|
|
cp -f $rec_tmp_log /tmp/logs/Recovery_tmp.log;
|
|
cd /tmp;
|
|
tar -cz -f "$log_folder/open_gapps_debug_logs.tar.gz" logs/*;
|
|
cd /;
|
|
fi;
|
|
rm -rf /tmp/*;
|
|
set_progress 1.0;
|
|
ui_print "- Unmounting /system, /data, /cache, /persist";
|
|
ui_print " ";
|
|
umount /system;
|
|
umount /data;
|
|
umount /cache;
|
|
umount /persist;
|
|
exit "$1";
|
|
}
|
|
|
|
file_getprop() {
|
|
grep "^$2" "$1" | cut -d= -f2;
|
|
}
|
|
|
|
folder_extract() {
|
|
if [ "$bundled_xz" = "true" ]; then
|
|
/tmp/xzdec "$1" | tar -x -C /tmp -f - "$2"
|
|
else
|
|
tar -xJf "$1" -C /tmp "$2";
|
|
fi
|
|
bkup_list=$'\n'"$(find "/tmp/$2/" -type f | cut -d/ -f5-)${bkup_list}";
|
|
cp -rf /tmp/$2/. /system/;
|
|
rm -rf /tmp/$2;
|
|
}
|
|
|
|
get_appsize() {
|
|
app_name="$(basename "$1")";
|
|
which_dpi "$app_name";
|
|
app_density="$(basename "$dpiapkpath")";
|
|
appsize="$(cat /tmp/app_sizes.txt | grep -E "$app_name.*($app_density|common)" | awk 'BEGIN { app_size=0; } { folder_size=$3; app_size=app_size+folder_size; } END { printf app_size; }')";
|
|
}
|
|
|
|
log() {
|
|
printf "%30s | %s\n" "$1" "$2" >> $g_log;
|
|
}
|
|
|
|
log_add() {
|
|
printf "%7s | %26s | + %7d | %7d\n" "$1" "$2" "$3" "$4">> $calc_log;
|
|
}
|
|
|
|
log_sub() {
|
|
printf "%7s | %26s | - %7d | %7d\n" "$1" "$2" "$3" "$4">> $calc_log;
|
|
}
|
|
|
|
obsolete_gapps_list() {
|
|
cat <<EOF
|
|
$remove_list
|
|
EOF
|
|
}
|
|
|
|
quit() {
|
|
set_progress 0.94;
|
|
install_note=$(echo "${install_note}" | sort -r | sed '/^$/d'); # sort Installation Notes & remove empty lines
|
|
echo ----------------------------------------------------------------------------- >> $g_log;
|
|
echo -e "$log_close" >> $g_log;
|
|
|
|
# Add Installation Notes to log to help user better understand conflicts/errors
|
|
for note in $install_note; do
|
|
eval "error_msg=\$${note}";
|
|
echo -e "$error_msg" >> $g_log;
|
|
done;
|
|
|
|
# Add User App Removals NotFound Log if it exists
|
|
if [ -r $user_remove_notfound_log ]; then
|
|
echo -e "$user_notfound_msg" >> $g_log;
|
|
echo "# Begin User App Removals NOT Found (from gapps-config)" >> $g_log;
|
|
cat $user_remove_notfound_log >> $g_log;
|
|
rm -f $user_remove_notfound_log;
|
|
echo -e "# End User App Removals NOT Found (from gapps-config)\n" >> $g_log;
|
|
fi;
|
|
# Add User App Removals MultipleFound Log if it exists
|
|
if [ -r $user_remove_multiplefound_log ]; then
|
|
echo -e "$user_multiplefound_msg" >> $g_log;
|
|
echo "# Begin User App Removals MULTIPLE Found (from gapps-config)" >> $g_log;
|
|
cat $user_remove_multiplefound_log >> $g_log;
|
|
rm -f $user_remove_multiplefound_log;
|
|
echo -e "# End User App Removals MULTIPLE Found (from gapps-config)\n" >> $g_log;
|
|
fi;
|
|
|
|
# Add Duplicate Files Log if it exists
|
|
if [ -r $conflicts_log ]; then
|
|
echo -e "$del_conflict_msg" >> $g_log;
|
|
echo "# Begin GApps <> ROM Duplicate File List" >> $g_log;
|
|
cat $conflicts_log >> $g_log;
|
|
rm -f $conflicts_log;
|
|
echo -e "# End GApps <> ROM Duplicate File List\n" >> $g_log;
|
|
fi;
|
|
|
|
# Add Installation Calculations to the log if they were performed
|
|
if [ -r $calc_log ]; then
|
|
echo "# Begin GApps Size Calculations" >> $g_log;
|
|
cat $calc_log >> $g_log;
|
|
rm -f $calc_log;
|
|
echo -e "\n# End GApps Size Calculations" >> $g_log;
|
|
fi;
|
|
|
|
# Add list of Raw User Application Removals back to end of processed gapps-config for display in gapps log
|
|
if [ -n "$user_remove_list" ]; then
|
|
for user_remove_app_raw in $user_remove_list; do
|
|
echo "(${user_remove_app_raw})" >> "$g_conf";
|
|
done;
|
|
fi;
|
|
|
|
set_progress 0.96;
|
|
# Add gapps-config information to the log
|
|
echo -e "\n# Begin User's gapps-config" >> $g_log;
|
|
if [ "$g_conf" ]; then
|
|
cat "$g_conf" >> $g_log;
|
|
else
|
|
echo -n " *** NOT USED ***" >> $g_log;
|
|
fi;
|
|
echo -e "\n# End User's gapps-config" >> $g_log;
|
|
|
|
# Copy logs to proper folder (Same as gapps-config or same as Zip)
|
|
ui_print "- Copying Log to $log_folder";
|
|
ui_print " ";
|
|
cp -f $g_log "$log_folder/open_gapps_log.txt";
|
|
rm -f $g_log;
|
|
set_progress 0.97;
|
|
}
|
|
|
|
set_perm() {
|
|
chown "$1.$2" "$4";
|
|
chown "$1:$2" "$4";
|
|
chmod "$3" "$4";
|
|
}
|
|
|
|
set_perm_recursive() {
|
|
dirs=$(echo "$@" | awk '{ print substr($0, index($0,$5)) }');
|
|
for i in $dirs; do
|
|
chown -R "$1.$2" "$i"; chown -R "$1:$2" "$i";
|
|
find "$i" -type d -exec chmod "$3" {} +;
|
|
find "$i" -type f -exec chmod "$4" {} +;
|
|
done;
|
|
}
|
|
|
|
set_progress() { echo "set_progress $1" > "$OUTFD"; }
|
|
|
|
sys_app() {
|
|
if ( grep -q "codePath=\"/system/app/$1" /data/system/packages.xml ); then
|
|
return 0;
|
|
fi;
|
|
return 1;
|
|
}
|
|
|
|
ui_print() {
|
|
echo "ui_print $1" > "$OUTFD";
|
|
echo "ui_print" > "$OUTFD";
|
|
}
|
|
|
|
which_dpi() {
|
|
# Calculate available densities
|
|
app_densities="";
|
|
app_densities="$(cat /tmp/app_densities.txt | grep -E "$1/([0-9-]+|nodpi)/" | sed -r 's#.*/([0-9-]+|nodpi)/.*#\1#' | sort)";
|
|
# Check if in the package there is a version for our density, or a universal one.
|
|
for densities in $app_densities; do
|
|
case "$densities" in
|
|
*"$density"*) dpiapkpath="$1/$densities"; break;;
|
|
*nodpi*) dpiapkpath="$1/nodpi"; break;;
|
|
*) dpiapkpath="unknown";;
|
|
esac;
|
|
done;
|
|
# Check if density is unknown or set to nopdi and there is not a universal package and select the package with higher density.
|
|
if { [ "$density" = "unknown" ] || [ "$density" = "nopdi" ]; } && [ "$dpiapkpath" = "unknown" ] && [ -n "$app_densities" ]; then
|
|
app_densities="$(echo "$app_densities" | sort -r)"
|
|
for densities in $app_densities; do
|
|
dpiapkpath="$1/$densities";
|
|
break;
|
|
done;
|
|
fi;
|
|
# If there is no package for our density nor a universal one, we will look for the one with closer, but higher density.
|
|
if [ "$dpiapkpath" = "unknown" ] && [ -n "$app_densities" ]; then
|
|
app_densities="$(echo "$app_densities" | sort)"
|
|
for densities in $app_densities; do
|
|
all_densities="$(echo "$densities" | sed 's/-/ /g' | tr ' ' '\n' | sort | tr '\n' ' ')";
|
|
for d in $all_densities; do
|
|
if [ "$d" -ge "$density" ]; then
|
|
dpiapkpath="$1/$densities";
|
|
break 2;
|
|
fi;
|
|
done;
|
|
done;
|
|
fi;
|
|
# If there is no package for our density nor a universal one or one for higher density, we will use the one with closer, but lower density.
|
|
if [ "$dpiapkpath" = "unknown" ] && [ -n "$app_densities" ]; then
|
|
app_densities="$(echo "$app_densities" | sort -r)"
|
|
for densities in $app_densities; do
|
|
all_densities="$(echo "$densities" | sed 's/-/ /g' | tr ' ' '\n' | sort -r | tr '\n' ' ')";
|
|
for d in $all_densities; do
|
|
if [ "$d" -le "$density" ]; then
|
|
dpiapkpath="$1/$densities";
|
|
break 2;
|
|
fi;
|
|
done;
|
|
done;
|
|
fi;
|
|
}
|
|
# _____________________________________________________________________________________________________________________
|
|
# Gather Pre-Install Info
|
|
# Get GApps Version and GApps Type from g.prop extracted at top of script
|
|
gapps_version=$(file_getprop /tmp/g.prop ro.addon.open_version);
|
|
gapps_type=$(file_getprop /tmp/g.prop ro.addon.open_type);
|
|
# _____________________________________________________________________________________________________________________
|
|
# Begin GApps Installation
|
|
ui_print " ";
|
|
ui_print '##############################';
|
|
ui_print ' _____ _____ ___ ____ ';
|
|
ui_print ' / _ \ | __ \ / _ \ | _ \ ';
|
|
ui_print '| / \ || |__) | |_| || | \ \';
|
|
ui_print '| | | || ___/| __/ | | | |';
|
|
ui_print '| \ / || | \ |__ | | | |';
|
|
ui_print ' \_/ \_/ |_| \___| |_| |_|';
|
|
ui_print ' ___ _ ___ ___ ___ ';
|
|
ui_print ' / __| /_\ | _ \ _ \/ __|';
|
|
ui_print ' | (_ |/ _ \| _/ _/\__ \';
|
|
ui_print ' \___/_/ \_\_| |_| |___/';
|
|
ui_print '##############################';
|
|
ui_print " ";
|
|
ui_print "$installer_name$gapps_version";
|
|
ui_print " ";
|
|
ui_print "- Mounting /system, /cache, /data, /persist";
|
|
ui_print " ";
|
|
set_progress 0.01;
|
|
mount /system;
|
|
mount /cache;
|
|
mount /data;
|
|
mount /persist;
|
|
mount -o rw,remount /system;
|
|
mount -o rw,remount /system /system;
|
|
mount -o rw,remount /;
|
|
mount -o rw,remount / /;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Gather Device & GApps Package Information
|
|
if [ -e "/system/build.prop" ]; then
|
|
b_prop=/system/build.prop;
|
|
elif [ -e "/system/default.prop" ]; then
|
|
b_prop=/system/default.prop;
|
|
else
|
|
ui_print "*** No build.prop ***";
|
|
ui_print " ";
|
|
ui_print "Your ROM has no build.prop or default.prop";
|
|
ui_print " ";
|
|
ui_print "******* GApps Installation failed *******";
|
|
ui_print " ";
|
|
install_note="${install_note}nobuildprop"$'\n'; # make note that there is no build.prop
|
|
abort "$E_NOBUILDPROP";
|
|
fi
|
|
# Check if build.prop is not compressed and thus unprocessable
|
|
if [ "$(head -c4 "$b_prop")" = "zzzz" ]; then
|
|
ui_print "*** Recovery does not support transparent compression ***";
|
|
ui_print " ";
|
|
ui_print "Your ROM uses transparent compression, but your recovery";
|
|
ui_print "does not support this feature, resulting in corrupt files.";
|
|
ui_print " ";
|
|
ui_print "BEFORE INSTALLING ANYTHING ANYMORE YOU SHOULD UPDATE YOUR";
|
|
ui_print "RECOVERY AS SOON AS POSSIBLE, TO PREVENT FILE CORRUPTION.";
|
|
ui_print " ";
|
|
ui_print "******* GApps Installation failed *******";
|
|
ui_print " ";
|
|
install_note="${install_note}recovery_compression_msg"$'\n'; # make note that recovery does not support transparent compression
|
|
abort "$E_RECCOMPR";
|
|
fi
|
|
|
|
# Get device name any which way we can
|
|
for field in ro.product.device ro.build.product ro.product.name; do
|
|
for file in $b_prop /default.prop; do
|
|
device_name=$(file_getprop $file $field);
|
|
if [ ${#device_name} -ge 2 ]; then
|
|
break 2;
|
|
fi;
|
|
done;
|
|
device_name="Bad ROM/Recovery";
|
|
done;
|
|
|
|
# Locate gapps-config (if used)
|
|
for i in "/tmp/aroma/.gapps-config"\
|
|
"$zip_folder/.gapps-config-$device_name"\
|
|
"$zip_folder/gapps-config-$device_name.txt"\
|
|
"/sdcard/Open-GApps/.gapps-config-$device_name"\
|
|
"/sdcard/Open-GApps/gapps-config-$device_name.txt"\
|
|
"$zip_folder/.gapps-config"\
|
|
"$zip_folder/gapps-config.txt"\
|
|
"/sdcard/Open-GApps/.gapps-config"\
|
|
"/sdcard/Open-GApps/gapps-config.txt"\
|
|
"$zip_folder/.gapps-config-$device_name.txt"\
|
|
"/sdcard/Open-GApps/.gapps-config-$device_name.txt"\
|
|
"$zip_folder/.gapps-config.txt"\
|
|
"/sdcard/Open-GApps/.gapps-config.txt"\
|
|
"/persist/.gapps-config-$device_name"\
|
|
"/persist/gapps-config-$device_name.txt"\
|
|
"/persist/.gapps-config"\
|
|
"/persist/gapps-config.txt"\
|
|
"/persist/.gapps-config-$device_name.txt"\
|
|
"/persist/.gapps-config.txt"; do
|
|
if [ -r "$i" ]; then
|
|
g_conf="$i";
|
|
break;
|
|
fi;
|
|
done;
|
|
|
|
# We log in the same diretory as the gapps-config file, unless it is aroma
|
|
if [ -n "$g_conf" ] && [ "$g_conf" != "/tmp/aroma/.gapps-config" ]; then
|
|
log_folder="$(dirname "$g_conf")";
|
|
else
|
|
log_folder="$zip_folder";
|
|
fi
|
|
|
|
if [ "$g_conf" ]; then
|
|
config_file="$g_conf";
|
|
g_conf_orig="$g_conf";
|
|
# Create processed gapps-config with user comments stripped and user app removals removed and stored in variable for processing later
|
|
g_conf="/tmp/proc_gconf";
|
|
sed -e 's|#.*||g' -e 's/\r//g' -e '/^$/d' "$g_conf_orig" > "$g_conf"; # Strip user comments from gapps-config
|
|
user_remove_list=$(awk -F "[()]" '{ for (i=2; i<NF; i+=2) print $i }' "$g_conf"); # Get users list of apk's to remove from gapps-config
|
|
sed -i s/'([^)]*)'/''/g "$g_conf"; # Remove all instances of user app removals (stuff between parentheses)
|
|
sed -i '/^$/d' "$g_conf"; # Remove all empty lines for cleaner appearance
|
|
else
|
|
config_file="Not Used";
|
|
g_conf="/tmp/proc_gconf";
|
|
touch "$g_conf";
|
|
fi;
|
|
|
|
# Unless this is a NoDebug install - create folder and take 'Before' snapshots
|
|
if ( ! grep -qi "nodebug" "$g_conf" ); then
|
|
mkdir /tmp/logs;
|
|
ls -alZR /system > /tmp/logs/System_Files_Before.txt;
|
|
df -k > /tmp/logs/Device_Space_Before.txt;
|
|
fi;
|
|
|
|
# Get ROM android version from build.prop
|
|
ui_print "- Gathering device & ROM information";
|
|
ui_print " ";
|
|
rom_android_version=$(file_getprop $b_prop ro.build.version.release);
|
|
|
|
# Get Device Type (phone or tablet) from build.prop
|
|
if echo "$(file_getprop $b_prop ro.build.characteristics)" | grep -qi "tablet"; then
|
|
device_type=tablet;
|
|
elif echo "$(file_getprop $b_prop ro.build.characteristics)" | grep -qi "tv"; then
|
|
device_type=tv;
|
|
else
|
|
device_type=phone;
|
|
fi;
|
|
|
|
# Get Rom Version from build.prop
|
|
for field in ro.modversion ro.build.version.incremental; do
|
|
rom_version="$(file_getprop $b_prop $field)";
|
|
if [ ${#rom_version} -ge 2 ]; then
|
|
break;
|
|
fi;
|
|
rom_version="non-standard build.prop";
|
|
done;
|
|
|
|
echo "# Begin Open GApps Install Log" > $g_log;
|
|
echo ----------------------------------------------------------------------------- >> $g_log;
|
|
log "ROM Android Version" "$rom_android_version";
|
|
|
|
# Check to make certain user has proper version ROM Installed
|
|
if [ ! "${rom_android_version:0:3}" = "$req_android_version" ]; then
|
|
ui_print "*** Incompatible Android ROM detected ***";
|
|
ui_print " ";
|
|
ui_print "This GApps pkg is for Android $req_android_version.x ONLY";
|
|
ui_print " ";
|
|
ui_print "******* GApps Installation failed *******";
|
|
ui_print " ";
|
|
install_note="${install_note}rom_version_msg"$'\n'; # make note that ROM Version is not compatible with these GApps
|
|
abort "$E_ROMVER";
|
|
fi;
|
|
|
|
# Check to make certain that user device matches the architecture
|
|
device_architecture="$(file_getprop $b_prop "ro.product.cpu.abilist=")"
|
|
# If the recommended field is empty, fall back to the deprecated one
|
|
if [ -z "$device_architecture" ]; then
|
|
device_architecture="$(file_getprop $b_prop "ro.product.cpu.abi=")"
|
|
fi
|
|
EOFILE
|
|
printf 'if ! (echo "$device_architecture" | '>> "$build/META-INF/com/google/android/update-binary"
|
|
case "$ARCH" in
|
|
arm) printf 'grep -i "armeabi" | grep -qiv "arm64"'>> "$build/META-INF/com/google/android/update-binary";;
|
|
arm64) printf 'grep -qi "arm64"'>> "$build/META-INF/com/google/android/update-binary";;
|
|
x86) printf 'grep -i "x86" | grep -qiv "x86_64"'>> "$build/META-INF/com/google/android/update-binary";;
|
|
x86_64) printf 'grep -qi "x86_64"'>> "$build/META-INF/com/google/android/update-binary";;
|
|
esac
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
); then
|
|
ui_print "***** Incompatible Device Detected *****";
|
|
ui_print " ";
|
|
ui_print "This Open GApps package cannot be";
|
|
ui_print "installed on this device's architecture.";
|
|
ui_print "Please download the correct version for";
|
|
ui_print "your device: $device_architecture";
|
|
ui_print " ";
|
|
ui_print "******* GApps Installation failed *******";
|
|
ui_print " ";
|
|
install_note="${install_note}arch_compat_msg"$'\n'; # make note that Open GApps are not compatible with architecture
|
|
abort "$E_ARCH";
|
|
fi;
|
|
|
|
# Determine Recovery Type and Version
|
|
for rec_log in $rec_tmp_log $rec_cache_log; do
|
|
recovery=$(busybox grep -m 2 -E " Recovery v|Starting TWRP|Welcome to|PhilZ" $rec_log);
|
|
case "$recovery" in
|
|
*Welcome*) recovery="$(grep -m 1 "Welcome to" $rec_log | awk '{ print substr($0, index($0,$3)) }')$(grep -m 1 "^ext.version" $rec_log | cut -d\" -f2)"; break;;
|
|
*Recovery*) recovery=$(grep -m 1 "Recovery v" $rec_log); recovery=${recovery/Recovery v/Recovery }; break;;
|
|
*PhilZ*) recovery=$(grep -m 2 -E "PhilZ|ClockworkMod" $rec_log); recovery="${recovery/ClockworkMod v/(ClockworkMod })"; break;;
|
|
Starting*) recovery=$(echo "$recovery" | awk -F"Starting " '{ print $2 }' | awk -F" on " '{ print $1 }'); break;;
|
|
esac;
|
|
done;
|
|
|
|
# Check for the presence of the tar binary
|
|
if [ -z "$(command -v tar)" ]; then
|
|
ui_print "Your recovery is missing the tar";
|
|
ui_print "binary. Please update your recovery";
|
|
ui_print "to the latest version or switch to";
|
|
ui_print "another recovery like TWRP.";
|
|
ui_print "See:'$log_folder/open_gapps_log.txt'";
|
|
ui_print "for complete details and information.";
|
|
ui_print " ";
|
|
install_note="${install_note}no_tar_message"$'\n'; # make note that there is no TAR support
|
|
abort "$E_TAR";
|
|
fi;
|
|
|
|
# Check for the presence of the xz binary and tar parameter
|
|
if [ -z "$(command -v xz)" ] || [ -z "$(tar --help 2>&1 | grep -e "J.*xz")" ]; then
|
|
EOFILE
|
|
case "$EXTRACTFILES" in
|
|
*xzdec*) echo ' bundled_xz=true'>> "$build/META-INF/com/google/android/update-binary";; #xz-decompression binary bundled
|
|
*) echo ' ui_print "Your recovery is missing the xz";
|
|
ui_print "binary. Please update your recovery";
|
|
ui_print "to the latest version or switch to";
|
|
ui_print "another recovery like TWRP.";
|
|
ui_print "See:'"'"'$log_folder/open_gapps_log.txt'"'"'";
|
|
ui_print "for complete details and information.";
|
|
ui_print " ";
|
|
install_note="${install_note}no_xz_message"$'"'\n'"'; # make note that there is no XZ support
|
|
abort "$E_XZ";'>> "$build/META-INF/com/google/android/update-binary";;
|
|
esac
|
|
echo 'else'>> "$build/META-INF/com/google/android/update-binary"
|
|
if [ "$VARIANT" = "aroma" ]; then
|
|
echo ' bundled_xz=true #aroma needs bundled xz'>> "$build/META-INF/com/google/android/update-binary" #aroma always needs to use bundled xz, otherwise it crashes
|
|
else
|
|
echo ' bundled_xz=false'>> "$build/META-INF/com/google/android/update-binary"
|
|
fi
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
fi;
|
|
# Check for the -f - tar support
|
|
if [ -z "$(tar --help 2>&1 | grep -e "f.*stdin")" ]; then
|
|
ui_print "Your recovery does not support stdin";
|
|
ui_print "for the tar binary. Please update your";
|
|
ui_print "recovery to the latest version or";
|
|
ui_print "switch to another recovery like TWRP.";
|
|
ui_print "See:'"'"'$log_folder/open_gapps_log.txt'"'"'";
|
|
ui_print "for complete details and information.";
|
|
ui_print " ";
|
|
install_note="${install_note}no_stdin_message"$'"'\n'"'; # make note that there is no stdin tar support
|
|
abort "$E_STDIN";
|
|
fi;
|
|
|
|
# Get display density using getprop from Recovery
|
|
density=$(getprop ro.sf.lcd_density);
|
|
|
|
# If the density returned by getprop is empty or non-standard - read from default.prop instead
|
|
case $density in
|
|
120|160|213|240|280|320|400|480|560|640) ;;
|
|
*) density=$(file_getprop /default.prop ro.sf.lcd_density);;
|
|
esac;
|
|
|
|
# If the density from default.prop is still empty or non-standard - read from build.prop instead
|
|
case $density in
|
|
120|160|213|240|280|320|400|480|560|640) ;;
|
|
*) density=$(file_getprop $b_prop ro.sf.lcd_density);;
|
|
esac;
|
|
|
|
# Check for DPI Override in gapps-config
|
|
if ( grep -qiE "forcedpi(120|160|213|240|280|320|400|480|560|640|nodpi)" "$g_conf" ); then # user wants to override the DPI selection
|
|
density=$( grep -iEo "forcedpi(120|160|213|240|280|320|400|480|560|640|nodpi)" "$g_conf" | tr '[:upper:]' '[:lower:]' );
|
|
density=${density#forcedpi};
|
|
fi;
|
|
|
|
# Check for Clean Override in gapps-config
|
|
if ( grep -qiE "^forceclean$" "$g_conf" ); then # true or false to override the default selection
|
|
forceclean="true"
|
|
else
|
|
forceclean="false"
|
|
fi;
|
|
|
|
# Set density to unknown if it's still empty
|
|
test -z "$density" && density=unknown;
|
|
|
|
# Remove any files from gapps-remove.txt that should not be processed for automatic removal
|
|
for bypass_file in $removal_bypass_list; do
|
|
sed -i "\:${bypass_file}:d" $gapps_removal_list;
|
|
done;
|
|
|
|
# Is this a 'Clean' or 'Dirty' install
|
|
if ( clean_inst ); then
|
|
install_type="Clean[Data Wiped]";
|
|
cameragoogle_inst=Clean;
|
|
else
|
|
install_type="Dirty[Data NOT Wiped]";
|
|
|
|
# Was Google Camera previously installed (in /system)
|
|
if ( sys_app GoogleCamera ); then
|
|
cameragoogle_inst=true;
|
|
else
|
|
cameragoogle_inst=false;
|
|
fi;
|
|
|
|
fi;
|
|
|
|
# Is device FaceUnlock compatible
|
|
if ( ! grep -qE "Victory|herring|sun4i" /proc/cpuinfo ); then
|
|
for xml in /system/etc/permissions/android.hardware.camera.front.xml /system/etc/permissions/android.hardware.camera.xml; do
|
|
if ( grep -q "feature name=\"android.hardware.camera.front" $xml ); then
|
|
faceunlock_compat=true;
|
|
break;
|
|
fi;
|
|
faceunlock_compat=false;
|
|
done;
|
|
else
|
|
faceunlock_compat=false;
|
|
fi;
|
|
|
|
# Check device name for devices that are incompatible with Google Camera
|
|
case $device_name in
|
|
EOFILE
|
|
cameracompatibilityhack #in kitkat we don't have google camera compatibility with some phones
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
*) cameragoogle_compat=true;;
|
|
esac;
|
|
|
|
log "ROM ID" "$(file_getprop $b_prop ro.build.display.id)";
|
|
log "ROM Version" "$rom_version";
|
|
log "Device Recovery" "$recovery";
|
|
log "Using Bundled XZdec" "$bundled_xz"
|
|
log "Device Name" "$device_name";
|
|
log "Device Model" "$(file_getprop $b_prop ro.product.model)";
|
|
log "Device Type" "$device_type";
|
|
log "Device CPU" "$device_architecture";
|
|
log "getprop Density" "$(getprop ro.sf.lcd_density)";
|
|
log "default.prop Density" "$(file_getprop /default.prop ro.sf.lcd_density)";
|
|
log "build.prop Density" "$(file_getprop $b_prop ro.sf.lcd_density)";
|
|
log "Display Density Used" "${density}dpi";
|
|
log "Install Type" "$install_type";
|
|
log "Google Camera Installed¹" "$cameragoogle_inst";
|
|
log "FaceUnlock Compatible" "$faceunlock_compat";
|
|
log "Google Camera Compatible" "$cameragoogle_compat";
|
|
log_close=" ¹ Previously installed with Open GApps\n$log_close";
|
|
|
|
# Determine if a GApps package is installed and
|
|
# the version, type, and whether it's a Open GApps package
|
|
if [ -e /system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk -a -e /system/priv-app/GoogleLoginService/GoogleLoginService.apk ]; then
|
|
if $(grep -q -e ro.addon.open_version $g_prop); then
|
|
log "Current GApps Version" "$(file_getprop $g_prop ro.addon.open_version)";
|
|
if $(grep -q ro.addon.open_type $g_prop); then
|
|
log "Current Open GApps Package" "$(file_getprop $g_prop ro.addon.open_type)";
|
|
else
|
|
log "Current Open GApps Package" "Unknown";
|
|
fi;
|
|
elif [ -e /system/etc/g.prop ]; then
|
|
log "Current GApps Version" "NON Open GApps Package Currently Installed (FAILURE)";
|
|
ui_print "* Incompatible GApps Currently Installed *";
|
|
ui_print " ";
|
|
ui_print "This Open GApps package can ONLY be installed";
|
|
ui_print "on top of an existing installation of Open GApps";
|
|
ui_print "or a clean AOSP/CyanogenMod ROM installation,";
|
|
ui_print "or a Stock ROM that conforms to Nexus standards.";
|
|
ui_print "You must wipe (format) your system partition";
|
|
ui_print "and flash your ROM BEFORE installing Open GApps.";
|
|
ui_print " ";
|
|
ui_print "******* GApps Installation failed *******";
|
|
ui_print " ";
|
|
install_note="${install_note}non_open_gapps_msg"$'\n'; # make note that currently installed GApps are non-Open
|
|
abort "$E_NONOPEN";
|
|
else
|
|
log "Current GApps Version" "Stock ROM GApps Currently Installed (NOTICE)";
|
|
ui_print "* Stock ROM GApps Currently Installed *";
|
|
ui_print " ";
|
|
ui_print "The installer detected that Stock ROM GApps are";
|
|
ui_print "already installed. If you are flashing over a";
|
|
ui_print "Nexus-compatible ROM there is no problem, but if";
|
|
ui_print "you are flashing over a custom ROM, you may want";
|
|
ui_print "to contact the developer to request the removal of";
|
|
ui_print "the included GApps. The installation will now";
|
|
ui_print "continue, but please be aware that any problems";
|
|
ui_print "that may occur depend on your ROM.";
|
|
ui_print " ";
|
|
install_note="${install_note}fornexus_open_gapps_msg"$'\n'; # make note that currently installed GApps are Stock ROM
|
|
fi;
|
|
else
|
|
# User does NOT have a GApps package installed on their device
|
|
log "Current GApps Version" "No GApps Installed";
|
|
|
|
# Use the opportunity of No GApps installed to check for potential ROM conflicts when deleting existing GApps files
|
|
while read gapps_file; do
|
|
if [ -e "$gapps_file" ] && [ "$gapps_file" != "/system/lib/$WebView_lib_filename" ] && [ "$gapps_file" != "/system/lib64/$WebView_lib_filename" ]; then
|
|
echo "$gapps_file" >> $conflicts_log;
|
|
fi;
|
|
done < $gapps_removal_list;
|
|
fi;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Prepare the list of GApps being installed and AOSP/Stock apps being removed
|
|
# Build list of available GApps that can be installed (and check for a user package preset)
|
|
for pkg in $pkg_names; do
|
|
eval "addto=\$${pkg}_gapps_list"; # Look for method to combine this with line below
|
|
all_gapps_list=${all_gapps_list}${addto}; # Look for method to combine this with line above
|
|
if ( grep -qi "${pkg}gapps" "$g_conf" ); then # user has selected a 'preset' install
|
|
gapps_type=$pkg;
|
|
sed -i "/ro.addon.open_type/c\ro.addon.open_type=$pkg" /tmp/g.prop; # modify g.prop to new package type
|
|
break;
|
|
fi;
|
|
done;
|
|
|
|
# Prepare list of User specified GApps that will be installed
|
|
if [ "$g_conf" ]; then
|
|
if ( grep -qi "include" "$g_conf" ); then # User is indicating the apps they WANT installed
|
|
config_type=include;
|
|
for gapp_name in $all_gapps_list; do
|
|
if ( grep -qi "$gapp_name" "$g_conf" ); then
|
|
gapps_list="$gapps_list$gapp_name"$'\n';
|
|
fi;
|
|
done;
|
|
else # User is indicating the apps they DO NOT WANT installed
|
|
config_type=exclude;
|
|
for gapp_name in $all_gapps_list; do
|
|
if ( ! grep -qi "$gapp_name" "$g_conf" ); then
|
|
gapps_list="$gapps_list$gapp_name"$'\n';
|
|
fi;
|
|
done;
|
|
fi;
|
|
else # User is not using a gapps-config and we're doing the 'full monty'
|
|
config_type="[Default]";
|
|
gapps_list=$all_gapps_list;
|
|
fi;
|
|
|
|
# Configure default removal of Stock/AOSP apps - if we're installing Stock GApps
|
|
if [ "$gapps_type" = "super" ] || [ "$gapps_type" = "stock" ] || [ "$gapps_type" = "aroma" ]; then
|
|
for default_name in $default_aosp_remove_list; do
|
|
eval "remove_${default_name}=true[default]";
|
|
done;
|
|
else
|
|
# Do not perform any default removals - but make them optional
|
|
for default_name in $default_aosp_remove_list; do
|
|
eval "remove_${default_name}=false[default]";
|
|
done;
|
|
fi;
|
|
|
|
# Prepare list of AOSP/ROM files that will be deleted using gapps-config
|
|
# We will look for +Browser, +Email, +Gallery, +Launcher, +MMS, +PicoTTS and more to prevent their removal
|
|
set_progress 0.03;
|
|
if [ "$g_conf" ]; then
|
|
for default_name in $default_aosp_remove_list; do
|
|
if ( grep -qi "+$default_name" "$g_conf" ); then
|
|
eval "remove_${default_name}=false[gapps-config]";
|
|
elif [ "$gapps_type" = "super" ] || [ "$gapps_type" = "stock" ] || [ "$gapps_type" = "aroma" ]; then
|
|
aosp_remove_list="$aosp_remove_list$default_name"$'\n';
|
|
if ( grep -qi "$default_name" "$g_conf" ); then
|
|
eval "remove_${default_name}=true[gapps-config]";
|
|
fi;
|
|
else
|
|
if ( grep -qi "$default_name" "$g_conf" ); then
|
|
eval "remove_${default_name}=true[gapps-config]";
|
|
aosp_remove_list="$aosp_remove_list$default_name"$'\n';
|
|
fi;
|
|
fi;
|
|
done;
|
|
# Check gapps-config for other optional AOSP/ROM files that will be deleted
|
|
for opt_name in $optional_aosp_remove_list; do
|
|
if ( grep -qi "$opt_name" "$g_conf" ); then
|
|
aosp_remove_list="$aosp_remove_list$opt_name"$'\n';
|
|
fi;
|
|
done;
|
|
else
|
|
if [ "$gapps_type" = "super" ] || [ "$gapps_type" = "stock" ] || [ "$gapps_type" = "aroma" ]; then
|
|
aosp_remove_list=$default_aosp_remove_list;
|
|
fi;
|
|
fi;
|
|
|
|
# Verify device is FaceUnlock compatible BEFORE we allow it in $gapps_list
|
|
if ( contains "$gapps_list" "faceunlock" ) && [ $faceunlock_compat = "false" ]; then
|
|
gapps_list=${gapps_list/faceunlock};
|
|
install_note="${install_note}faceunlock_msg"$'\n'; # make note that FaceUnlock will NOT be installed as user requested
|
|
fi;
|
|
|
|
# If we're NOT installing chrome make certain 'browser' is NOT in $aosp_remove_list UNLESS 'browser' is in $g_conf
|
|
if ( ! contains "$gapps_list" "chrome" ) && ( ! grep -qi "browser" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/browser};
|
|
remove_browser="false[NO_Chrome]";
|
|
fi;
|
|
|
|
# If we're NOT installing gmail make certain 'email' is NOT in $aosp_remove_list UNLESS 'email' is in $g_conf
|
|
if ( ! contains "$gapps_list" "gmail" ) && ( ! grep -qi "email" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/email};
|
|
remove_email="false[NO_Gmail]";
|
|
fi;
|
|
|
|
# If we're NOT installing photos make certain 'gallery' is NOT in $aosp_remove_list UNLESS 'gallery' is in $g_conf
|
|
if ( ! contains "$gapps_list" "photos" ) && ( ! grep -qi "gallery" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/gallery};
|
|
remove_gallery="false[NO_Photos]";
|
|
fi;
|
|
|
|
# If $device_type is 'tablet' make certain we're not installing messenger
|
|
if ( contains "$gapps_list" "messenger" ) && [ $device_type = "tablet" ]; then
|
|
gapps_list=${gapps_list/messenger}; # we'll prevent messenger from being installed since this isn't a phone
|
|
fi;
|
|
|
|
# If we're NOT installing hangouts or messenger make certain 'mms' is NOT in $aosp_remove_list UNLESS 'mms' is in $g_conf
|
|
if ( ! contains "$gapps_list" "hangouts" ) && ( ! contains "$gapps_list" "messenger" ) && ( ! grep -qi "mms" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/mms};
|
|
remove_mms="false[NO_Hangouts]";
|
|
fi;
|
|
|
|
# If we're NOT installing hangouts or messenger and mms is in $aosp_remove_list then user must override removal protection
|
|
if ( ! contains "$gapps_list" "hangouts" ) && ( ! contains "$gapps_list" "messenger" ) && ( contains "$aosp_remove_list" "mms" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/mms}; # we'll prevent mms from being removed so user isn't left with no way to receive text messages
|
|
remove_mms="false[NO_Override]";
|
|
install_note="${install_note}nomms_msg"$'\n'; # make note that MMS can't be removed unless user Overrides
|
|
fi;
|
|
|
|
# If we're NOT installing googletts make certain 'picotts' is NOT in $aosp_remove_list UNLESS 'picotts' is in $g_conf
|
|
if ( ! contains "$gapps_list" "googletts" ) && ( ! grep -qi "picotts" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/picotts};
|
|
remove_picotts="false[NO_GoogleTTS]";
|
|
fi;
|
|
|
|
# If we're NOT installing search then we MUST REMOVE googlenow from $gapps_list (if it's currently there)
|
|
if ( ! contains "$gapps_list" "search" ) && ( contains "$gapps_list" "googlenow" ); then
|
|
gapps_list=${gapps_list/googlenow};
|
|
install_note="${install_note}googlenow_msg"$'\n'; # make note that Google Now Launcher will NOT be installed as user requested
|
|
fi;
|
|
|
|
# If we're NOT installing googlenow make certain 'launcher' is NOT in $aosp_remove_list UNLESS 'launcher' is in $g_conf
|
|
if ( ! contains "$gapps_list" "googlenow" ) && ( ! grep -qi "launcher" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/launcher};
|
|
remove_launcher="false[NO_GoogleNow]";
|
|
fi;
|
|
|
|
# If we're NOT installing googlenow and launcher is in $aosp_remove_list then user must override removal protection
|
|
if ( ! contains "$gapps_list" "googlenow" ) && ( contains "$aosp_remove_list" "launcher" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/launcher}; # we'll prevent launcher from being removed so user isn't left with no Launcher
|
|
remove_launcher="false[NO_Override]";
|
|
install_note="${install_note}nolauncher_msg"$'\n'; # make note that Launcher can't be removed unless user Overrides
|
|
fi;
|
|
|
|
# If we're installing calendargoogle we must ADD calendarstock to $aosp_remove_list (if it's not already there) and NOT install calsync
|
|
if ( contains "$gapps_list" "calendargoogle" ) && ( ! contains "$aosp_remove_list" "calendarstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}calendarstock"$'\n';
|
|
gapps_list=${gapps_list/calsync};
|
|
fi;
|
|
|
|
# If we're installing keyboardgoogle we must ADD keyboardstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "keyboardgoogle" ) && ( ! contains "$aosp_remove_list" "keyboardstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}keyboardstock"$'\n';
|
|
fi;
|
|
|
|
# If we're NOT installing keyboardgoogle and keyboardstock is in $aosp_remove_list then user must override removal protection
|
|
if ( ! contains "$gapps_list" "keyboardgoogle" ) && ( contains "$aosp_remove_list" "keyboardstock" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/keyboardstock}; # we'll prevent keyboardstock from being removed so user isn't left with no keyboard
|
|
install_note="${install_note}nokeyboard_msg"$'\n'; # make note that Stock Keyboard can't be removed unless user Overrides
|
|
fi;
|
|
|
|
# Verify device is Google Camera compatible BEFORE we allow it in $gapps_list
|
|
if ( contains "$gapps_list" "cameragoogle" ) && [ $cameragoogle_compat = "false" ]; then
|
|
gapps_list=${gapps_list/cameragoogle}; # we must DISALLOW cameragoogle from being installed
|
|
install_note="${install_note}camera_compat_msg"$'\n'; # make note that Google Camera will NOT be installed as user requested
|
|
fi;
|
|
|
|
# If user wants to install cameragoogle then it MUST be a Clean Install OR cameragoogle was previously installed in system partition
|
|
if ( contains "$gapps_list" "cameragoogle" ) && ( ! clean_inst ) && [ $cameragoogle_inst = "false" ]; then
|
|
gapps_list=${gapps_list/cameragoogle}; # we must DISALLOW cameragoogle from being installed
|
|
aosp_remove_list=${aosp_remove_list/camerastock}; # and we'll prevent camerastock from being removed so user isn't left with no camera
|
|
install_note="${install_note}camera_sys_msg"$'\n'; # make note that Google Camera will NOT be installed as user requested
|
|
fi;
|
|
|
|
# If we're installing cameragoogle we MUST ADD camerastock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "cameragoogle" ) && ( ! contains "$aosp_remove_list" "camerastock" ); then
|
|
aosp_remove_list="${aosp_remove_list}camerastock"$'\n';
|
|
fi;
|
|
|
|
# If we're installing clockgoogle we must ADD clockstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "clockgoogle" ) && ( ! contains "$aosp_remove_list" "clockstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}clockstock"$'\n';
|
|
remove_clockstock="true[ClockGoogle]";
|
|
fi;
|
|
|
|
# If we're installing exchangegoogle we must ADD exchangestock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "exchangegoogle" ) && ( ! contains "$aosp_remove_list" "exchangestock" ); then
|
|
aosp_remove_list="${aosp_remove_list}exchangestock"$'\n';
|
|
fi;
|
|
|
|
# If we're installing taggoogle we must ADD tagstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "taggoogle" ) && ( ! contains "$aosp_remove_list" "tagstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}tagstock"$'\n';
|
|
remove_tagstock="true[TagGoogle]";
|
|
fi;
|
|
|
|
# If we're installing webviewgoogle we MUST ADD webviewstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "webviewgoogle" ) && ( ! contains "$aosp_remove_list" "webviewstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}webviewstock"$'\n';
|
|
fi;
|
|
|
|
# If we're NOT installing webviewgoogle and webviewstock is in $aosp_remove_list then user must override removal protection
|
|
if ( ! contains "$gapps_list" "webviewgoogle" ) && ( contains "$aosp_remove_list" "webviewstock" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
aosp_remove_list=${aosp_remove_list/webviewstock}; # we'll prevent webviewstock from being removed so user isn't left with no WebView
|
|
remove_webviewstock="false[NO_WebViewGoogle]";
|
|
install_note="${install_note}nowebview_msg"$'\n'; # make note that Stock Webview can't be removed unless user Overrides
|
|
fi;
|
|
|
|
# If we're installing calculatorgoogle we MUST ADD calculatorstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "calculatorgoogle" ) && ( ! contains "$aosp_remove_list" "calculatorstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}calculatorstock"$'\n';
|
|
fi;
|
|
|
|
# If we're installing contactsgoogle we MUST ADD contactsstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "contactsgoogle" ) && ( ! contains "$aosp_remove_list" "contactsstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}contactsstock"$'\n';
|
|
fi;
|
|
|
|
# If we're installing dialergoogle we MUST ADD dialerstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$gapps_list" "dialergoogle" ) && ( ! contains "$aosp_remove_list" "dialerstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}dialerstock"$'\n';
|
|
fi;
|
|
|
|
# If we're installing packageinstallergoogle we MUST ADD packageinstallerstock to $aosp_remove_list (if it's not already there)
|
|
if ( contains "$core_gapps_list" "packageinstallergoogle" ) && ( ! contains "$aosp_remove_list" "packageinstallerstock" ); then
|
|
aosp_remove_list="${aosp_remove_list}packageinstallerstock"$'\n';
|
|
fi;
|
|
|
|
# If we're NOT installing gcs then we MUST REMOVE projectfi from $gapps_list (if it's currently there)
|
|
if ( ! contains "$gapps_list" "gcs" ) && ( contains "$gapps_list" "projectfi" ); then
|
|
gapps_list=${gapps_list/projectfi};
|
|
install_note="${install_note}projectfi_msg"$'\n'; # make note that Project Fi will NOT be installed as user requested
|
|
fi;
|
|
|
|
# Some ROMs bundle Google Apps or the user might have installed a Google replacement app during an earlier install
|
|
# Some of these apps are crucial to a functioning system and should NOT be removed if no AOSP/Stock equivalent is available
|
|
# Unless override keyword is used, make sure they are not removed
|
|
# NOTICE: Only for Google Keyboard we need to take KitKat support into account, others are only Lollipop+
|
|
ignoregooglecontacts="true"
|
|
for f in $contactsstock_list; do
|
|
if [ -e "$f" ]; then
|
|
ignoregooglecontacts="false"
|
|
break; #at least 1 aosp stock file is present
|
|
fi
|
|
done;
|
|
if [ "$ignoregooglecontacts" = "true" ]; then
|
|
if ( ! contains "$gapps_list" "contactsgoogle" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
sed -i "\:/system/priv-app/GoogleContacts:d" $gapps_removal_list;
|
|
ignoregooglecontacts="true[NoRemove]"
|
|
install_note="${install_note}nogooglecontacts_removal"$'\n'; # make note that Google Contacts will not be removed
|
|
else
|
|
ignoregooglecontacts="false[ContactsGoogle]"
|
|
fi
|
|
fi
|
|
|
|
#ignoregoogledialer="true"
|
|
#for f in $dialerstock_list; do
|
|
# if [ -e "$f" ]; then
|
|
# ignoregoogledialer="false"
|
|
# break; #at least 1 aosp stock file is present
|
|
# fi
|
|
#done;
|
|
#if [ "$ignoregoogledialer" = "true" ]; then
|
|
# if ( ! contains "$gapps_list" "dialergoogle" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
# sed -i "\:/system/priv-app/GoogleDialer:d" $gapps_removal_list;
|
|
# ignoregoogledialer="true[NoRemove]"
|
|
# install_note="${install_note}nogoogledialer_removal"$'\n'; # make note that Google Dialer will not be removed
|
|
# else
|
|
# ignoregoogledialer="false[DialerGoogle]"
|
|
# fi
|
|
#fi
|
|
|
|
ignoregooglekeyboard="true"
|
|
for f in $keyboardstock_list; do
|
|
if [ -e "$f" ]; then
|
|
ignoregooglekeyboard="false"
|
|
break; #at least 1 aosp stock file is present
|
|
fi
|
|
done;
|
|
if [ "$ignoregooglekeyboard" = "true" ]; then
|
|
if ( ! contains "$gapps_list" "keyboardgoogle" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
EOFILE
|
|
keyboardgooglenotremovehack
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
ignoregooglekeyboard="true[NoRemove]"
|
|
install_note="${install_note}nogooglekeyboard_removal"$'\n'; # make note that Google Keyboard will not be removed
|
|
else
|
|
ignoregooglekeyboard="false[KeyboardGoogle]"
|
|
fi
|
|
fi
|
|
|
|
ignoregooglepackageinstaller="true"
|
|
for f in $packageinstallerstock_list; do
|
|
if [ -e "$f" ]; then
|
|
ignoregooglepackageinstaller="false"
|
|
break; #at least 1 aosp stock file is present
|
|
fi
|
|
done;
|
|
if [ "$ignoregooglepackageinstaller" = "true" ]; then
|
|
if ( ! contains "$gapps_list" "packageinstallergoogle" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
sed -i "\:/system/priv-app/GooglePackageInstaller:d" $gapps_removal_list;
|
|
ignoregooglepackageinstaller="true[NoRemove]"
|
|
install_note="${install_note}nogooglepackageinstaller_removal"$'\n'; # make note that Google Package Installer will not be removed
|
|
else
|
|
ignoregooglepackageinstaller="false[PackageInstallerGoogle]"
|
|
fi
|
|
fi
|
|
|
|
ignoregoogletag="true"
|
|
for f in $tagstock_list; do
|
|
if [ -e "$f" ]; then
|
|
ignoregoogletag="false"
|
|
break; #at least 1 aosp stock file is present
|
|
fi
|
|
done;
|
|
if [ "$ignoregoogletag" = "true" ]; then
|
|
if ( ! contains "$gapps_list" "taggoogle" ) && ( ! grep -qi "override" "$g_conf" ); then
|
|
sed -i "\:/system/priv-app/TagGoogle:d" $gapps_removal_list;
|
|
ignoregoogletag="true[NoRemove]"
|
|
install_note="${install_note}nogoogletag_removal"$'\n'; # make note that Google Tag will not be removed
|
|
else
|
|
ignoregoogletag="false[TagGoogle]"
|
|
fi
|
|
fi
|
|
|
|
ignoregooglewebview="true"
|
|
for f in $webviewstock_list; do
|
|
if [ -e "$f" ]; then
|
|
ignoregooglewebview="false"
|
|
break; #at least 1 aosp stock file is present
|
|
fi
|
|
done;
|
|
if [ "$ignoregooglewebview" = "true" ]; then #No AOSP WebView
|
|
if ( ! contains "$gapps_list" "webviewgoogle" ) && ( ! grep -qi "override" "$g_conf" ); then #Don't remove Google WebView components if no Google WebView selected
|
|
sed -i "\:/system/lib/$WebView_lib_filename:d" $gapps_removal_list;
|
|
sed -i "\:/system/lib64/$WebView_lib_filename:d" $gapps_removal_list;
|
|
sed -i "\:/system/app/WebViewGoogle:d" $gapps_removal_list;
|
|
ignoregooglewebview="true[NoRemove]"
|
|
install_note="${install_note}nogooglewebview_removal"$'\n'; # make note that Google WebView will not be removed
|
|
else #No AOSP WebView, but Google WebView is being installed, no reason to protect the current components
|
|
ignoregooglewebview="false[WebViewGoogle]"
|
|
fi
|
|
elif ( ! contains "$gapps_list" "webviewgoogle" ); then #AOSP WebView, and no Google WebView being installed, make sure to protect the current AOSP components that share name with Google WebView components
|
|
sed -i "\:/system/lib/$WebView_lib_filename:d" $gapps_removal_list;
|
|
sed -i "\:/system/lib64/$WebView_lib_filename:d" $gapps_removal_list;
|
|
fi
|
|
|
|
# Process User Application Removals for calculations and subsequent removal
|
|
if [ -n "$user_remove_list" ]; then
|
|
for remove_apk in $user_remove_list; do
|
|
testapk=$( echo "$remove_apk" | tr '[:upper:]' '[:lower:]' );
|
|
# Add apk extension if user didn't include it
|
|
case $testapk in
|
|
*".apk" ) ;;
|
|
* ) testapk="${testapk}.apk" ;;
|
|
esac;
|
|
# Create user_remove_folder_list if this is a system/ROM application
|
|
for folder in /system/app /system/priv-app; do # Check all subfolders in /system/app /system/priv-app for the apk
|
|
file_count=0; # Reset Counter
|
|
file_count=$(find $folder -iname "$testapk" | wc -l);
|
|
case $file_count in
|
|
0) continue;;
|
|
EOFILE
|
|
universalremoverhack #on kitkat the paths for the universalremover are different
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
break;;
|
|
*) echo "$remove_apk" >> $user_remove_multiplefound_log; # Add app to user_remove_multiplefound_log since we found more than 1 instance
|
|
break;;
|
|
esac;
|
|
done;
|
|
if [ "$file_count" -eq 0 ]; then
|
|
echo "$remove_apk" >> $user_remove_notfound_log;
|
|
fi; # Add 'not found' app to user_remove_notfound_log
|
|
done;
|
|
fi;
|
|
|
|
# Removing old Chrome libraries
|
|
obsolete_libs_list="";
|
|
for f in $(find /system/lib /system/lib64 -name 'libchrome*.so' 2>/dev/null); do
|
|
obsolete_libs_list="${obsolete_libs_list}$f"$'\n';
|
|
done;
|
|
|
|
# Read in gapps removal list from file and append old Chrome libs
|
|
full_removal_list="$(cat $gapps_removal_list)"$'\n'"${obsolete_libs_list}";
|
|
|
|
# Clean up and sort our lists for space calculations and installation
|
|
set_progress 0.04;
|
|
gapps_list=$(echo "${gapps_list}" | sort | sed '/^$/d'); # sort GApps list & remove empty lines
|
|
aosp_remove_list=$(echo "${aosp_remove_list}" | sort | sed '/^$/d'); # sort AOSP Remove list & remove empty lines
|
|
full_removal_list=$(echo "${full_removal_list}" | sed '/^$/d'); # Remove empty lines from FINAL GApps Removal list
|
|
remove_list=$(echo "${remove_list}" | sed '/^$/d'); # Remove empty lines from remove_list
|
|
user_remove_folder_list=$(echo "${user_remove_folder_list}" | sed '/^$/d'); # Remove empty lines from User Application Removal list
|
|
|
|
log "Installing GApps Version" "$gapps_version";
|
|
log "Installing GApps Type" "$gapps_type";
|
|
log "Config Type" "$config_type";
|
|
log "Using gapps-config" "$config_file";
|
|
log "Remove Stock/AOSP Browser" "$remove_browser";
|
|
log "Remove Stock/AOSP Clock" "$remove_clockstock";
|
|
log "Remove Stock/AOSP Email" "$remove_email";
|
|
log "Remove Stock/AOSP Gallery" "$remove_gallery";
|
|
log "Remove Stock/AOSP Launcher" "$remove_launcher";
|
|
log "Remove Stock/AOSP MMS App" "$remove_mms";
|
|
log "Remove Stock/AOSP Pico TTS" "$remove_picotts";
|
|
log "Remove Stock/AOSP NFC Tag" "$remove_tagstock";
|
|
log "Remove Stock/AOSP WebView" "$remove_webviewstock";
|
|
log "Ignore Google Contacts" "$ignoregooglecontacts";
|
|
#log "Ignore Google Dialer" "$ignoregoogledialer";
|
|
log "Ignore Google Keyboard" "$ignoregooglekeyboard";
|
|
log "Ignore Google Package Installer" "$ignoregooglepackageinstaller";
|
|
log "Ignore Google NFC Tag" "$ignoregoogletag";
|
|
log "Ignore Google WebView" "$ignoregooglewebview";
|
|
# _____________________________________________________________________________________________________________________
|
|
# Perform space calculations
|
|
ui_print "- Performing system space calculations";
|
|
ui_print " ";
|
|
|
|
# Perform calculations of core applications
|
|
core_size=0;
|
|
for gapp_name in $core_gapps_list; do
|
|
get_appsize "Core/$gapp_name";
|
|
core_size=$((core_size + appsize));
|
|
done;
|
|
|
|
# Add swypelibs size to core, if it will be installed
|
|
if ( ! contains "$gapps_list" "keyboardgoogle" ); then
|
|
unzip -o "$ZIP" "Optional/swypelibs.tar.xz" -d /tmp;
|
|
keybd_lib_size=$(tar -tvJf "/tmp/Optional/swypelibs.tar.xz" "swypelibs" 2>/dev/null | awk 'BEGIN { app_size=0; } { file_size=$3; app_size=app_size+file_size; } END { printf "%.0f\n", app_size / 1024; }');
|
|
rm -f "/tmp/Optional/swypelibs.tar.xz";
|
|
core_size=$((core_size + keybd_lib_size)); # Add Keyboard Lib size to core, if it exists
|
|
fi
|
|
|
|
# Read and save system partition size details
|
|
df=$(busybox df -k /system | tail -n 1);
|
|
case $df in
|
|
/dev/block/*) df=$(echo "$df" | awk '{ print substr($0, index($0,$2)) }');;
|
|
esac;
|
|
total_system_size_kb=$(echo "$df" | awk '{ print $1 }');
|
|
used_system_size_kb=$(echo "$df" | awk '{ print $2 }');
|
|
free_system_size_kb=$(echo "$df" | awk '{ print $3 }');
|
|
log "Total System Size (KB)" "$total_system_size_kb";
|
|
log "Used System Space (KB)" "$used_system_size_kb";
|
|
log "Current Free Space (KB)" "$free_system_size_kb";
|
|
|
|
# Perform storage space calculations of existing GApps that will be deleted/replaced
|
|
reclaimed_gapps_space_kb=$(du -ck $(complete_gapps_list) | tail -n1 | awk '{ print $1 }');
|
|
|
|
# Perform storage space calculations of other Removals that need to be deleted (Obsolete and Conflicting Apps)
|
|
set_progress 0.05;
|
|
reclaimed_removal_space_kb=$(du -ck $(obsolete_gapps_list) | tail -n1 | awk '{ print $1 }');
|
|
|
|
# Add information to calc.log that will later be added to open_gapps.log to assist user with app removals
|
|
post_install_size_kb=$((free_system_size_kb + reclaimed_gapps_space_kb)); # Add opening calculations
|
|
echo ----------------------------------------------------------------------------- > $calc_log;
|
|
printf "%7s | %26s | %7s | %7s\n" "TYPE " "DESCRIPTION " "SIZE" " TOTAL" >> $calc_log;
|
|
printf "%7s | %26s | %7d | %7d\n" "" "Current Free Space" "$free_system_size_kb" "$free_system_size_kb" >> $calc_log;
|
|
printf "%7s | %26s | + %7d | %7d\n" "Remove" "Existing GApps" "$reclaimed_gapps_space_kb" $post_install_size_kb >> $calc_log;
|
|
post_install_size_kb=$((post_install_size_kb + reclaimed_removal_space_kb)); # Add reclaimed_removal_space_kb
|
|
printf "%7s | %26s | + %7d | %7d\n" "Remove" "Obsolete Files" "$reclaimed_removal_space_kb" $post_install_size_kb >> $calc_log;
|
|
|
|
# Perform calculations of AOSP/ROM files that will be deleted
|
|
set_progress 0.07;
|
|
for aosp_name in $aosp_remove_list; do
|
|
eval "list_name=\$${aosp_name}_list";
|
|
aosp_size_kb=0; # Reset counter
|
|
for file_name in $list_name; do
|
|
if [ -e "/system/$file_name" ]; then
|
|
file_size_kb=$(du -ck "/system/$file_name" | tail -n1 | awk '{ print $1 }');
|
|
aosp_size_kb=$((file_size_kb + aosp_size_kb));
|
|
post_install_size_kb=$((post_install_size_kb + file_size_kb));
|
|
fi;
|
|
done;
|
|
log_add "Remove" "$aosp_name" $aosp_size_kb $post_install_size_kb;
|
|
done;
|
|
|
|
# Perform calculations of User App Removals that will be deleted
|
|
for remove_folder in $user_remove_folder_list; do
|
|
if [ -e "$remove_folder" ]; then
|
|
folder_size_kb=$(du -ck "$remove_folder" | tail -n1 | awk '{ print $1 }');
|
|
post_install_size_kb=$((post_install_size_kb + folder_size_kb));
|
|
log_add "Remove" "$(basename "$remove_folder")°" "$folder_size_kb" $post_install_size_kb;
|
|
fi;
|
|
done;
|
|
|
|
# Perform calculations of GApps files that will be installed
|
|
set_progress 0.09;
|
|
post_install_size_kb=$((post_install_size_kb - core_size)); # Add Core GApps
|
|
log_sub "Install" "Core²" $core_size $post_install_size_kb;
|
|
|
|
for gapp_name in $gapps_list; do
|
|
get_appsize "GApps/$gapp_name";
|
|
EOFILE
|
|
echo "$DATASIZESCODE" >> "$build/META-INF/com/google/android/update-binary"
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
post_install_size_kb=$((post_install_size_kb - appsize));
|
|
log_sub "Install" "$gapp_name³" "$appsize" $post_install_size_kb;
|
|
done;
|
|
|
|
# Perform calculations of required Buffer Size
|
|
set_progress 0.11;
|
|
if ( grep -qi "smallbuffer" "$g_conf" ); then
|
|
buffer_size_kb=$small_buffer_size;
|
|
fi;
|
|
|
|
post_install_size_kb=$((post_install_size_kb - buffer_size_kb));
|
|
log_sub "" "Buffer Space²" "$buffer_size_kb" $post_install_size_kb;
|
|
echo ----------------------------------------------------------------------------- >> $calc_log;
|
|
|
|
if [ "$post_install_size_kb" -ge 0 ]; then
|
|
printf "%47s | %7d\n" " Post Install Free Space" $post_install_size_kb >> $calc_log;
|
|
log "Post Install Free Space (KB)" "$post_install_size_kb << See Calculations Below";
|
|
else
|
|
additional_size_kb=$((post_install_size_kb * -1));
|
|
printf "%47s | %7d\n" "Additional Space Required" $additional_size_kb >> $calc_log;
|
|
log "Additional Space Required (KB)" "$additional_size_kb << See Calculations Below";
|
|
fi;
|
|
|
|
# Finish up Calculation Log
|
|
echo ----------------------------------------------------------------------------- >> $calc_log;
|
|
if [ -n "$user_remove_folder_list" ]; then
|
|
echo " ° User Requested Removal" >> $calc_log;
|
|
fi;
|
|
echo " ² Required (ALWAYS Installed)" >> $calc_log;
|
|
echo " ³ Optional (may be removed)" >> $calc_log;
|
|
|
|
# Check whether there's enough free space to complete this installation
|
|
if [ "$post_install_size_kb" -lt 0 ]; then
|
|
# We don't have enough system space to install everything user requested
|
|
ui_print "Insufficient storage space available in";
|
|
ui_print "System partition. You may want to use a";
|
|
ui_print "smaller Open GApps package or consider";
|
|
ui_print "removing some apps using gapps-config.";
|
|
ui_print "See:'$log_folder/open_gapps_log.txt'";
|
|
ui_print "for complete details and information.";
|
|
ui_print " ";
|
|
install_note="${install_note}system_space_msg"$'\n'; # make note that there is insufficient space in system to install
|
|
abort "$E_NOSPACE";
|
|
fi;
|
|
|
|
# Check to see if this is the 'real thing' or only a test
|
|
if ( grep -qi "test" "$g_conf" ); then # user has selected a 'test' install ONLY
|
|
ui_print "- Exiting Simulated Install";
|
|
ui_print " ";
|
|
install_note="${install_note}simulation_msg"$'\n'; # make note that this is only a test installation
|
|
quit;
|
|
exxit 0;
|
|
fi;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Perform Removals
|
|
# Remove ALL Existing GApps files
|
|
set_progress 0.13;
|
|
ui_print "- Removing existing/obsolete Apps";
|
|
ui_print " ";
|
|
rm -rf $(complete_gapps_list);
|
|
|
|
# Remove Obsolete and Conflicting Apps
|
|
rm -rf $(obsolete_gapps_list);
|
|
|
|
# Remove Stock/AOSP Apps and add Removals to addon.d script
|
|
aosp_remove_list=$(echo "${aosp_remove_list}" | sort -r); # reverse sort list for more readable output
|
|
for aosp_name in $aosp_remove_list; do
|
|
eval "list_name=\$${aosp_name}_list";
|
|
list_name=$(echo "${list_name}" | sort -r); # reverse sort list for more readable output
|
|
for file_name in $list_name; do
|
|
rm -rf "/system/$file_name";
|
|
sed -i "\:# Remove Stock/AOSP apps (from GApps Installer):a \ rm -rf /system/$file_name" $bkup_tail;
|
|
done;
|
|
done;
|
|
|
|
# Perform User App Removals and add Removals to addon.d script
|
|
user_remove_folder_list=$(echo "${user_remove_folder_list}" | sort -r); # reverse sort list for more readable output
|
|
for user_app in $user_remove_folder_list; do
|
|
rm -rf "$user_app";
|
|
sed -i "\:# Remove 'user requested' apps (from gapps-config):a \ rm -rf $user_app" $bkup_tail;
|
|
done;
|
|
|
|
# Remove any empty folders we may have created during the removal process
|
|
for i in /system/app /system/priv-app /system/vendor/pittpatt /system/usr/srec /system/etc/preferred-apps; do
|
|
find "$i" -type d | xargs rmdir -p --ignore-fail-on-non-empty;
|
|
done;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Perform Installs
|
|
ui_print "- Installing updated GApps";
|
|
ui_print " ";
|
|
set_progress 0.15;
|
|
for gapp_name in $core_gapps_list; do
|
|
extract_app "Core/$gapp_name";
|
|
done;
|
|
set_progress 0.25;
|
|
|
|
EOFILE
|
|
echo "$KEYBDINSTALLCODE" >> "$build/META-INF/com/google/android/update-binary"
|
|
echo "$DATAINSTALLCODE" >> "$build/META-INF/com/google/android/update-binary"
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
# Progress Bar increment calculations for GApps Install process
|
|
set_progress 0.30;
|
|
gapps_count=$(echo "${gapps_list}" | wc -w); # Count number of GApps left to be installed
|
|
if [ "$gapps_count" -lt 1 ]; then gapps_count=1; fi; # Prevent division by zero
|
|
incr_amt=$(( 5000 / gapps_count )); # Determine increment factor of progress bar during GApps installation
|
|
prog_bar=3000; # Set Progress Bar start point (0.3000) for below
|
|
|
|
# Install the rest of GApps still in $gapps_list
|
|
for gapp_name in $gapps_list; do
|
|
extract_app "GApps/$gapp_name"; # Installing User Selected GApps
|
|
prog_bar=$((prog_bar + incr_amt));
|
|
set_progress 0.$prog_bar;
|
|
done;
|
|
|
|
EOFILE
|
|
echo '# Create FaceLock lib symlink if FaceLock was installed
|
|
if ( contains "$gapps_list" "faceunlock" ); then
|
|
mkdir -p "/system/app/FaceLock/lib/'"$ARCH"'";
|
|
ln -sfn "/system/'"$LIBFOLDER"'/$faceLock_lib_filename" "/system/app/FaceLock/lib/'"$ARCH"'/$faceLock_lib_filename"; # create required symlink
|
|
# Add same code to backup script to insure symlinks are recreated on addon.d restore
|
|
sed -i "\:# Recreate required symlinks (from GApps Installer):a \ ln -sfn \"/system/'"$LIBFOLDER"'/$faceLock_lib_filename\" \"/system/app/FaceLock/lib/'"$ARCH"'/$faceLock_lib_filename\"" $bkup_tail;
|
|
sed -i "\:# Recreate required symlinks (from GApps Installer):a \ mkdir -p \"/system/app/FaceLock/lib/'"$ARCH"'\"" $bkup_tail;
|
|
fi;
|
|
' >> "$build/META-INF/com/google/android/update-binary"
|
|
if [ "$API" -lt "23" ]; then
|
|
echo '# Create WebView lib symlink if WebView was installed
|
|
if ( contains "$gapps_list" "webviewgoogle" ); then
|
|
mkdir -p "/system/app/WebViewGoogle/lib/'"$ARCH"'";
|
|
ln -sfn "/system/'"$LIBFOLDER"'/$WebView_lib_filename" "/system/app/WebViewGoogle/lib/'"$ARCH"'/$WebView_lib_filename"; # create required symlink' >> "$build/META-INF/com/google/android/update-binary"
|
|
if [ "$LIBFOLDER" = "lib64" ]; then #on 64bit we also need to add 32 bit libs
|
|
echo ' mkdir -p "/system/app/WebViewGoogle/lib/'"$fallback_arch"'";
|
|
ln -sfn "/system/lib/$WebView_lib_filename" "/system/app/WebViewGoogle/lib/'"$fallback_arch"'/$WebView_lib_filename"; # create required symlink' >> "$build/META-INF/com/google/android/update-binary"
|
|
fi
|
|
echo ' # Add same code to backup script to insure symlinks are recreated on addon.d restore' >> "$build/META-INF/com/google/android/update-binary"
|
|
if [ "$LIBFOLDER" = "lib64" ]; then #on 64bit we also need to add 32 bit libs
|
|
echo ' sed -i "\:# Recreate required symlinks (from GApps Installer):a \ ln -sfn \"/system/lib/$WebView_lib_filename\" \"/system/app/WebViewGoogle/lib/'"$fallback_arch"'/$WebView_lib_filename\"" $bkup_tail;
|
|
sed -i "\:# Recreate required symlinks (from GApps Installer):a \ mkdir -p \"/system/app/WebViewGoogle/lib/'"$fallback_arch"'\"" $bkup_tail;' >> "$build/META-INF/com/google/android/update-binary"
|
|
fi
|
|
echo ' sed -i "\:# Recreate required symlinks (from GApps Installer):a \ ln -sfn \"/system/'"$LIBFOLDER"'/$WebView_lib_filename\" \"/system/app/WebViewGoogle/lib/'"$ARCH"'/$WebView_lib_filename\"" $bkup_tail;
|
|
sed -i "\:# Recreate required symlinks (from GApps Installer):a \ mkdir -p \"/system/app/WebViewGoogle/lib/'"$ARCH"'\"" $bkup_tail;
|
|
fi;' >> "$build/META-INF/com/google/android/update-binary"
|
|
fi
|
|
tee -a "$build/META-INF/com/google/android/update-binary" > /dev/null <<'EOFILE'
|
|
|
|
# Copy g.prop over to /system/etc
|
|
cp -f /tmp/g.prop $g_prop;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Build and Install Addon.d Backup Script
|
|
# Add 'other' Removals to addon.d script
|
|
set_progress 0.80;
|
|
other_list=$(echo "${other_list}" | sort -r); # reverse sort list for more readable output
|
|
for other_name in $other_list; do
|
|
sed -i "\:# Remove 'other' apps (per installer.data):a \ rm -rf $other_name" $bkup_tail;
|
|
done;
|
|
|
|
# Add 'priv-app' Removals to addon.d script
|
|
privapp_list=$(echo "${privapp_list}" | sort -r); # reverse sort list for more readable output
|
|
for privapp_name in $privapp_list; do
|
|
sed -i "\:# Remove 'priv-app' apps from 'app' (per installer.data):a \ rm -rf $privapp_name" $bkup_tail;
|
|
done;
|
|
|
|
# Add 'required' Removals to addon.d script
|
|
reqd_list=$(echo "${reqd_list}" | sort -r); # reverse sort list for more readable output
|
|
for reqdapp_name in $reqd_list; do
|
|
sed -i "\:# Remove 'required' apps (per installer.data):a \ rm -rf $reqdapp_name" $bkup_tail;
|
|
done;
|
|
|
|
# Create final addon.d script in system
|
|
bkup_header="#!/sbin/sh\n# \n# /system/addon.d/70-gapps.sh\n#\n. /tmp/backuptool.functions\n\nlist_files() {\ncat <<EOF"
|
|
bkup_list="$bkup_list"$'\n'"etc/g.prop"; # add g.prop to backup list
|
|
bkup_list=$(echo "${bkup_list}" | sort -u| sed '/^$/d'); # sort list & remove duplicates and empty lines
|
|
mkdir -p /system/addon.d;
|
|
echo -e "$bkup_header" > /system/addon.d/70-gapps.sh;
|
|
echo -e "$bkup_list" >> /system/addon.d/70-gapps.sh;
|
|
cat $bkup_tail >> /system/addon.d/70-gapps.sh;
|
|
# _____________________________________________________________________________________________________________________
|
|
# Fix Permissions
|
|
set_progress 0.83;
|
|
ui_print "- Fixing permissions & contexts";
|
|
ui_print " ";
|
|
set_perm_recursive 0 0 755 644 "/system/app" "/system/framework" "/system/lib" "/system/lib64" "/system/priv-app" "/system/usr/srec" "/system/vendor/pittpatt" "/system/etc/permissions" "/system/etc/preferred-apps";
|
|
|
|
set_progress 0.85;
|
|
set_perm_recursive 0 0 755 755 "/system/addon.d";
|
|
|
|
set_progress 0.87;
|
|
find /system/vendor/pittpatt -type d -exec chown 0.2000 '{}' \; -exec chown 0:2000 '{}' \; # Change pittpatt folders to root:shell per Google Factory Settings
|
|
|
|
set_perm 0 0 644 $g_prop;
|
|
|
|
# Set contexts on all files we installed
|
|
set_progress 0.88;
|
|
ch_con_recursive "/system/app" "/system/framework" "/system/lib" "/system/lib64" "/system/priv-app" "/system/usr/srec" "/system/vendor/pittpatt" "/system/etc/permissions" "/system/etc/preferred-apps" "/system/addon.d";
|
|
ch_con $g_prop;
|
|
|
|
set_progress 0.92;
|
|
quit;
|
|
|
|
ui_print "- Installation complete!";
|
|
ui_print " ";
|
|
exxit 0;
|
|
EOFILE
|
|
}
|