6.7.0 - Alpha21 - Fine tuning

This commit is contained in:
SuperMonster003
2026-02-24 21:00:46 +08:00
parent 427c671f1c
commit e5c4e9ac8c
11 changed files with 126 additions and 42 deletions

View File

@@ -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 وصفحة الوثائق بواسطة شريط التنقل",
"في بعض الصفحات قد يؤدي النقر على أزرار شريط الأدوات إلى تفعيل حدث النقر على العنوان بالخطأ",
"السطور الفارغة في محرّر الشيفرة تظهر كرموز مربّعة على بعض الأجهزة (حل مؤقت)",
"على بعض الاجهزة، كانت الاسطر الفارغة في محرر الشفرة تظهر كمربعات; اصلاح تجريبي",
"مربع حوار لوحة الألوان في إعداد لون السمة قد يتراكم بلا حدود",
"زر رفع الصوت لا يوقف جميع السكربتات عند تعطيل خدمة الوصول",
"تداخل لوحة المفاتيح عند تحرير بث مخصّص في صفحة المهام المجدولة",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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 が入力エリアを覆う問題を修正",

View File

@@ -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가 입력 영역을 덮는 문제 수정",

View File

@@ -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 перекрывал ввод при редактировании пользовательского широковещательного сообщения в расписании задач",

View File

@@ -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 <version>...</version>.
* zh-CN: 最小解析器: 提取 <version>...</version>.
*
* @param {string} xml
*/
function extractVersionsFromMavenMetadataXml(xml) {
const versions = [];
const re = /<version>\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',
});

View File

@@ -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 <T> 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())

View File

@@ -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<ToastTask>(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)
}

View File

@@ -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)

View File

@@ -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