aboutsummaryrefslogtreecommitdiff
path: root/scripts/microg.sh
blob: 6b4bed813dc60f643c59d8f0348bc85ac259ccc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash

if [ "$#" -lt 2 ]; then
	echo "Incorrect arguments!"
	echo "     Using: $0 <BASE_DIR> <TMP_DIR>"
	exit 1
fi

source .config

BASE_DIR=$1
TMP_DIR=$2

RES_DIR="$TMP_DIR/res/microg"
APK_RES_DIR="$TMP_DIR/res/apks"
WORK_DIR="$TMP_DIR/microg"

SYSTEM_DIR="${BASE_DIR}/system_a"
PRODUCT_DIR="${BASE_DIR}/product_a"

patch_microg() {
	echo "[i] Patching microG"

	zip -q -d "${WORK_DIR}"/GmsCore_o.apk META-INF/MANIFEST.MF
	zip -q -d "${WORK_DIR}"/GmsCore_o.apk META-INF/CERT.SF
	zip -q -d "${WORK_DIR}"/GmsCore_o.apk META-INF/CERT.RSA

	zip -q -d "${WORK_DIR}"/Phonesky_o.apk META-INF/MANIFEST.MF
	zip -q -d "${WORK_DIR}"/Phonesky_o.apk META-INF/CERT.SF
	zip -q -d "${WORK_DIR}"/Phonesky_o.apk META-INF/CERT.RSA

	zipalign 4 "${WORK_DIR}"/Phonesky_o.apk "${WORK_DIR}"/Phonesky_oz.apk
	zipalign 4 "${WORK_DIR}"/GmsCore_o.apk "${WORK_DIR}"/GmsCore_oz.apk

	apksigcopier patch "${RES_DIR}"/signatures-google/phonesky "${WORK_DIR}"/Phonesky_oz.apk "${APK_RES_DIR}"/priv-apps/Phonesky.apk
	apksigcopier patch "${RES_DIR}"/signatures-google/gms "${WORK_DIR}"/GmsCore_oz.apk "${APK_RES_DIR}"/priv-apps/GmsCore.apk
}

download_latest_microg() {
	echo "[i] Downloading latest microG"

	local gmscore_url=$(curl -s "https://api.github.com/repos/microg/GmsCore/releases/latest" | jq -r '[ .assets[] | select( .browser_download_url | test("com.google.android.gms.(\\d+).apk$")?) ]' | jq -r ".[] | .browser_download_url")
	local phonesky_url=$(curl -s "https://api.github.com/repos/microg/GmsCore/releases/latest" | jq -r '[ .assets[] | select( .browser_download_url | test("com.android.vending.(\\d+).apk$")) ]' | jq -r ".[] | .browser_download_url")
	local gsfproxy_url=$(curl -s "https://api.github.com/repos/microg/GsfProxy/releases/latest" | jq  -r '[ .assets[] | select( .browser_download_url) ]' | jq -r ".[] | .browser_download_url")

	if [[ $INSTALL_SU == 1 ]]; then
		wget -q -O "${APK_RES_DIR}"/priv-apps/GmsCore.apk "$gmscore_url"
		wget -q -O "${APK_RES_DIR}"/priv-apps/Phonesky_o.apk "$phonesky_url"
	else
		wget -q -O "${WORK_DIR}"/GmsCore_o.apk "$gmscore_url"
		wget -q -O "${WORK_DIR}"/Phonesky_o.apk "$phonesky_url"
	fi

	wget -q -O "${APK_RES_DIR}"/priv-apps/GsfProxy.apk "$gsfproxy_url"
}

install_lib() {
	mkdir -p "${PRODUCT_DIR}"/priv-app/GmsCore/lib
	./utils/scripts/add_to_fs.sh product_a "lib" priv-app/GmsCore 1

	mkdir -p "${PRODUCT_DIR}"/priv-app/GmsCore/lib/arm64
	./utils/scripts/add_to_fs.sh product_a "arm64" priv-app/GmsCore/lib 1

	echo "[*] Installing microG libraries (64-bit)"

	for lib in "${RES_DIR}"/system/lib/arm64/*; do
		lib_name=$(basename "$lib")

		cp -L "${lib}" "${SYSTEM_DIR}/system/lib64/"
		cp -L "${lib}" "${PRODUCT_DIR}/priv-app/GmsCore/lib/arm64"

		./utils/scripts/add_to_fs.sh system_a "${lib_name}" system/lib64
		./utils/scripts/add_to_fs.sh product_a "${lib_name}" priv-app/GmsCore/lib/arm64

		echo -e "\t[+] ${lib}"
	done

	echo "[*] Installing microG libraries (32-bit)"

	for lib in "${RES_DIR}"/system/lib/armeabi-v7a/*; do
		lib_name=$(basename "$lib")

		cp -L "${lib}" "${SYSTEM_DIR}/system/lib/"
		./utils/scripts/add_to_fs.sh system_a "${lib_name}" system/lib

		echo -e "\t[+] ${lib}"
	done
}

install_files() {
	echo "[i] Installing microG files"

	cp -L "${RES_DIR}/permissions/priv-apps/privapp-permissions-org.microG.xml" "${PRODUCT_DIR}/etc/permissions/privapp-permissions-org.microG.xml"
	./utils/scripts/add_to_fs.sh product_a "privapp-permissions-org.microG.xml" etc/permissions
	
	cp -L "${RES_DIR}/permissions/apps/permissions-com.google.android.gms.xml" "${PRODUCT_DIR}/etc/default-permissions/permissions-com.google.android.gms.xml"
	./utils/scripts/add_to_fs.sh product_a "permissions-com.google.android.gms.xml" etc/default-permissions
	
	cp -L "${RES_DIR}/permissions/priv-apps/com.google.android.maps.xml" "${SYSTEM_DIR}/system/etc/permissions/com.google.android.maps.xml"
	./utils/scripts/add_to_fs.sh system_a "com.google.android.maps.xml" system/etc/permissions
	
	cp -L "${RES_DIR}/system/framework/com.google.android.maps.jar" "${SYSTEM_DIR}/system/framework/com.google.android.maps.jar"
	./utils/scripts/add_to_fs.sh system_a "com.google.android.maps.jar" system/framework
}

install_sync() {
	echo "[i] Installing Google Sync"

	cp -L "${RES_DIR}/permissions/apps/permissions-google-sync.xml" "${SYSTEM_DIR}/system/etc/permissions/permissions-google-sync.xml"
	./utils/scripts/add_to_fs.sh system_a "permissions-google-sync.xml" system/etc/permissions

	cp -L "${RES_DIR}/apks/apps/GoogleCalendarSyncAdapter.apk" "${APK_RES_DIR}/apps"
	cp -L "${RES_DIR}/apks/apps/GoogleContactsSyncAdapter.apk" "${APK_RES_DIR}/apps"
}

mkdir -p "$WORK_DIR"
download_latest_microg

if [[ $INSTALL_SU == 0 ]]; then
	patch_microg
else
	echo "[i] Root installation enabled. MicroG will not be patched to accept default signatures."
	sleep 1
fi

install_files
install_lib
install_sync

echo "[i] microG setup complete!"