Как эффективно тестировать конфигурации V2Ray/Xray в приложении для Android с помощью libv2ray?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как эффективно тестировать конфигурации V2Ray/Xray в приложении для Android с помощью libv2ray?

Сообщение Anonymous »

Я разрабатываю VPN-приложение для Android, которое извлекает и тестирует конфигурации прокси-серверов V2Ray/Xray. Мне нужно быстро найти рабочие серверы, но моя текущая реализация с использованием libv2ray.measureOutboundDelay() слишком медленная и иногда сбои.
Текущая реализация
Последовательность тестирования:
  • Загрузка конфигураций из нескольких источников (~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
}
}
}
}‍‍‍‍‍
Результат: все еще слишком медленно (~5 минут для 100 конфигураций), периодически происходят сбои.
Модель данных

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»