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

时间:2013-02-02 11:41:23

标签: android dns srv

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

我知道:

  • JNDI,它是JavaSE的一部分,但不是Android
  • dnsjava,它增加了800 KB的类文件(在ProGuard之后为580KByte,因此可能很难将SRV查找所需的文件分开)
  • 本机工具,如dig,nslookup等,当静态编译时,其占用空间类似于dnsjava,此外还会使您的应用程序依赖于本机代码

我已阅读Querying the DNS service records to find the hostname and TCP/IP,但它只列出了JNDI和dnsjava。

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

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

2 个答案:

答案 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大小的影响。