Легкий способ разрешить записи 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.


person ge0rg    schedule 02.02.2013    source источник
comment
@geOrg Вы когда-нибудь находили ответ на свой вопрос? Я хотел бы сделать что-то подобное. До сих пор я обнаружил, что использование кода из библиотеки C, такой как res_query, также не работает на Android.   -  person GrandAdmiral    schedule 12.08.2014
comment
@GrandAdmiral Извините, от меня пока нет новостей. Однако сейчас я увеличиваю свои требования с помощью DNSSEC/DANE ;-)   -  person ge0rg    schedule 13.08.2014


Ответы (2)


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

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

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

person Nick    schedule 21.07.2016

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

В моем приложении/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.

person Thomas Urban    schedule 28.09.2019