在Android上解析DNS SRV记录的轻量级方法

在Android上解析DNS SRV记录的轻量级方法,android,dns,srv,Android,Dns,Srv,在Android上进行SRV记录查找的资源效率最高的方法是什么,例如在XMPP客户端中 我知道: ,它是JavaSE的一部分,但不在Android中 ,这将添加800 KB的类文件(ProGuard之后为580KB,因此可能很难分离仅用于SRV查找的文件) 本机工具,如dig、nslookup等,静态编译时,其占用空间类似于dnsjava,此外还使应用程序依赖于本机代码 我已经读过了,但它只列出了JNDI和dnsjava 当然,我不是第一个遇到这个问题的人,Java中一定有一些轻量级DNS

在Android上进行SRV记录查找的资源效率最高的方法是什么,例如在XMPP客户端中

我知道:

  • ,它是JavaSE的一部分,但不在Android中
  • ,这将添加800 KB的类文件(ProGuard之后为580KB,因此可能很难分离仅用于SRV查找的文件)
  • 本机工具,如dig、
    nslookup
    等,静态编译时,其占用空间类似于
    dnsjava
    ,此外还使应用程序依赖于本机代码
我已经读过了,但它只列出了JNDI和dnsjava

当然,我不是第一个遇到这个问题的人,Java中一定有一些轻量级DNS SRV解析器:-)


编辑:提供DNSSEC验证/DANE证书查询的奖励积分。

这可能有点晚了,但参考此问题可能会有所帮助:


答案是使用外部库(最新版本,截至本文撰写之时为2015年2月),大约为310KB,并且在BSD许可证下。你可以在。它都放在一个罐子里,从1999年开始发行。

在这个问题上结结巴巴。由于没有被接受的答案,dnsjava已经被排除在问题之外,我再次把这个问题带到谷歌,然后绊倒了。它支持DNSSEC,带有一个用于查询SRV记录的单独API,我成功地将其与Android应用程序原型集成

在我的app/build.gradle中,我添加了以下内容:

依赖项{
实现“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");
        }
    }
}
package com.example.app
导入android.os.AsyncTask
导入android.os.Bundle
导入androidx.appcompat.app.appcompat活动
导入kotlinx.android.synthetic.main.activity\u main*
导入android.util.Log
导入org.minidns.hla.ResolverApi
导入java.io.IOException
类MainActivity:AppCompatActivity(){
private val serviceName=“\u mysrv.\u tcp.example.com”
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
FetchSrvRecord().execute(serviceName)
}
内部类FetchSrvRecord():AsyncTask(){
重写fun doInBackground(名称:数组):字符串{
试一试{
val result=ResolverApi.INSTANCE.resolveSrv(名称[0])
if(result.wasuccessful()){
val srvRecords=result.sortedsrvrresolvedAddress
用于(在srvRecords中记录){
返回“https://”+record.srv.target.toString()
}
}
}捕获(e:IOException){
Log.e(“PoC”,“失败IO”,e)
}捕获(e:可丢弃){
Log.e(“PoC”,“失败”,e)
}
返回“https://example.com"
}
重写onPostExecute(url:String){
super.onPostExecute(url);
Log.d(“PoC”,“got$url”);
}
}
}

我对Java/Android不太熟悉。显然,在编译该库时,我找不到任何可用的文件作为输出,因此无法判断该库对apk大小的影响。

@geOrg你找到过你问题的答案吗?我想做类似的事情。“到目前为止,我发现使用C库中的代码(如res_query)在Android上也不起作用。”“将军,对不起,我还没有消息。”。但是,我现在通过“DNSSEC/DANE”来增加我的需求;-)