Текущая реализация
Последовательность тестирования:
- Загрузка конфигураций из нескольких источников (~100-150) configs)
- Проанализируйте и проверьте их
- Протестируйте каждую конфигурацию с помощью Libv2ray.measureOutboundDelay()
- Верните рабочие конфигурации, отсортированные по пингу
- Медленно: Тестирование 100 configs занимает более 5 минут
- Сбои: OutOfMemoryError при параллельном тестировании множества конфигураций
- Тайм-аут: Для тестирования некоторых конфигураций требуется более 10 секунд
- Ресурсоемкость: несколько экземпляров Xray работают одновременно
Подход 1: параллельное тестирование с помощью сопрограмм
Код: Выделить всё
class RealPingTester(private val context: Context) {
companion object {
private const val TEST_URL = "http://www.gstatic.com/generate_204"
private const val MAX_PARALLEL_TESTS = 10
}
suspend fun testConfigsRealPing(
configs: List,
onProgress: (tested: Int, total: Int) -> Unit
): List = coroutineScope {
val semaphore = Semaphore(MAX_PARALLEL_TESTS)
configs.map { config ->
async(Dispatchers.IO) {
semaphore.withPermit {
val delay = realPing(config)
if (delay > 0 && delay < 8000) {
config.copy(
ping = delay.toInt(),
isWorking = true
)
} else {
null
}
}
}
}.awaitAll().filterNotNull()
}
private suspend fun realPing(profile: ProfileItem): Long {
return withContext(Dispatchers.IO) {
try {
// Generate V2Ray JSON config
val config = ProfileItemManager.generateProfileItem(profile)
// Test using libv2ray
val delay = withTimeoutOrNull(8000L) {
Libv2ray.measureOutboundDelay(config, TEST_URL)
} ?: -1L
delay
} catch (e: Exception) {
-1L
}
}
}
}
Модель данных
Код: Выделить всё
data class ProfileItem(
val configType: ConfigType, // VMESS, VLESS, TROJAN, SHADOWSOCKS
val server: String,
val serverPort: String,
val password: String, // UUID for VMess/VLESS, password for others
// Transport settings
val network: String? = null, // tcp, ws, grpc, etc.
val security: String? = null, // tls, reality, none
val path: String? = null,
val host: String? = null,
// Test results
var ping: Int = 0,
var isWorking: Boolean = false,
var lastTested: Long = 0
)
Какова наилучшая стратегия для эффективного тестирования более 100+ конфигураций прокси?
Следует ли мне сначала использовать TCP ping, а затем настоящий тест?
Сколько конфигураций я должен тестировать параллельно без сбоев?
Каков оптимальный тайм-аут для измерения OutboundDelay()?
Как v2rayNG тестирует конфигурации таким образом быстро?
Кажется, они тестируют десятки конфигураций за секунды
Есть ли лучший API libv2ray, который мне не хватает?
Используют ли они другой подход?
Есть ли альтернативы измерению OutboundDelay()?
Могу ли я протестировать несколько конфигураций с помощью одного экземпляра Xray?
Должен ли я вместо этого реализовать собственное тестирование соединения?
Существует ли в нем API пакетного тестирования libv2ray?
Управление памятью:
Как предотвратить ошибку OutOfMemoryError при тестировании большого количества конфигураций?
Следует ли тестировать меньшими партиями?
Как правильно очищать экземпляры Xray?
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-libv2ray
Мобильная версия