From e5c4e9ac8c663182844b4ff1ecd497ca0cb1ecda Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Tue, 24 Feb 2026 21:00:46 +0800 Subject: [PATCH] 6.7.0 - Alpha21 - Fine tuning --- .changelog/lang_ar.json | 4 +- .changelog/lang_es.json | 4 +- .changelog/lang_fr.json | 4 +- .changelog/lang_ja.json | 4 +- .changelog/lang_ko.json | 4 +- .changelog/lang_ru.json | 4 +- .../scrape-and-inject-agp-releases-list.mjs | 105 +++++++++++++++--- .../autojs/autojs/runtime/ScriptBridges.kt | 18 ++- .../autojs/autojs/runtime/api/ScriptToast.kt | 12 +- .../runtime/api/augment/util/VersionCodes.kt | 2 +- gradle/data/agp-releases.list | 7 +- 11 files changed, 126 insertions(+), 42 deletions(-) diff --git a/.changelog/lang_ar.json b/.changelog/lang_ar.json index 210e0daf..4607fa62 100644 --- a/.changelog/lang_ar.json +++ b/.changelog/lang_ar.json @@ -25,7 +25,7 @@ "v6.6.3": { "released_date": "2025/05/27", "feature": [ - "ميزة سجل الإصدار: عرض سجلات التغيير والإحصائيات متعددة اللغات", + "ميزة سجل الاصدارات: عرض سجل التغييرات متعدد اللغات والاحصاءات", "الدالة timers.keepAlive (أصبحت عالمية) للحفاظ على بقاء السكربت نشطًا", "مستمعو الأحداث مثل engines.on('start/stop/error', callback) لأحداث المحرك العامة", "الدالة images.detectMultiColors للتحقق من ألوان متعددة النقاط _[`issue #374`](http://issues.autojs6.com/374)_", @@ -40,7 +40,7 @@ "fix": [ "قد يتم حجب بعض محتوى الوثائق عبر الإنترنت في تبويب Docs وصفحة الوثائق بواسطة شريط التنقل", "في بعض الصفحات قد يؤدي النقر على أزرار شريط الأدوات إلى تفعيل حدث النقر على العنوان بالخطأ", - "السطور الفارغة في محرّر الشيفرة تظهر كرموز مربّعة على بعض الأجهزة (حل مؤقت)", + "على بعض الاجهزة، كانت الاسطر الفارغة في محرر الشفرة تظهر كمربعات; اصلاح تجريبي", "مربع حوار لوحة الألوان في إعداد لون السمة قد يتراكم بلا حدود", "زر رفع الصوت لا يوقف جميع السكربتات عند تعطيل خدمة الوصول", "تداخل لوحة المفاتيح عند تحرير بث مخصّص في صفحة المهام المجدولة", diff --git a/.changelog/lang_es.json b/.changelog/lang_es.json index 70f9e8b7..64e167a1 100644 --- a/.changelog/lang_es.json +++ b/.changelog/lang_es.json @@ -25,7 +25,7 @@ "v6.6.3": { "released_date": "2025/05/27", "feature": [ - "Función de historial de lanzamientos: ver registros de cambios y estadísticas de lanzamientos en múltiples idiomas", + "Función de historial de versiones: ver registros de cambios multilingües y estadísticas", "Método timers.keepAlive (ahora global) para mantener activo el script", "Métodos de escucha de eventos como engines.on('start/stop/error', callback) para eventos globales del motor", "Método images.detectMultiColors para verificación de colores multipunto _[`issue #374`](http://issues.autojs6.com/374)_", @@ -40,7 +40,7 @@ "fix": [ "El contenido de la documentación en línea en la pestaña Documentos y la actividad Documentos podía quedar cubierto por la barra de navegación del sistema", "En algunas páginas, al pulsar botones de la Toolbar se podía activar por error el evento de clic en el título", - "Las líneas en blanco del editor de código mostraban caracteres de cuadro en ciertos dispositivos (solución tentativa)", + "En algunos dispositivos, las líneas en blanco del editor de código mostraban cuadros; corrección provisional", "El cuadro de diálogo del selector de colores en los ajustes de color de tema podía apilarse infinitamente", "La tecla de subir volumen no detenía todos los scripts cuando el servicio de accesibilidad estaba desactivado", "Superposición del teclado IME al editar contenido de difusión personalizado en la página de tareas programadas", diff --git a/.changelog/lang_fr.json b/.changelog/lang_fr.json index d974ce67..d5dab09e 100644 --- a/.changelog/lang_fr.json +++ b/.changelog/lang_fr.json @@ -25,7 +25,7 @@ "v6.6.3": { "released_date": "2025/05/27", "feature": [ - "Fonctionnalité d'historique des versions : visualisation des changelogs de versions multilingues et des statistiques", + "Fonction d'historique des versions : consulter le journal des changements multilingue et les statistiques", "Méthode timers.keepAlive (désormais globale) pour maintenir le script actif", "Méthodes d'écoute d'événements telles que engines.on('start/stop/error', callback) pour les événements globaux du moteur", "Méthode images.detectMultiColors pour la vérification de couleurs multipoints _[`issue #374`](http://issues.autojs6.com/374)_", @@ -40,7 +40,7 @@ "fix": [ "Le contenu de la documentation en ligne dans l'onglet Docs et l'activité Docs pouvait être recouvert par la barre de navigation système", "Sur certaines pages, cliquer sur les boutons de la Toolbar pouvait déclencher par erreur l'événement de clic sur le titre", - "Les lignes vides dans l'éditeur de code affichaient des carrés sur certains appareils (solution provisoire)", + "Sur certains appareils, les lignes vides de l'editeur de code affichaient des caracteres en forme de carre; correction tentative", "La boîte de dialogue du sélecteur de couleurs dans les paramètres de couleur du thème pouvait se superposer indéfiniment", "La touche volume + ne stoppait pas tous les scripts lorsque le service d'accessibilité était désactivé", "Chevauchement du clavier IME lors de l'édition d'un contenu de diffusion personnalisé dans la page des tâches planifiées", diff --git a/.changelog/lang_ja.json b/.changelog/lang_ja.json index 437e07f7..909de851 100644 --- a/.changelog/lang_ja.json +++ b/.changelog/lang_ja.json @@ -25,7 +25,7 @@ "v6.6.3": { "released_date": "2025/05/27", "feature": [ - "リリース履歴機能: 多言語リリース変更履歴と統計の表示", + "リリース履歴機能: 多言語の変更履歴と統計を表示", "timers.keepAlive メソッド (グローバルへ昇格) によりスクリプトの活動を維持", "engines.on('start/stop/error', callback) などのイベントリスナーでエンジンのグローバルイベントを受信", "images.detectMultiColors メソッドで複数点のカラーを検査 _[`issue #374`](http://issues.autojs6.com/374)_", @@ -40,7 +40,7 @@ "fix": [ "Docs タブおよび Docs アクティビティのオンラインドキュメントがシステムナビゲーションバーと重なる場合がある問題を修正", "一部ページで Toolbar ボタンをタップすると誤ってタイトルのクリックイベントが発火する問題を修正", - "コードエディタの空行が一部デバイスで四角形として表示される問題を修正 (暫定対応)", + "一部端末でコードエディタの空行が□表示になる問題 (暫定修正)", "テーマカラー設定のカラーピッカーダイアログが無限に重なる問題を修正", "アクセシビリティサービスが無効のときに音量アップキーが全スクリプトを停止しない問題を修正", "スケジュールタスクでユーザー定義ブロードキャストメッセージを編集する際に IME が入力エリアを覆う問題を修正", diff --git a/.changelog/lang_ko.json b/.changelog/lang_ko.json index 9fbdb532..214ccca6 100644 --- a/.changelog/lang_ko.json +++ b/.changelog/lang_ko.json @@ -25,7 +25,7 @@ "v6.6.3": { "released_date": "2025/05/27", "feature": [ - "릴리스 히스토리 기능: 다국어 릴리스 체인지로그 및 통계 보기", + "릴리스 기록 기능: 다국어 변경 로그와 통계를 보기", "timers.keepAlive 메서드 (전역으로 승격) 로 스크립트 활성 유지", "engines.on('start/stop/error', callback) 등의 이벤트 리스너로 엔진 전역 이벤트 수신", "images.detectMultiColors 메서드로 여러 지점 색상 검사 _[`issue #374`](http://issues.autojs6.com/374)_", @@ -40,7 +40,7 @@ "fix": [ "Docs 탭 및 Docs 액티비티의 온라인 문서가 시스템 네비게이션 바에 가려질 수 있는 문제 수정", "일부 페이지에서 Toolbar 버튼을 누르면 제목 클릭 이벤트가 잘못 발생하는 문제 수정", - "일부 기기에서 코드 편집기 빈 줄이 사각형 문자로 표시되는 문제 (수정 시도)", + "일부 기기에서 코드 편집기 빈 줄이 □로 표시되던 문제 (임시 수정)", "테마 색상 설정의 컬러 피커 대화상자가 무한 중첩되는 문제 수정", "접근성 서비스가 꺼진 상태에서 볼륨 업 키가 모든 스크립트를 중지하지 않는 문제 수정", "예약 작업에서 사용자 정의 브로드캐스트 메시지를 편집할 때 IME가 입력 영역을 덮는 문제 수정", diff --git a/.changelog/lang_ru.json b/.changelog/lang_ru.json index 5172c93d..2d88f54d 100644 --- a/.changelog/lang_ru.json +++ b/.changelog/lang_ru.json @@ -25,7 +25,7 @@ "v6.6.3": { "released_date": "2025/05/27", "feature": [ - "Функция истории релизов: просмотр многоязычных журналов изменений релизов и статистики", + "Функция истории релизов: просмотр многоязычных списков изменений и статистики", "Метод timers.keepAlive (теперь глобальный) для поддержания активности скрипта", "Слушатели событий, такие как engines.on('start/stop/error', callback), для глобальных событий движка", "Метод images.detectMultiColors для проверки нескольких точек цвета _[`issue #374`](http://issues.autojs6.com/374)_", @@ -40,7 +40,7 @@ "fix": [ "Онлайн-документация на вкладке Docs и в активности Docs могла перекрываться системной навигационной панелью", "На некоторых страницах нажатие кнопок Toolbar могло ошибочно вызывать событие клика по заголовку", - "Пустые строки в редакторе кода отображались квадратиками на ряде устройств (предварительное решение)", + "На некоторых устройствах пустые строки в редакторе кода отображались квадратами; пробное исправление", "Диалог выбора цвета в настройках темы мог бесконечно накладываться друг на друга", "Кнопка увеличения громкости не останавливала все скрипты при выключенной службе доступности", "IME перекрывал ввод при редактировании пользовательского широковещательного сообщения в расписании задач", diff --git a/.utils/scrape-and-inject-agp-releases-list.mjs b/.utils/scrape-and-inject-agp-releases-list.mjs index 69e1dbfe..6ba13638 100644 --- a/.utils/scrape-and-inject-agp-releases-list.mjs +++ b/.utils/scrape-and-inject-agp-releases-list.mjs @@ -1,26 +1,101 @@ // scrape-and-inject-agp-releases-list.mjs -import * as cheerio from 'cheerio'; -import { compareVersionStrings } from './utils/versioning.mjs'; +import { compareVersionStrings, compareVersionStringsDescending } from './utils/versioning.mjs'; import { getMinSupportedAgpVersion } from './utils/properties.mjs'; +import { sleep } from './utils/async.mjs'; import { updateGradleListData } from './utils/update-helper.mjs'; -const URL = 'https://developer.android.com/reference/tools/gradle-api'; +// @Hint by JetBrains AI Assistant (GPT-5.2) on Feb 23, 2026. +// ! Use Google Maven metadata instead of scraping developer.android.com to avoid frequent network timeouts. +// ! zh-CN: 使用 Google Maven 元数据替代抓取 developer.android.com, 以避免频繁的网络超时. +// # const URL = 'https://developer.android.com/reference/tools/gradle-api'; +const MAVEN_METADATA_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/maven-metadata.xml'; + +/** + * Fetch text with retry/backoff. + * zh-CN: 带重试/退避的文本拉取. + * + * @param {string | URL | Request} url + * @param attempts + * @param timeoutMs + */ +async function fetchTextWithRetry(url, { attempts = 5, timeoutMs = 60000 } = {}) { + let lastErr; + for (let i = 0; i < attempts; i++) { + const controller = new AbortController(); + const t = setTimeout(() => controller.abort(new Error(`Request timed out after ${timeoutMs}ms`)), timeoutMs); + try { + const res = await fetch(url, { + signal: controller.signal, + headers: { + // Some CDNs behave better with a UA. + // zh-CN: 某些 CDN 在带 UA 的情况下表现更稳定. + 'User-Agent': 'agp-releases-list-updater/1.0 (+nodejs)', + 'Accept': 'application/xml,text/xml,text/plain,*/*', + }, + }); + if (!res.ok) { + // noinspection ExceptionCaughtLocallyJS + throw new Error(`HTTP ${res.status} ${res.statusText}`); + } + return await res.text(); + } catch (e) { + lastErr = e; + // Exponential backoff with jitter. + // zh-CN: 带抖动的指数退避. + const backoff = Math.min(2000 * (2 ** i), 15000) + Math.floor(Math.random() * 250); + await sleep(backoff); + } finally { + clearTimeout(t); + } + } + throw lastErr; +} + +/** + * Minimal parser: extract .... + * zh-CN: 最小解析器: 提取 .... + * + * @param {string} xml + */ +function extractVersionsFromMavenMetadataXml(xml) { + const versions = []; + const re = /\s*([^<\s]+)\s*<\/version>/g; + let m; + while ((m = re.exec(xml)) !== null) { + versions.push(m[1]); + } + return versions; +} (async function main() { - const res = await fetch(URL); - const $ = cheerio.load(await res.text()); - const results = new Set(); - $('table').find('a').each((_, el) => { - const a = $(el); - const href = a.attr('href'); - if (href.includes('reference/tools/gradle-api')) { - results.add(a.text()); - } - }); + const xml = await fetchTextWithRetry(MAVEN_METADATA_URL); + + const versions = extractVersionsFromMavenMetadataXml(xml); + const minSupportedVersion = getMinSupportedAgpVersion(); - const agpList = new Set(Array.from(results).filter(v => compareVersionStrings(v, minSupportedVersion) >= 0)); - await updateGradleListData('agp-releases', agpList, { + const agpListAll = new Set(versions.filter(v => compareVersionStrings(v, minSupportedVersion) >= 0)); + const agpListMajor = new Map(); + + const rex = /^(\d+\.\d+)\.(\d+.*)$/ + for (let v of agpListAll) { + const matched = rex.exec(v); + if (!matched) { + continue; + } + const major = matched[1]; + if (!agpListMajor.has(major)) { + agpListMajor.set(major, v); + } else { + if (compareVersionStrings(v, agpListMajor.get(major)) > 0) { + agpListMajor.set(major, v); + } + } + } + + const agpListFinal = new Set([...agpListMajor.values()].sort(compareVersionStringsDescending)); + + await updateGradleListData('agp-releases', agpListFinal, { label: 'AGP releases list', sort: 'descending.as.version', }); diff --git a/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt b/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt index 185b42b4..c049e985 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt @@ -1,5 +1,6 @@ package org.autojs.autojs.runtime +import org.autojs.autojs.annotation.ScriptInterface import org.autojs.autojs.core.automator.UiObjectCollection import org.autojs.autojs.engine.RhinoJavaScriptEngine import org.autojs.autojs.util.RhinoUtils.callFunction @@ -15,15 +16,17 @@ import org.mozilla.javascript.Undefined /** * Created by Stardust on Jul 21, 2017. - * Modified by SuperMonster003 as of May 26, 2022. * Transformed by SuperMonster003 on Nov 7, 2023. + * Modified by SuperMonster003 as of Feb 13, 2026. * * @Reference to aiselp (https://github.com/aiselp) on Nov 7, 2023. * https://github.com/kkevsekk1/AutoX/pull/529/commits/782f1c3c12dee64d9b1ad70aba462afaf60313a4#diff-b8e544bc658140f04a7fa7171cc938032f18c92495ca25bb08e2d2eb546b70f5 */ class ScriptBridges : IScriptBridges { - lateinit var engine: RhinoJavaScriptEngine + @get:ScriptInterface + var engine: RhinoJavaScriptEngine? = null + private set fun setup(engine: RhinoJavaScriptEngine) { this.engine = engine @@ -43,11 +46,11 @@ class ScriptBridges : IScriptBridges { val niceArgs = args.map { Context.javaToJS(it, niceScope) }.toTypedArray() val thisObj = Context.javaToJS(target, niceScope) as? Scriptable ?: Undefined.SCRIPTABLE_UNDEFINED - callFunction(engine.runtime, func, niceScope, thisObj, niceArgs) + callFunction(engine?.runtime, func, niceScope, thisObj, niceArgs) } override fun toArray(o: Iterable<*>?): NativeArray = useJsContext { cx -> - val scope = engine.runtime.topLevelScope + val scope = engine?.runtime?.topLevelScope ?: cx.initStandardObjects() cx.newArray(scope, o?.map { Context.javaToJS(it, scope) }?.toTypedArray()) as NativeArray } @@ -72,12 +75,15 @@ class ScriptBridges : IScriptBridges { override fun toString(obj: Any?): String = Context.toString(obj) - override fun toPrimitive(obj: Any?): Any? = - Context.javaToJS(obj, engine.runtime.topLevelScope) + override fun toPrimitive(obj: Any?): Any? = useJsContext { cx -> + val scope = engine?.runtime?.topLevelScope ?: cx.initStandardObjects() + Context.javaToJS(obj, scope) + } private fun useJsContext(f: (Context) -> T): T { val currentContext = Context.getCurrentContext() return try { + val engine = engine ?: return f(Context.enter()) // Enter Context via engine to ensure WrapFactory and AutoJsContext binding are installed. // zh-CN: 通过 engine 进入 Context, 确保 WrapFactory 与 AutoJsContext 绑定已安装. f(currentContext ?: engine.enterContext()) diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/ScriptToast.kt b/app/src/main/java/org/autojs/autojs/runtime/api/ScriptToast.kt index fb02ebcb..6b82272c 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/ScriptToast.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/ScriptToast.kt @@ -24,7 +24,7 @@ import java.util.ArrayDeque */ object ScriptToast { - private const val MAX_GLOBAL_QUEUE_SIZE = 17 + private const val MAX_GLOBAL_QUEUE_SIZE = 32 private val mainHandler = Handler(Looper.getMainLooper()) private val queue = ArrayDeque(MAX_GLOBAL_QUEUE_SIZE) @@ -56,13 +56,15 @@ object ScriptToast { return } + val task = ToastTask(message, duration, ownerId) + if (queue.size >= MAX_GLOBAL_QUEUE_SIZE) { - // Discard newest task when the queue is full. - // zh-CN: 当队列已满时丢弃最新任务. - return + // Keep newest: discard oldest when queue is full. + // zh-CN: 保留最新: 队列满时丢弃最旧任务. + queue.removeFirstOrNull() } - queue.addLast(ToastTask(message, duration, ownerId)) + queue.addLast(task) tryShowNextLocked(context.applicationContext) } diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt index 06234008..9088219d 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/augment/util/VersionCodes.kt @@ -113,7 +113,7 @@ object VersionCodes : Augmentable() { val (_, month, day, year) = it.groupValues "$year,${monthMap[month.lowercase().slice(0..2)]!!.minus(1)},$day" } - val (year, month, day) = replaceFullDate.split(',').map { it.toInt() } + val (year, month, day) = replaceFullDate.split(',').map { it.toIntOrNull() ?: return@parseTimestamp 0 } return Calendar.getInstance().apply { clear() set(year, month, day) diff --git a/gradle/data/agp-releases.list b/gradle/data/agp-releases.list index 730c7cbf..ed595ee1 100644 --- a/gradle/data/agp-releases.list +++ b/gradle/data/agp-releases.list @@ -1,6 +1,7 @@ -#Tue Jan 27 22:23:42 GMT+8 2026 -9.1.0-alpha06 -9.0.0 +#Tue Feb 24 20:06:12 GMT+8 2026 +9.2.0-alpha01 +9.1.0-rc01 +9.0.1 8.13.2 8.12.3 8.11.2