0% found this document useful (0 votes)
187 views

Installer

This document outlines scripts for installing Google apps (Gapps) on Android devices. It defines lists of files for basic and full Gapps packages and provides functions for tasks like mounting partitions, copying files, and cleaning up logs and temporary files.

Uploaded by

MASADENS S
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
187 views

Installer

This document outlines scripts for installing Google apps (Gapps) on Android devices. It defines lists of files for basic and full Gapps packages and provides functions for tasks like mounting partitions, copying files, and cleaning up logs and temporary files.

Uploaded by

MASADENS S
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 20

#!

/sbin/sh
#
###########################################
#
# Copyright (C) 2021 FlameGApps Project
#
# This file is part of the FlameGApps Project created by ayandebnath
#
# The FlameGApps scripts are free software, you can redistribute and/or modify
them.
#
# These scripts are distributed in the hope that they will be useful, but WITHOUT
ANY WARRANTY.
#
###########################################
# File Name : installer.sh
###########################################
##
# List of the basic edition gapps files
gapps_list_basic="
AndroidAutoStub
CalendarSync
DigitalWellbeing
GooglePackageInstaller
MarkupGoogle
SetupWizard
SoundPickerGoogle"

# List of the full edition gapps files


gapps_list_full="
AndroidAutoStub
CalendarSync
DeviceHealthServices
DigitalWellbeing
GoogleClock
GoogleCalendar
GoogleCalculator
GoogleContacts
GoogleDialer
GoogleMessages
GoogleKeyboard
GooglePackageInstaller
GooglePhotos
MarkupGoogle
SetupWizard
SoundPickerGoogle
WallpaperPickerGoogle"

# List of extra/optional files


extra_list="
PixelConfig"

# Pre-installed unnecessary app list


rm_list_basic="
app/AndroidAutoStubPrebuilt
app/ExtShared
app/GoogleCalendarSyncAdapter
app/GoogleContactsSyncAdapter
app/GoogleExtShared
app/GoogleLocationHistory
app/MarkupGoogle
app/MarkupGooglePrebuilt
app/SoundPickerGooglePrebuilt
etc/default-permissions/default-permissions.xml
etc/default-permissions/opengapps-permissions.xml
etc/permissions/com.google.android.dialer.support.xml
etc/permissions/com.google.android.maps.xml
etc/permissions/com.google.android.media.effects.xml
etc/permissions/privapp-permissions-google.xml
etc/permissions/split-permissions-google.xml
etc/preferred-apps/google.xml
etc/sysconfig/dialer_experience.xml
etc/sysconfig/google-hiddenapi-package-whitelist.xml
etc/sysconfig/google.xml
etc/sysconfig/google_build.xml
etc/sysconfig/google_exclusives_enable.xml
etc/sysconfig/nexus.xml
etc/sysconfig/pixel_2018_exclusive.xml
etc/sysconfig/pixel_experience_2017.xml
etc/sysconfig/pixel_experience_2018.xml
framework/com.google.android.dialer.support.jar
framework/com.google.android.maps.jar
framework/com.google.android.media.effects.jar
lib64/libsketchology_native.so
overlay/forceQueryablePackagesOverlay.apk
priv-app/AndroidAutoStubPrebuilt
priv-app/AndroidMigratePrebuilt
priv-app/AndroidPlatformServices
priv-app/CarrierSetup
priv-app/ConfigUpdater
priv-app/ExtServices
priv-app/GmsCore
priv-app/GmsCoreSetupPrebuilt
priv-app/GoogleBackupTransport
priv-app/GoogleExtServices
priv-app/GooglePackageInstaller
priv-app/GoogleRestore
priv-app/GoogleServicesFramework
priv-app/Phonesky
priv-app/PrebuiltGmsCore
priv-app/PrebuiltGmsCorePi
priv-app/PrebuiltGmsCoreQt
priv-app/SetupWizard
priv-app/Wellbeing
priv-app/WellbeingGooglePrebuilt
priv-app/WellbeingPrebuilt"

