Облегченный способ разрешения записей DNS SRV на Android

Каков наиболее эффективный способ поиска записей SRV на Android, например, в клиенте XMPP, таком как yaxim?

Я знаю о:

  • JNDI, который является частью JavaSE, но не в Android
  • dnsjava, который добавляет 800 КБ файлов классов (580 КБ после ProGuard, поэтому, вероятно, будет сложно разделить файлы, необходимые только для поиска SRV)
  • нативные инструменты, такие как dig, nslookup и т. д., которые при статической компиляции занимают место, похожее на dnsjava, и, кроме того, делают ваше приложение зависимым от нативного кода

Я прочитал Запрос записей службы DNS, чтобы найти имя хоста и TCP / IP, но в нем перечислены только JNDI и dnsjava.

Конечно, я не первый, кто столкнулся с этой проблемой, и в Java должен быть какой-то облегченный преобразователь DNS SRV:-)

Изменить: бонусные баллы за предоставление проверки DNSSEC / запрос сертификата DANE.

1 ответ

Наткнулся на этот вопрос. Поскольку не было принятого ответа и вопрос о dnsjava был как бы исключен, я уже снова отправил этот вопрос в Google и наткнулся на мини-серверы. Он поддерживает DNSSEC, поставляется с отдельным API для запроса записей SRV, и мне удалось интегрировать его с прототипом приложения Android.

В моем app/build.gradle я добавлял это:

dependencies {
    implementation "org.minidns:minidns-hla:0.3.2"
}

После этого я смог реализовать такой запрос с помощью Kotlin:

package com.example.app

import android.os.AsyncTask
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

import kotlinx.android.synthetic.main.activity_main.*
import android.util.Log
import org.minidns.hla.ResolverApi
import java.io.IOException


class MainActivity : AppCompatActivity() {
    private val serviceName = "_mysrv._tcp.example.com"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        FetchSrvRecord().execute(serviceName)
    }

    inner class FetchSrvRecord() : AsyncTask<String, Int, String>() {
        override fun doInBackground(names: Array<String>): String {
            try {
                val result = ResolverApi.INSTANCE.resolveSrv(names[0])
                if (result.wasSuccessful()) {
                    val srvRecords = result.sortedSrvResolvedAddresses
                    for (record in srvRecords) {
                        return "https://" + record.srv.target.toString()
                    }
                }
            } catch (e: IOException) {
                Log.e("PoC", "failed IO", e)
            } catch (e: Throwable) {
                Log.e("PoC", "failed", e)
            }

            return "https://example.com"
        }

        override fun onPostExecute(url: String) {
            super.onPostExecute(url);

            Log.d("PoC", "got $url");
        }
    }
}

Я не так хорошо знаком с Java/Android, я не мог найти явно доступного файла в качестве результата компиляции этой библиотеки, поэтому не могу сказать, как библиотека влияет на размер вашего apk.

Это может быть немного поздно, но может помочь ссылка на этот вопрос:

Java DNS Lookup для записей SRV

Ответ там - использование внешней библиотеки (самая последняя версия, февраль 2015 года на момент написания статьи), около 310 КБ, и под лицензией BSD. Вы можете найти его на http://www.dnsjava.org/download/. Все это входит в один JAR и выпускается с 1999 года.

Другие вопросы по тегам