Облегченный способ разрешения записей 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 года.