rm_list_full="
app/AndroidAutoStubPrebuilt
app/AudioFX
app/Browser
app/Browser2
app/BrowserPrebuilt
app/Calculator
app/Calculator2
app/CalculatorGooglePrebuilt
app/Calendar
app/CalendarGooglePrebuilt
app/CalendarPrebuilt
app/ChromePublic
app/Clock
app/DashClock
app/DeskClock
app/Eleven
app/Email
app/Email2
app/Etar
app/ExactCalculator
app/ExtShared
app/Gallery2
app/GalleryGo
app/GalleryGoPrebuilt
app/GoogleCalendarSyncAdapter
app/GoogleContactsSyncAdapter
app/GoogleExtShared
app/GoogleLocationHistory
app/Hangouts
app/Jelly
app/LatinIMEGoogle
app/LatinIMEGooglePrebuilt
app/MarkupGoogle
app/MarkupGooglePrebuilt
app/MarkupPrebuilt
app/Music
app/Music2
app/MusicPrebuilt
app/Photos
app/PhotosPrebuilt
app/PrebuiltBugle
app/PrebuiltDeskClock
app/PrebuiltDeskClockGoogle
app/RetroMusicPlayer
app/RetroMusicPlayerPrebuilt
app/RevengeOSCalculator
app/SimpleCalendar
app/SimpleGallery
app/SoundPickerGooglePrebuilt
app/Via
app/ViaBrowser
app/ViaBrowserPrebuilt
app/ViaPrebuilt
app/WallpaperPicker
app/WallpaperPickerGooglePrebuilt
app/WallpaperPickerGoogleRelease
app/WallpaperPickerPrebuilt
etc/default-permissions/default-permissions.xml
etc/default-permissions/opengapps-permissions.xml
etc/permissions/com.google.android.dialer.support.xml
etc/permissions/com.google.android.maps.xml
etc/permissions/com.google.android.media.effects.xml
etc/permissions/privapp-permissions-google.xml
etc/permissions/split-permissions-google.xml
etc/preferred-apps/google.xml
etc/sysconfig/dialer_experience.xml
etc/sysconfig/google-hiddenapi-package-whitelist.xml
etc/sysconfig/google.xml
etc/sysconfig/google_build.xml
etc/sysconfig/google_exclusives_enable.xml
etc/sysconfig/nexus.xml
etc/sysconfig/pixel_2018_exclusive.xml
etc/sysconfig/pixel_experience_2017.xml
etc/sysconfig/pixel_experience_2018.xml
framework/com.google.android.dialer.support.jar
framework/com.google.android.maps.jar
framework/com.google.android.media.effects.jar
lib64/libjni_latinimegoogle.so
lib64/libsketchology_native.so
overlay/forceQueryablePackagesOverlay.apk
overlay/GoogleDialerOverlay.apk
priv-app/AndroidAutoStubPrebuilt
priv-app/AndroidMigratePrebuilt
priv-app/AndroidPlafoPlatformServices
priv-app/AudioFX
priv-app/Browser
priv-app/Browser2
priv-app/BrowserPrebuilt
priv-app/Calculator
priv-app/Calendar
priv-app/CarrierSetup
priv-app/Clock
priv-app/ConfigUpdater
priv-app/crDroidMusic
priv-app/DeviceHealthService
priv-app/Eleven
priv-app/Email
priv-app/Email2
priv-app/ExtServices
priv-app/Gallery
priv-app/Gallery2
priv-app/Gallery3d
priv-app/GalleryGo
priv-app/GalleryGoPrebuilt
priv-app/GalleryPrebuilt
priv-app/GmsCore
priv-app/GmsCorePrebuilt
priv-app/GmsCoreSetupPrebuilt
priv-app/GoogleBackupTransport
priv-app/GoogleContacts
priv-app/GoogleDialer
priv-app/GoogleExtServices
priv-app/GooglePackageInstaller
priv-app/GoogleRestore
priv-app/GoogleServicesFramework
priv-app/Hangouts
priv-app/Jelly
priv-app/LatinIMEGooglePrebuilt
priv-app/MarkupGoogle
priv-app/MarkupGooglePrebuilt
priv-app/Music
priv-app/Music2
priv-app/MusicPrebuilt
priv-app/Phonesky
priv-app/Photos
priv-app/PixelSetupWizard
priv-app/PrebuiltDeskClock
priv-app/PrebuiltGalleryGo
priv-app/PrebuiltGmsCore
priv-app/PrebuiltGmsCorePi
priv-app/PrebuiltGmsCoreQt
priv-app/RetroMusicPlayer
priv-app/RetroMusicPlayerPrebuilt
priv-app/SetupWizard
priv-app/SetupWizardPrebuilt
priv-app/SimpleGallery
priv-app/SnapGallery
priv-app/SnapdragonGallery
priv-app/Turbo
priv-app/TurboPrebuilt
priv-app/Via
priv-app/ViaBrowser
priv-app/ViaBrowserPrebuilt
priv-app/ViaPrebuilt
priv-app/WallpaperGooglePrebuilt
priv-app/WallpaperPickerGoogleRelease
priv-app/WallpapersGooglePrebuilt
priv-app/Wellbeing
priv-app/WellbeingGooglePrebuilt
priv-app/WellbeingPrebuilt"

stock_camera="
app/Camera2
app/SimpleCamera
app/Snap
priv-app/Camera2
priv-app/SimpleCamera
priv-app/Snap"

stock_messages="
app/message
app/messages
app/Messages
app/messaging
app/Messaging
app/Messenger
app/QKSMS
app/RevengeMessages
priv-app/messaging
priv-app/Messaging"

