Drive document-start/end/idle from an in-page bootstrap instead of WebViewClient finished callbacks, and expand the GM prelude with a real GM_info object, GM_addElement, menu commands, and common stubs/aliases. Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
3.9 KiB
Bash
Executable file
84 lines
3.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
SRC="${ROOT_DIR}/sources/script-runtime/com/mycompany/app/script/ScriptRuntime.java"
|
|
STUBS="${ROOT_DIR}/sources/script-runtime/stubs"
|
|
OUT_SMALI="${ROOT_DIR}/app/smali_classes3/com/mycompany/app/script"
|
|
TOOLS="${ROOT_DIR}/tools"
|
|
ANDROID_HOME="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-${HOME}/android-sdk}}"
|
|
ANDROID_JAR="$(ls -1 "${ANDROID_HOME}/platforms"/android-*/android.jar 2>/dev/null | sort -V | tail -1)"
|
|
D8="$(find "${ANDROID_HOME}/build-tools" -name d8 -type f 2>/dev/null | sort -V | tail -1)"
|
|
DEX_TOOLS_ZIP="${TOOLS}/dex-tools-v2.4.zip"
|
|
DEX_TOOLS_DIR="${TOOLS}/dex-tools-v2.4"
|
|
BAKSMALI_JAR="${TOOLS}/baksmali.jar"
|
|
|
|
mkdir -p "${TOOLS}" "${OUT_SMALI}"
|
|
|
|
if [[ ! -f "${ANDROID_JAR}" ]]; then
|
|
echo "error: android.jar not found" >&2
|
|
exit 1
|
|
fi
|
|
if [[ -z "${D8}" ]]; then
|
|
echo "error: d8 not found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "${DEX_TOOLS_DIR}/d2j-baksmali.sh" ]]; then
|
|
if [[ ! -f "${DEX_TOOLS_ZIP}" ]]; then
|
|
echo "Downloading dex-tools v2.4..."
|
|
curl -fsSL -o "${DEX_TOOLS_ZIP}" \
|
|
"https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip"
|
|
fi
|
|
unzip -qo "${DEX_TOOLS_ZIP}" -d "${TOOLS}"
|
|
fi
|
|
chmod +x "${DEX_TOOLS_DIR}/"*.sh "${DEX_TOOLS_DIR}/d2j_invoke.sh" 2>/dev/null || true
|
|
|
|
if [[ ! -f "${BAKSMALI_JAR}" ]]; then
|
|
echo "Downloading baksmali 2.5.2..."
|
|
curl -fsSL -o "${BAKSMALI_JAR}" \
|
|
"https://repo1.maven.org/maven2/org/smali/baksmali/2.5.2/baksmali-2.5.2.jar"
|
|
fi
|
|
|
|
STAGE="$(mktemp -d)"
|
|
cleanup() { rm -rf "${STAGE}"; }
|
|
trap cleanup EXIT
|
|
|
|
echo "Compiling ScriptRuntime.java..."
|
|
javac --release 11 -classpath "${ANDROID_JAR}" -d "${STAGE}/classes" \
|
|
"${STUBS}/com/mycompany/app/script/"*.java \
|
|
"${SRC}"
|
|
|
|
echo "Dexing..."
|
|
mkdir -p "${STAGE}/out"
|
|
"${D8}" --release --output "${STAGE}/out" \
|
|
"${STAGE}/classes/com/mycompany/app/script/ScriptRuntime.class"
|
|
|
|
echo "Disassembling to smali..."
|
|
if [[ -x "${DEX_TOOLS_DIR}/d2j-baksmali.sh" ]]; then
|
|
bash "${DEX_TOOLS_DIR}/d2j-baksmali.sh" -f -o "${STAGE}/smali" "${STAGE}/out/classes.dex"
|
|
else
|
|
java -cp "${BAKSMALI_JAR}" org.jf.baksmali.Main d "${STAGE}/out/classes.dex" -o "${STAGE}/smali"
|
|
fi
|
|
|
|
rm -f "${OUT_SMALI}"/ScriptRuntime*.smali
|
|
cp -f "${STAGE}/smali/com/mycompany/app/script/"ScriptRuntime*.smali "${OUT_SMALI}/"
|
|
# javac/d8 may attribute inherited fields to Script; APK declares them on parents.
|
|
sed -i \
|
|
-e 's|Lcom/mycompany/app/script/Script;->a:|Lcom/mycompany/app/script/ScriptId;->a:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->b:|Lcom/mycompany/app/script/ScriptId;->b:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->c:|Lcom/mycompany/app/script/ScriptCriteria;->c:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->d:|Lcom/mycompany/app/script/ScriptCriteria;->d:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->e:|Lcom/mycompany/app/script/ScriptCriteria;->e:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->f:|Lcom/mycompany/app/script/ScriptMetadata;->f:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->g:|Lcom/mycompany/app/script/ScriptMetadata;->g:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->h:|Lcom/mycompany/app/script/ScriptMetadata;->h:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->i:|Lcom/mycompany/app/script/ScriptMetadata;->i:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->j:|Lcom/mycompany/app/script/ScriptMetadata;->j:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->k:|Lcom/mycompany/app/script/ScriptMetadata;->k:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->l:|Lcom/mycompany/app/script/ScriptMetadata;->l:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->m:|Lcom/mycompany/app/script/ScriptMetadata;->m:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->n:|Lcom/mycompany/app/script/ScriptMetadata;->n:|g' \
|
|
-e 's|Lcom/mycompany/app/script/Script;->o:|Lcom/mycompany/app/script/ScriptMetadata;->o:|g' \
|
|
"${OUT_SMALI}"/ScriptRuntime*.smali
|
|
echo "Wrote $(ls "${OUT_SMALI}"/ScriptRuntime*.smali | wc -l) smali file(s) to ${OUT_SMALI}"
|