2
0
mirror of https://gitlab.com/Nanolx/NanoDroid synced 2024-10-31 09:20:23 +00:00
NanoDroid/data/build-package.download
Christopher Roy Bratusek db1855bd05 * build-package
* allow side-loading custom APKs from  directory inside the NanoDroid tree
    * side-loading libraries is currently not supported
  * simplify functions for downloading APKs from github, gitlab, url and oepngapps
2020-09-24 21:18:43 +02:00

378 lines
10 KiB
Bash

#!/bin/bash
# Functions borrowed or derived from
# Michael Bryant / Shadow53
# https://gitlab.com/Shadow53/android-zip-builder
repo_fdroid="https://f-droid.org/repo"
repo_guardian="https://guardianproject.info/fdroid/repo"
repo_microg="https://microg.org/fdroid/repo"
repo_nanolx="https://nanolx.org/fdroid/repo"
repo_bromite="https://fdroid.bromite.org/fdroid/repo"
repo_ogapps="https://gitlab.opengapps.org/opengapps"
useragent='Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'
if [ "${BP_DEBUG}" = '1' ]; then
wget_opts="-v --show-progress"
curl_opts="-vSL"
else
wget_opts="-q"
curl_opts="-sSL"
fi
# check dependencies
for dep in gawk curl jq gzip grep; do
if ! which ${dep} &>/dev/null; then
echo "${dep} is not installed!"
exit 1
fi
done
gzip_apk () {
[ -f "${1}" ] && \
gzip -f "${1}" || \
echo "error downloading ${1}"
}
msg_download_info () {
case ${1} in
sideload)
echo -e "\nSideloading APK : ${2} ${3}"
echo " Checking SHA256 hash not supported"
;;
github)
if [ -f "${2}.gz" ]; then
echo -e "\nUpdating from GitHub : $(basename ${2})"
else echo -e "\nDownloading from GitHub : $(basename ${2})"
fi
echo " Checking SHA256 hash not supported"
;;
gitlab)
if [ -f "${2}.gz" ]; then
echo -e "\nUpdating from GitLab : $(basename ${2})"
else echo -e "\nDownloading from GitLab : $(basename ${2})"
fi
echo " Checking SHA256 hash not supported"
;;
opengapps)
if [ -f "${2}.gz" ]; then
echo -e "\nUpdating from OpenGApps : $(basename ${2}) ${3}"
else echo -e "\nDownloading from OpenGApps: $(basename ${2}) ${3}"
fi
echo " Checking SHA256 hash not supported"
;;
url)
if [ -f "${2}.gz" ]; then
echo -e "\nUpdating from URL : $(basename ${2})"
else echo -e "\nDownloading from URL : $(basename ${2})"
fi
echo " Checking SHA256 hash not supported"
;;
esac
}
download_apk_common () {
local apk_dest="${1}"
local apk_name="${2}"
local apk_url="${3}"
local msg_type="${4}"
[ -n "${5}" ] && local sdk_ver="[${5}]"
mkdir -p "${apk_dest}"
if [ -f "${sideload}/${apk_name}.apk" ]; then
msg_download_info "${msg_type}" "${apk_dest}/${apk_name}.apk" "${sdk_ver}"
cp "${sideload}/${apk_name}.apk" "${apk_dest}/${apk_name}.apk"
else
msg_download_info "${msg_type}" "${apk_dest}/${apk_name}.apk" "${sdk_ver}"
debug_download delete "${apk_dest}/${apk_name}.apk" "${apk_url}" "${apk_dest}/${apk_name}.apk"
fi
gzip_apk "${apk_dest}/${apk_name}.apk"
}
debug_download () {
case $1 in
index)
if [ "${BP_USE_WGET}" = '1' ]; then
rm -rf "$2"
debug_message normal "wget ${wget_opts} \"$3\" -O \"${2#$CWD/}\"" " "
wget ${wget_opts} -U "${useragent}" "$3" -O "$2" || error "$4"
else
debug_message normal "curl ${curl_opts} \"${2#$CWD/}\" \"$3\"" " "
curl ${curl_opts} -A "${useragent}" -o "$2" "$3" || error "$4"
fi
;;
no_delete)
if [ "${BP_USE_WGET}" = '1' ]; then
rm -rf "$2"
debug_message normal "wget ${wget_opts} \"$3\" -O \"${2#$CWD/}\""
wget ${wget_opts} -U "${useragent}" "$3" -O "$2"
else
debug_message normal "curl ${curl_opts} -SL -o \"${2#$CWD/}\" \"$3\""
curl ${curl_opts} -A "${useragent}" -o "$2" "$3"
fi
;;
delete)
if [ "${BP_USE_WGET}" = '1' ]; then
rm -rf "$2"
debug_message normal "wget ${wget_opts} \"$3\" -O \"${2#$CWD/}\""
wget ${wget_opts} -U "${useragent}" "$3" -O "$2" || rm -f "$4"
else
debug_message normal "curl ${curl_opts} -SL -o \"${2#$CWD/}\" \"$3\""
curl ${curl_opts} -A "${useragent}" -o "$2" "$3" || rm -f "$4"
fi
;;
esac
}
index_update_required () {
index_file=${1}
test ! -f ${index_file} && return 0
test $(${statx} ${index_file}) -le $(($(date +%s) - 3600)) && return 0
test "$(file -b ${index_file})" == "empty" && return 0
return 1
}
check_sha256sum () {
local input="${1}"
in_checksum=""
local ex_checksum="${2}"
case ${input} in
*.gz )
in_checksum=$(gzip -dc ${input} 2>/dev/null | ${sumsha256} | gawk '{print $1}')
;;
* )
in_checksum=$(${sumsha256} ${input} 2>/dev/null | gawk '{print $1}')
;;
esac
[[ ${in_checksum} == ${ex_checksum} ]] && return 0 || return 1
}
update_index () {
local index_jar=${1}
local index_json="$repofolder/$(basename ${index_jar} .jar).json"
local index_repo=${2}
if index_update_required ${index_json}; then
debug_download index "${index_jar}" "${index_repo}/index-v1.jar" " failed to update repo index"
unzip -q ${index_jar} index-v1.json -d "$repofolder/"
mv "$repofolder/index-v1.json" "${index_json}"
rm -f ${index_jar}
fi
}
update_indices () {
echo "+++ upating Repo Indices"
echo " ++ F-Droid"
[ ! -d "$repofolder" ] && rm -rf "$repofolder" && mkdir -p "$repofolder"
update_index "$repofolder/$(awk -F/ '{print $3}' <<< ${repo_fdroid}).index-v1.jar" "${repo_fdroid}"
echo " ++ Guardian Project"
update_index "$repofolder/$(awk -F/ '{print $3}' <<< ${repo_guardian}).index-v1.jar" "${repo_guardian}"
echo " ++ microG"
update_index "$repofolder/$(awk -F/ '{print $3}' <<< ${repo_microg}).index-v1.jar" "${repo_microg}"
echo " ++ Nanolx"
update_index "$repofolder/$(awk -F/ '{print $3}' <<< ${repo_nanolx}).index-v1.jar" "${repo_nanolx}"
echo " ++ Bromite"
update_index "$repofolder/$(awk -F/ '{print $3}' <<< ${repo_bromite}).index-v1.jar" "${repo_bromite}"
}
grab_apk_from_repo () {
case "${1}" in
fdroid )
local repo=${repo_fdroid}
local repo_p="F-Droid"
;;
guardian )
local repo=${repo_guardian}
local repo_p="Guardian Project"
;;
microg )
local repo=${repo_microg}
local repo_p="microG"
;;
nanolx )
local repo=${repo_nanolx}
local repo_p="Nanolx"
;;
bromite )
local repo=${repo_bromite}
local repo_p="Bromite"
;;
esac
local domain="$(awk -F/ '{print $3}' <<< ${repo})"
index_file="$repofolder/${domain}.index-v1.json"
local pkg_name="${2}"
if [ -z "${5}" ]; then
local apk_name="$(jq -r --arg pkg "${pkg_name}" '.packages[$pkg][0].apkName' ${index_file})"
local sha_sum="$(jq -r --arg pkg "${pkg_name}" '.packages[$pkg][0].hash' ${index_file})"
else
local apk_name="$(jq -r --arg pkg "${pkg_name}" --arg arch "${5}" '[.packages[$pkg][] | select (.nativecode[]==$arch).apkName][0]' ${index_file})"
local sha_sum="$(jq -r --arg pkg "${pkg_name}" --arg arch "${5}" '[.packages[$pkg][] | select (.nativecode[]==$arch).hash][0]' ${index_file})"
fi
case "${pkg_name}" in
com.android.webview )
local apk_dest="${appsfolder[12]}/${3}/${4}"
;;
net.osmand.plus | net.osmand.srtmPlugin.paid )
local apk_dest="${appsfolder[10]}/${3}/${4}"
;;
* )
local apk_dest="${appsfolder[2]}/${3}/${4}"
;;
esac
local apk_url="${repo}/${apk_name}"
if [ -f "${sideload}/${4}.apk" ]; then
echo -e "\nSideloading APK : ${4}.apk"
mkdir -p "${apk_dest}"
rm -f "${apk_dest}/${4}.apk.gz"
cp "${sideload}/${4}.apk" "${apk_dest}/${4}.apk"
gzip "${apk_dest}/${4}.apk"
else
if check_sha256sum "${apk_dest}/${4}.apk.gz" "${sha_sum}"; then
echo -e "\nUp-to-Date from ${repo_p} : ${4}.apk"
else echo -e "\nUpdating from ${repo_p} : ${4}.apk"
mkdir -p "${apk_dest}"
rm -f "${apk_dest}/${4}.apk.gz"
debug_download no_delete "${apk_dest}/${4}.apk" "${apk_url}"
if check_sha256sum "${apk_dest}/${4}.apk" "${sha_sum}"; then
echo " SHA256 hash of ${4}.apk is correct"
gzip "${apk_dest}/${4}.apk"
else echo -e " SHA256 hash of ${4}.apk is wrong!\
\n expected : ${sha_sum}\
\n got : ${in_checksum}"
rm -f "${apk_dest}/${4}.apk"
fi
fi
fi
}
grab_apk_from_url () {
local apk_url="${1}"
local apk_dest="${appsfolder[2]}/${2}/${3}"
download_apk_common "${apk_dest}" "${3}" "${apk_url}" url
}
grab_apk_from_github () {
[ "${BP_DEBUG}" = '1' ] && debug_message normal "curl ${curl_opts} -s -N \"https://api.github.com/repos/${1}/releases\""
local apk_url="$(curl -A "${useragent}" -s "https://api.github.com/repos/${1}/releases/latest" | jq -r '.assets[].browser_download_url')"
local apk_dest="${appsfolder[2]}/${2}/${3}"
download_apk_common "${apk_dest}" "${3}" "${apk_url}" github
}
grab_apk_from_gitlab () {
[ "${BP_DEBUG}" = '1' ] && debug_message newline "curl ${curl_opts} -s -N \"https://gitlab.com/${1}/-/tags\"" "\n"
local apk_url="$(curl -A "${useragent}" -s -N "https://gitlab.com/AuroraOSS/AuroraServices/-/tags" | tr '<' '\n' | grep -m 1 -oP '(?<=a href=").*uploads.*apk?(?=")')"
local apk_url="https://gitlab.com${apk_url}"
local apk_dest="${appsfolder[2]}/${2}/${3}"
download_apk_common "${apk_dest}" "${3}" "${apk_url}" gitlab
}
grab_apk_from_ogapps () {
case "${4}" in
19 ) local api_letter=K ;;
21 ) local api_letter=L ;;
23 ) local api_letter=M ;;
24 ) local api_letter=N ;;
26 ) local api_letter=O ;;
28 ) local api_letter=P ;;
29 ) local api_letter=Q ;;
esac
case "${1}" in
"com.google.android.syncadapters.calendar" )
# use SDK 19 Calendar Syncadapter for SDK 19
# use SDK 21 Calendar Syncadapter for SDK 21 - 29
if [ "${4}" -eq 19 ]; then
local apk_url="${repo_ogapps}/all/raw/master/${2}/${1}/15/nodpi/2015080710.apk"
else local apk_url="${repo_ogapps}/all/raw/master/${2}/${1}/21/nodpi/2016267990.apk"
fi
;;
"com.google.android.syncadapters.contacts" )
local apk_url="${repo_ogapps}/all/raw/master/${2}/${1}/${4}/nodpi/${4}.apk"
;;
"com.google.android.backuptransport" )
# Use SDK 28 Backuptransport on SDK 29 aswell
if [ "${4}" -eq 29 ]; then
local apk_url="${repo_ogapps}/all/raw/master/${2}/${1}/28/nodpi/28.apk"
else local apk_url="${repo_ogapps}/all/raw/master/${2}/${1}/${4}/nodpi/${4}.apk"
fi
;;
esac
apk_dest="${appsfolder[6]}/${api_letter}/${2}/${3}"
download_apk_common "${apk_dest}" "${3}" "${apk_url}" opengapps "${4}"
}
grab_lib_from_ogapps () {
case "${3}" in
arm | x86 ) LIBD=lib ;;
arm64 | x86_64 ) LIBD=lib64 ;;
esac
local lib_url="${repo_ogapps}/${3}/raw/master/${LIBD}/${2}/${1}"
local swp_dest="${appsfolder[8]}/${3}"
if [[ "${4}" == "true" ]]; then
local lib_dest="${swp_dest}/${1}_${2}"
else lib_dest="${swp_dest}/${1}"
fi
if [[ -f "${lib_dest}" ]]; then
echo -e "\nUpdating from OpenGApps : ${1} [${2}:${3}]"
else echo -e "\nDownloading from OpenGApps: ${1} [${2}:${3}]"
mkdir -p "${swp_dest}"
fi
echo " Checking SHA256 hash not (yet) supported"
debug_download delete "${lib_dest}" "${lib_url}" "${lib_dest}"
}
grab_patches () {
base_url="https://github.com/Lanchon/haystack/blob/master/patches"
patch_url="${base_url}/${1}?raw=true"
patch_dst="${CWD}/patcher/dexpatcher/${2}"
echo -e "\nUpdating from Haystack : ${2}"
echo " Checking SHA256 hash not (yet) supported"
debug_download delete "${patch_dst}" "${patch_url}""${patch_dst}"
}