在Android上进行SRV记录查找的资源效率最高的方法是什么,例如在像yaxim这样的XMPP客户端中?
我知道:
我已阅读Querying the DNS service records to find the hostname and TCP/IP,但它只列出了JNDI和dnsjava。
我肯定不是第一个遇到这个问题的人,Java中必须有一些轻量级的DNS SRV解析器: - )
编辑:提供DNSSEC验证/ DANE证书查询的奖励积分。
答案 0 :(得分:1)
这可能有点晚了,但是对这个问题的引用可能有所帮助:
Java DNS Lookup for SRV records
使用外部库(最新版本,截至2015年2月)的答案大约是310KB,并且在BSD许可下。您可以在http://www.dnsjava.org/download/找到它。这一切都在一个JAR内,并且自1999年以来一直在发布。
答案 1 :(得分:0)
偶然发现了这个问题。由于没有可接受的答案,并且dnsjava已经被排除在问题之外,因此,我再次将这个问题带到Google并偶然发现了minidns。它支持DNSSEC,带有一个用于查询SRV记录的单独API,并且我成功地将其与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大小的影响。