【问题标题】:Lightweight way to resolve DNS SRV records on Android在 Android 上解析 DNS SRV 记录的轻量级方法
【发布时间】:2013-01-17 15:56:10
【问题描述】:

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

我知道:

  • JNDI,它是 JavaSE 的一部分,但不在 Android 中
  • dnsjava,添加了 800 KB 的类文件(ProGuard 之后是 580 KB,因此可能很难分离 SRV 查找所需的文件)
  • 原生工具,如 dig、nslookup 等,在静态编译时,其占用空间类似于 dnsjava,此外还使您的应用依赖原生代码

我看过Querying the DNS service records to find the hostname and TCP/IP,但它只列出了JNDI和dnsjava

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

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

【问题讨论】:

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

标签: android dns srv


【解决方案1】:

偶然发现了这个问题。由于没有公认的答案,并且 dnsjava 已经被排除在外,因此我再次将这个问题提交给谷歌并偶然发现了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 大小的影响。

【讨论】:

    【解决方案2】:

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

    Java DNS Lookup for SRV records

    答案是使用外部库(最新版本,截至撰写本文时的 2015 年 2 月),大小约为 310KB,并在 BSD 许可下。您可以在http://www.dnsjava.org/download/ 找到它。这一切都在一个 JAR 中,自 1999 年以来就已发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2010-11-14
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多