stock_soundpicker="
app/PrebuiltSoundPicker
app/SoundPicker
app/SoundPickerPrebuilt
priv-app/PrebuiltSoundPicker
priv-app/SoundPicker
priv-app/SoundPickerPrebuilt"

provision="
app/provision
app/Provision
priv-app/provision
priv-app/Provision"

lineage_setup="
priv-app/LineageSetupWizard"
aosp_dialer="
app/Dialer
priv-app/Dialer"

aosp_contacts="
app/Contact
app/Contacts
priv-app/Contact
priv-app/Contacts"

aosp_keyboard="
app/LatinIME
app/LatinIMEPrebuilt
priv-app/LatinIME
priv-app/LatinIMEPrebuilt"

aosp_packageinstaller="
priv-app/PackageInstaller"

ui_print() {
echo "ui_print $1
ui_print" >> $OUTFD
}

set_progress() { echo "set_progress $1" >> $OUTFD; }

contains() { echo "$1" | grep -q "$2" && return 0 || return 1; }

is_mounted() { mount | grep -q " $1 "; }

setup_mountpoint() {
[ -L $1 ] && mv -f $1 ${1}_link
if [ ! -d $1 ]; then
rm -f $1
mkdir -p $1
fi
}

recovery_actions() {
OLD_LD_LIB=$LD_LIBRARY_PATH
OLD_LD_PRE=$LD_PRELOAD
OLD_LD_CFG=$LD_CONFIG_FILE
unset LD_LIBRARY_PATH
unset LD_PRELOAD
unset LD_CONFIG_FILE
}

recovery_cleanup() {
[ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB
[ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE
[ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG
}

clean_up() {
rm -rf /tmp/flamegapps
rm -rf /tmp/config.prop
rm -rf /tmp/flame.prop
rm -rf /tmp/tar_gapps
rm -rf /tmp/unzip_dir
rm -rf $backup_script
rm -rf $temp_backup_script
}

path_info() {
ls / > "$log_dir/rootpathinfo.txt"
ls -RZl $SYSTEM > "$log_dir/systempathinfo.txt"
ls -RZl /product > "$log_dir/productpathinfo.txt" 2>/dev/null
ls -RZl /system_ext > "$log_dir/system_extpathinfo.txt" 2>/dev/null
}

log_space() { df -h > $log_dir/space_$1.txt; }

take_logs() {
ui_print " "
ui_print "- Copying logs to /sdcard & $zip_dir"
cp -f $TMP/recovery.log $log_dir/recovery.log
cd $log_dir
tar -cz -f "$TMP/flamegapps_canary_debug_logs.tar.gz" *
cp -f $TMP/flamegapps_canary_debug_logs.tar.gz
"$zip_dir/flamegapps_canary_debug_logs-$build_date-$build_time.tar.gz"
cp -f $TMP/flamegapps_canary_debug_logs.tar.gz
/sdcard/flamegapps_canary_debug_logs-$build_date-$build_time.tar.gz
cd /
rm -rf $TMP/flamegapps_canary_debug_logs.tar.gz
}

get_size() {
local FILE_SIZE=0
FILE_SIZE=`du -sk "$1" | cut -f1`
printf "$FILE_SIZE"
}

get_file_prop() {
grep -m1 "^$2=" "$1" | cut -d= -f2
}

get_prop() {
# check known .prop files using get_file_prop
for f in $PROPFILES; do
if [ -e "$f" ]; then
prop="$(get_file_prop "$f" "$1")"
if [ -n "$prop" ]; then
break # if an entry has been found, break out of the loop
fi
fi
done
# if prop is still empty; try to use recovery's built-in getprop method;
otherwise output current result
if [ -z "$prop" ]; then
getprop "$1" | cut -c1-
else
printf "$prop"
fi
}

get_available_space() {
local available_space=0
available_space=`df -k $1 | tail -1 | awk '{print $3}'`
printf $available_space
}

check_available_space() {
local file_size
local partition="$1"
[ -e $partition ] || return 1
space_required=`get_prop ro.flame.required_size`
space_required=$(($space_required + $buffer_space))
space_available=$(get_available_space "$partition")
for f in $removal_list; do
if [ -e "$partition/$f" ]; then
file_size=`get_size "$partition/$f"`
space_available=$(($space_available + $file_size))
fi
done
echo -e "\n- Available space in ${partition}: $space_available" >> $flame_log
if [ "$space_available" -ge "$space_required" ]; then
return 0
else
return 1
fi
}

# replace_line <file> <line replace string> <replacement line>; modified; for


reference, check: https://github.com/osm0sis/AnyKernel3/blob/master/tools/ak3-
core.sh
replace_line() {
local line
if grep -q "$2" $1; then
line=$(grep -n "$2" $1 | cut -d: -f1)
sed -i "${line}s;.*;${3};" $1;
fi
}

remove_fd() {
local LIST="$1"
for f in $LIST; do
rm -rf $SYSTEM/$f
rm -rf $SYSTEM/product/$f
if [ "$rom_sdk" -gt "29" ]; then
rm -rf $SYSTEM/system_ext/$f
fi
done
}

abort() {
sleep 1
ui_print "- Aborting..."
sleep 3
path_info
unmount_all
take_logs
clean_up
recovery_cleanup
exit 1;
}
exit_all() {
sleep 0.5
path_info
log_space "after"
unmount_all
sleep 0.5
set_progress 0.90
take_logs
clean_up
recovery_cleanup
sleep 0.5
ui_print " "
ui_print "- Installation Successful..!"
ui_print " "
set_progress 1.00
exit 0;
}

mount_apex() {
# For reference, check: https://github.com/osm0sis/AnyKernel3/blob/master/META-
INF/com/google/android/update-binary
if [ -d $SYSTEM/apex ]; then
local apex dest loop minorx num
setup_mountpoint /apex
minorx=1
[ -e /dev/block/loop1 ] && minorx=$(ls -l /dev/block/loop1 | awk '{ print
$6 }')
num=0
for apex in $SYSTEM/apex/*; do
dest=/apex/$(basename $apex .apex)
[ "$dest" = /apex/com.android.runtime.release ] &&
dest=/apex/com.android.runtime
mkdir -p $dest
case $apex in
*.apex)
unzip -qo $apex apex_payload.img -d /apex
mv -f /apex/apex_payload.img $dest.img
mount -t ext4 -o ro,noatime $dest.img $dest 2>/dev/null
if [ $? != 0 ]; then
while [ $num -lt 64 ]; do
loop=/dev/block/loop$num
(mknod $loop b 7 $((num * minorx))
losetup $loop $dest.img) 2>/dev/null
num=$((num + 1))
losetup $loop | grep -q $dest.img && break
done
mount -t ext4 -o ro,loop,noatime $loop $dest
if [ $? != 0 ]; then
losetup -d $loop 2>/dev/null
fi
fi
;;
*) mount -o bind $apex $dest;;
esac
done
export ANDROID_RUNTIME_ROOT=/apex/com.android.runtime
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
export BOOTCLASSPATH=/apex/com.android.runtime/javalib/core-
oj.jar:/apex/com.android.runtime/javalib/core-
libart.jar:/apex/com.android.runtime/javalib/okhttp.jar:/apex/com.android.runtime/j
avalib/bouncycastle.jar:/apex/com.android.runtime/javalib/apache-
xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework
/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-
common.jar:/system/framework/android.test.base.jar:/system/framework/telephony-
ext.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/j
avalib/updatable-media.jar
fi
}

unmount_apex() {
if [ -d /apex ]; then
local dest loop
for dest in $(find /apex -type d -mindepth 1 -maxdepth 1); do
if [ -f $dest.img ]; then
loop=$(mount | grep $dest | cut -d" " -f1)
fi
(umount -l $dest
losetup -d $loop) 2>/dev/null
done
rm -rf /apex 2>/dev/null
unset ANDROID_RUNTIME_ROOT ANDROID_TZDATA_ROOT BOOTCLASSPATH
fi
}

mount_all() {
set_progress 0.10
ui_print "- Mounting partitions"
sleep 1
dynamic_partitions=`getprop ro.boot.dynamic_partitions`
SLOT=`getprop ro.boot.slot_suffix`
[ -n "$SLOT" ] && ui_print "- Current boot slot: $SLOT"

if ! is_mounted /cache; then


if [ -d /cache ]; then
ui_print "- Mounting /cache"
mount /cache
unmount_cache=true
fi
fi
if ! is_mounted /data; then
if [ -d /data ]; then
ui_print "- Mounting /data"
mount /data
unmount_data=true
fi
fi

if [ -f /etc/fstab ]; then
if [ -n "$(cat /etc/fstab | grep /system_root)" ]; then
MOUNT_POINT=/system_root
else
MOUNT_POINT=/system
fi
else
ui_print "- No fstab detected"
MOUNT_POINT=$ANDROID_ROOT
fi
case $MOUNT_POINT in
/system_root) setup_mountpoint /system
;;
/system)
setup_mountpoint /system_root
mount -o ro -t auto /system_root
;;
esac

if ! is_mounted $MOUNT_POINT; then


mount -o ro -t auto $MOUNT_POINT
fi

for m in /vendor /product /system_ext; do


mount -o ro -t auto $m 2>/dev/null
done

if [ "$dynamic_partitions" = "true" ]; then


ui_print "- Dynamic partition detected"
(umount /system
umount -l /system) 2>/dev/null
mount -o ro -t auto /dev/block/mapper/system$SLOT /system_root
(mount -o ro -t auto /dev/block/mapper/vendor$SLOT /vendor
mount -o ro -t auto /dev/block/mapper/product$SLOT /product
mount -o ro -t auto /dev/block/mapper/system_ext$SLOT /system_ext) 2>/dev/null
for block in system vendor product system_ext; do
for slot in "" _a _b; do
blockdev --setrw /dev/block/mapper/$block$slot 2>/dev/null
done
done
mount -o rw,remount -t auto /dev/block/mapper/system$SLOT /system_root
(mount -o rw,remount -t auto /dev/block/mapper/vendor$SLOT /vendor
mount -o rw,remount -t auto /dev/block/mapper/product$SLOT /product
mount -o rw,remount -t auto /dev/block/mapper/system_ext$SLOT /system_ext)
2>/dev/null
else
if ! is_mounted $MOUNT_POINT; then
mount -o ro -t auto /dev/block/bootdevice/by-name/system$SLOT $MOUNT_POINT
(mount -o ro -t auto /dev/block/bootdevice/by-name/vendor$SLOT /vendor
mount -o ro -t auto /dev/block/bootdevice/by-name/product$SLOT /product
mount -o ro -t auto /dev/block/bootdevice/by-name/system_ext$SLOT
/system_ext) 2>/dev/null
fi
mount -o rw,remount -t auto $MOUNT_POINT
(mount -o rw,remount -t auto /vendor
mount -o rw,remount -t auto /product
mount -o rw,remount -t auto /system_ext) 2>/dev/null
fi

sleep 0.3

if is_mounted /system_root; then


ui_print "- Device is system-as-root"
if [ -f /system_root/build.prop ]; then
mount -o bind /system_root /system
SYSTEM=/system_root
ui_print "- System is $SYSTEM"
else
mount -o bind /system_root/system /system
SYSTEM=/system_root/system
ui_print "- System is $SYSTEM"
fi
elif is_mounted /system; then
if [ -f /system/build.prop ]; then
SYSTEM=/system
ui_print "- System is $SYSTEM"
elif [ -f /system/system/build.prop ]; then
ui_print "- Device is system-as-root"
mount --move /system /system_root
mount -o bind /system_root/system /system
SYSTEM=/system_root/system
ui_print "- System is /system/system"
fi
else
ui_print "- Failed to mount/detect system"
abort
fi
mount_apex
}

unmount_all() {
ui_print " "
ui_print "- Unmounting partitions"
unmount_apex
if [ "$unmount_data" ]; then
umount /data
umount -l /data
fi
if [ "$unmount_cache" ]; then
umount /cache
umount -l /cache
fi
for m in /system /system_root /product /system_ext /vendor; do
if [ -e $m ]; then
(umount $m
umount -l $m) 2>/dev/null
fi
done
}

[ -z "$ANDROID_ROOT" ] && ANDROID_ROOT=/system


mount -o bind /dev/urandom /dev/random
unmount_all
mount_all

recovery_actions

PROPFILES="$SYSTEM/build.prop $TMP/flame.prop"
CORE_DIR="$TMP/tar_core"
GAPPS_DIR="$TMP/tar_gapps"
EXTRA_DIR="$TMP/tar_extra"
UNZIP_FOLDER="$TMP/unzip_dir"
EX_SYSTEM="$UNZIP_FOLDER/src"
zip_dir="$(dirname "$ZIPFILE")"
log_dir="$TMP/flamegapps/logs"
flame_log="$log_dir/installation_log.txt"
build_info="$log_dir/build_info.prop"
backup_script="$TMP/backup_script.sh"
temp_backup_script="$TMP/temp_backup_script.sh"
overlay_installed="false"
buffer_space=2000
mkdir -p $UNZIP_FOLDER
mkdir -p $log_dir
log_space "before"

# Get ROM, device & package information


flame_android=`get_prop ro.flame.android`
flame_sdk=`get_prop ro.flame.sdk`
flame_arch=`get_prop ro.flame.arch`
flame_edition=`get_prop ro.flame.edition`
rom_version=`get_prop ro.build.version.release`
rom_sdk=`get_prop ro.build.version.sdk`
# device_architecture=`get_prop ro.product.cpu.abilist`
device_architecture=`get_file_prop "$SYSTEM/build.prop" "ro.product.cpu.abilist"`
device_code=`get_prop ro.product.device`
# Changes for canary
build_date=`get_prop ro.flame.build_date`
build_time=`get_prop ro.flame.build_time`

[ -n "$device_architecture" ] || device_architecture=`get_prop ro.product.cpu.abi`

case "$device_architecture" in
*x86_64*) arch="x86_64"
;;
*x86*) arch="x86"
;;
*arm64*) arch="arm64"
;;
*armeabi*) arch="arm"
;;
*) arch="unknown"
;;
esac

echo ------------------------------------------------------------------- >>


$flame_log
(echo " --------------- FlameGApps Installation Logs ---------------"
echo "- Mount Point: $MOUNT_POINT"
echo "- Android Root: $ANDROID_ROOT"
echo "- Current slot: $SLOT"
echo "- Dynamic partition: $dynamic_partitions"
echo "- Flame version: $flame_android"
echo "- Flame SDK: $flame_sdk"
echo "- Flame ARCH: $flame_arch"
echo "- ROM version: $rom_version"
echo "- ROM SDK: $rom_sdk"
echo "- Device ARCH: $device_architecture ($arch)"
echo "- Device code: $device_code") >> $flame_log
cat $SYSTEM/build.prop > $build_info
cat $TMP/flame.prop >> $build_info

set_progress 0.20
sleep 1
ui_print " "
ui_print "- Android: $rom_version, SDK: $rom_sdk, ARCH: $arch"
sleep 1
if [ ! "$rom_sdk" = "$flame_sdk" ]; then
ui_print " "
ui_print "****************** WARNING *******************"
ui_print " "
ui_print "! Wrong android version detected"
sleep 0.5
ui_print "This package is for android: $flame_android only"
sleep 0.5
ui_print "Your ROM is Android: $rom_version"
sleep 0.5
ui_print " "
ui_print "******* FlameGApps Installation Failed *******"
ui_print " "
abort
fi

if [ ! "$arch" = "$flame_arch" ]; then


ui_print " "
ui_print "****************** WARNING *******************"
ui_print " "
ui_print "! Wrong device architecture detected"
sleep 0.5
ui_print "This package is for device: $flame_arch only"
sleep 0.5
ui_print "Your device is: $arch"
sleep 0.5
ui_print " "
ui_print "******* FlameGApps Installation Failed *******"
ui_print " "
abort
fi

if [ "$flame_edition" = "basic" ]; then


removal_list="$rm_list_basic"
gapps_list="$gapps_list_basic"
elif [ "$flame_edition" = "full" ]; then
removal_list="$rm_list_full"
gapps_list="$gapps_list_full"
else
ui_print " "
ui_print "****************** WARNING *******************"
ui_print " "
sleep 0.5
ui_print "! Failed to detect FlameGApps edition type"
sleep 0.5
ui_print " "
ui_print "******* FlameGApps Installation Failed *******"
ui_print " "
abort
fi

# Check available space and choose the preferred partition for gapps installation
PREFERRED_PARTITION=$SYSTEM
insufficient_space="true"
for p in $SYSTEM/system_ext $SYSTEM/product $SYSTEM; do
if check_available_space "$p"; then
insufficient_space="false"
PREFERRED_PARTITION=$p
PREFERRED_PARTITION_PREFIX="/system"
if contains "$PREFERRED_PARTITION" "/system_ext"; then
PREFERRED_PARTITION_NAME="system_ext"
elif contains "$PREFERRED_PARTITION" "/product"; then
PREFERRED_PARTITION_NAME="product"
else
PREFERRED_PARTITION_NAME="system"
PREFERRED_PARTITION_PREFIX=""
fi
break
fi
done

ui_print " "


ui_print "- Preferred partition $PREFERRED_PARTITION"
ui_print " "
ui_print "- Availabe space: $space_available KB"
(echo -e "\n- Availabe space $space_available"
echo -e "\n- Required space $space_required") >> $flame_log
if [ "$insufficient_space" = "true" ]; then
ui_print " "
ui_print "****************** WARNING *******************"
ui_print " "
sleep 0.5
ui_print "! Insufficient available space"
sleep 0.5
ui_print "Availbale space is $space_available KB"
sleep 0.5
ui_print "Space required $space_required KB"
sleep 0.5
ui_print " "
ui_print "******* FlameGApps Installation Failed *******"
ui_print " "
abort
fi

# Remove pre-installed unnecessary system apps


ui_print " "
ui_print "- Removing unnecessary system apps"
ui_print " "
set_progress 0.30
sleep 0.5
echo -e "\n- Removing $flame_edition list files" >> $flame_log
remove_fd "$removal_list"

check_gapps_config() {
for p in "$zip_dir" /sdcard; do
if [ -e "$p/flamegapps-config.txt" ] && [ ! -e $TMP/config.prop ]; then
ui_print "- GApps config detected"
ui_print " "
cp -f "$p/flamegapps-config.txt" $TMP/config.prop
cp -f $TMP/config.prop $log_dir/config.prop
chmod 0644 $TMP/config.prop
gapps_config="true"
fi
done
}

extract_and_install() {
local TYPE="$1"
local SOURCE="$2"
local FILE="$3"
unzip -o "$ZIPFILE" "tar_${TYPE}/$FILE.tar.xz" -d $TMP
tar -xf "$SOURCE/$FILE.tar.xz" -C $UNZIP_FOLDER
rm -rf $SOURCE/$FILE.tar.xz
installed_list="$installed_list\n${FILE}"
file_list="$(find "$EX_SYSTEM/" -mindepth 1 -type f | cut -d/ -f5-)"
dir_list="$(find "$EX_SYSTEM/" -mindepth 1 -type d | cut -d/ -f5-)"
for file in $file_list; do
if contains "$file" "overlay/"; then
if [ "$PREFERRED_PARTITION_NAME" = "system" ]; then
OVERLAY_DEST='product'
else
OVERLAY_DEST=$PREFERRED_PARTITION_NAME
fi
install -D "$EX_SYSTEM/${file}" "$SYSTEM/$OVERLAY_DEST/${file}"
chcon -h u:object_r:vendor_overlay_file:s0 "$SYSTEM/$OVERLAY_DEST/${file}"
chmod 0644 "$SYSTEM/$OVERLAY_DEST/${file}"
backup_file_list="$backup_file_list\n$OVERLAY_DEST/${file}"
overlay_installed="true"
else
install -D "$EX_SYSTEM/${file}" "$PREFERRED_PARTITION/${file}"
chcon -h u:object_r:system_file:s0 "$PREFERRED_PARTITION/${file}"
chmod 0644 "$PREFERRED_PARTITION/${file}"
if [ "$PREFERRED_PARTITION_NAME" = "system" ]; then
backup_file_list="$backup_file_list\n${file}"
else
backup_file_list="$backup_file_list\n${PREFERRED_PARTITION_NAME}/${file}"
fi
fi
done
for dir in $dir_list; do
if ! contains "$dir" "overlay"; then
chcon -h u:object_r:system_file:s0 "$PREFERRED_PARTITION/${dir}"
chmod 0755 "$PREFERRED_PARTITION/${dir}"
fi
done
rm -rf $UNZIP_FOLDER/*
}

install_core() {
set_progress 0.50
ui_print "- Installing Core GApps"
ui_print " "
extract_and_install "core" "$CORE_DIR" "Core"
rm -rf $CORE_DIR
}

install_gapps() {
set_progress 0.70
for g in $gapps_list; do
local gapps=""
if [ "$gapps_config" = "true" ]; then
if [ "$(get_file_prop $TMP/config.prop "$g")" -eq "1" ]; then
gapps="$g"
else
ui_print "- Skipping $g"
fi
else
gapps="$g"
fi
if [ -n "$gapps" ]; then
ui_print "- Installing $gapps"
extract_and_install "gapps" "$GAPPS_DIR" "$gapps"
fi
done
}

install_extra() {
set_progress 0.75
ui_print " "
for g in $extra_list; do
local extra=""
if [ "$(get_file_prop $TMP/config.prop "$g")" -eq "1" ]; then
extra="$g"
fi
if [ -n "$extra" ]; then
ui_print "- Installing $extra"
extract_and_install "extra" "$EXTRA_DIR" "$extra"
fi
done
}

# Check for config


check_gapps_config

# Install core gapps files


echo -e "\n- Installing core gapps files" >> $flame_log
install_core >> $flame_log

# Install gapps files


echo -e "\n- Installing gapps files" >> $flame_log
install_gapps >> $flame_log

# Install extra/optional files (gapps config necessary)


if [ "$gapps_config" = "true" ]; then
echo -e "\n- Installing extra files" >> $flame_log
install_extra >> $flame_log
fi

echo -e "\n Installation Finished " >> $flame_log


echo ----------------------------------------------------------------- >>
$flame_log

sleep 0.5
set_progress 0.80
ui_print " "
ui_print "- Performing other tasks"
# Change context of /product/overlay dir
[ "$overlay_installed" = "true" ] && chcon -h u:object_r:vendor_overlay_file:s0
"$SYSTEM/$OVERLAY_DEST/overlay"

# Check for stock cam removal


if [ "$gapps_config" = "true" ] && [ "$(get_file_prop $TMP/config.prop
"ro.remove.snap")" -eq "1" ]; then
remove_camera="true"
remove_fd "$stock_camera"
else
remove_camera="false"
fi

# Delete AOSP PackageInstaller if Google PackageInstaller is present


if contains "$installed_list" "GooglePackageInstaller"; then
google_packageinstaller="true"
remove_fd "$aosp_packageinstaller"
fi

# Delete provision and lineage setupwizard if Google SetupWizard is present


if contains "$installed_list" "SetupWizard"; then
google_setupwizard="true"
remove_fd "$provision"
remove_fd "$lineage_setup"
fi

# Delete AOSP Dialer if Google Dialer is present


if contains "$installed_list" "GoogleDialer"; then
google_dialer="true"
remove_fd "$aosp_dialer"
fi

# Delete AOSP Contacts if Google Contacts is present


if contains "$installed_list" "GoogleContacts"; then
google_contacts="true"
remove_fd "$aosp_contacts"
fi

# Delete AOSP/other Meassages if Google Messages is present


if contains "$installed_list" "GoogleMessages"; then
google_messages="true"
remove_fd "$stock_messages"
fi

# Delete AOSP Keyboard if Gboard is present


if contains "$installed_list" "GoogleKeyboard"; then
google_keyboard="true"
remove_fd "$aosp_keyboard"
fi

# Delete stock SoundPicker if Google SoundPicker is present


if contains "$installed_list" "SoundPickerGoogle"; then
google_soundpicker="true"
remove_fd "$stock_soundpicker"
fi

# Install addon.d script


if [ -d $SYSTEM/addon.d ]; then
rm -rf $SYSTEM/addon.d/69-flame.sh
if [ "$gapps_config" = "true" ] && [ "$(get_file_prop $TMP/config.prop
"ro.skip.backup_script")" -eq "1" ]; then
echo -e "\nSkipping addon.d script installation" >> $flame_log
else
echo -e "\nInstalling addon.d script" >> $flame_log
echo '#!/sbin/sh
#
# ADDOND_VERSION=2
#
# /system/addon.d/69-flame.sh
#
. /tmp/backuptool.functions

rm_list="' > $temp_backup_script


if [ "$remove_camera" = "true" ]; then
echo "$stock_camera" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_packageinstaller" = "true" ]; then
echo "$aosp_packageinstaller" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_setupwizard" = "true" ]; then
echo "$provision" | sed '/^$/d' >> $temp_backup_script
echo "$lineage_setup" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_dialer" = "true" ]; then
echo "$aosp_dialer" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_contacts" = "true" ]; then
echo "$aosp_contacts" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_messages" = "true" ]; then
echo "$stock_messages" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_keyboard" = "true" ]; then
echo "$aosp_keyboard" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$google_soundpicker" = "true" ]; then
echo "$stock_soundpicker" | sed '/^$/d' >> $temp_backup_script
fi
if [ "$flame_edition" = "basic" ]; then
echo -n "$rm_list_basic" | sed '/^$/d' >> $temp_backup_script
elif [ "$flame_edition" = "full" ]; then
echo -n "$rm_list_full" | sed '/^$/d' >> $temp_backup_script
fi
echo -e '"\n\nlist_files() {
cat <<EOF' >> $temp_backup_script
echo -e "$backup_file_list" | sed '/^$/d' | sort >> $temp_backup_script
echo 'etc/flame.prop' >> $temp_backup_script
echo -e 'EOF
}\n' >> $temp_backup_script
cat $temp_backup_script > $TMP/69-flame.sh
cat $backup_script >> $TMP/69-flame.sh
cp -f $TMP/69-flame.sh $SYSTEM/addon.d/69-flame.sh
chcon -h u:object_r:system_file:s0 "$SYSTEM/addon.d/69-flame.sh"
chmod 0755 "$SYSTEM/addon.d/69-flame.sh"
fi
fi

# Create lib symlinks


if contains "$installed_list" "MarkupGoogle"; then
install -d "$PREFERRED_PARTITION/app/MarkupGoogle/lib/arm64"
ln -sfn "${PREFERRED_PARTITION_PREFIX}/$
{PREFERRED_PARTITION_NAME}/lib64/libsketchology_native.so" "$
{PREFERRED_PARTITION_PREFIX}/$
{PREFERRED_PARTITION_NAME}/app/MarkupGoogle/lib/arm64/libsketchology_native.so"
fi
if contains "$installed_list" "GoogleKeyboard"; then
install -d "$PREFERRED_PARTITION/app/LatinIMEGooglePrebuilt/lib64/arm64"
ln -sfn "${PREFERRED_PARTITION_PREFIX}/$
{PREFERRED_PARTITION_NAME}/lib64/libjni_latinimegoogle.so" "$
{PREFERRED_PARTITION_PREFIX}/$
{PREFERRED_PARTITION_NAME}/app/LatinIMEGooglePrebuilt/lib64/arm64/libjni_latinimego
ogle.so"
fi

# Update *.jar file path inside xml files


if [ ! "$PREFERRED_PARTITION_NAME" = "system" ]; then
for f in "com.google.android.dialer.support" "com.google.android.maps"
"com.google.android.media.effects"; do
replace_line $PREFERRED_PARTITION/etc/permissions/${f}.xml
"file=\"/system/framework/${f}.jar\" />" "file=\"${PREFERRED_PARTITION_PREFIX}/$
{PREFERRED_PARTITION_NAME}/framework/${f}.jar\" />"
done
fi

# Install flame.prop
rm -rf $SYSTEM/etc/flame.prop
cp -f $TMP/flame.prop $SYSTEM/etc/flame.prop
chcon -h u:object_r:system_file:s0 "$SYSTEM/etc/flame.prop"
chmod 0644 "$SYSTEM/etc/flame.prop"

exit_all;

You might also like