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

2024-04-01

在 Android 上进行 SRV 记录查找最节省资源的方法是什么,例如在 XMPP 客户端中,例如yaxim https://github.com/pfleidi/yaxim?

我知道:

  • JNDI http://docs.oracle.com/javase/tutorial/jndi/overview/index.html,它是 JavaSE 的一部分,但不是 Android 中的一部分
  • dnsjava http://www.dnsjava.org/,这增加了 800 KByte 的类文件(ProGuard 之后增加了 580 KByte,因此可能很难分离仅用于 SRV 查找所需的文件)
  • 原生工具,例如 dig,nslookup等,当静态编译时,其占用空间类似于dnsjava此外,使您的应用程序依赖于本机代码

我读过了查询 DNS 服务记录以查找主机名和 TCP/IP https://stackoverflow.com/questions/738750/querying-the-dns-service-records-to-find-the-hostname-and-tcp-ip/740226,但它只列出了 JNDI 和dnsjava.

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

Edit:提供DNSSEC验证/DANE证书查询加分。


无意中想到了这个问题。由于没有公认的答案,并且 dnsjava 已经被排除在外,所以我再次将这个问题带到 Google 并偶然发现minidns https://github.com/MiniDNS/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 大小的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 上解析 DNS SRV 记录的轻量级方法 的相关文章

  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐

  • 设计 - 从两个模型登录

    我有两个用户模型 第一个是来自远程数据库作为遗留和用于公司内部目的 员工登录 第二个是我们的公共注册和登录项目 但我想要一张登录表单 我搜索了很长时间 但有些解决方案让我感到困惑 第一个遗产看起来像 仅用于读取和身份验证 class Crm
  • 存储过程不返回数据

    我正在将脚本从 已停产的 Windows 服务器传输到我们的 Linux 服务器 我需要传输的脚本之一是与MSSQL 服务器 与服务器的连接已建立 我可以从任何表中获取 常规 数据 但是当我执行存储过程时 我没有收到任何所需的数据 程序只是
  • 打字稿中的 this 关键字。这是一个错误吗?

    我有一个成员函数 render 该函数调用类的另一个成员add any 这是片段 render collection each this add 如果我在add中使用关键字 this 则类型是window 我希望它是成员类的实例 在构造函数
  • 如何使某些 JavaFX TreeView 节点不可选择?

    我想在我的 JavaFX 中创建 文件夹 节点TreeView可展开和折叠但是不可选择 I found 这次讨论 https community oracle com thread 2346878并调查了EventFilter 但似乎没有任
  • 在 UISearchController iOS 11 上使用背景图片

    我正在实施一个UISearchController to my UITableView但我在 iOS 11 的定制方面遇到了困难 我的导航栏使用渐变图像背景 我希望搜索控制器能够匹配它 但我还没有找到设置背景图像的方法UISearchCon
  • 如何使用 AJAX 接收 JSON 文件并使用 javascript 解析它?

    我正在尝试解析 foursquare 给我的这个又长又复杂的 JSON 这是我的 AJAX 请求 ajax url https api foursquare com v2 venues explore dataType json data
  • 通用2D游戏资产和绝对节点定位

    我有一个关于通用游戏资产 and 绝对定位 of a SKNodes in Sprite Kit iOS 8 我将尝试通过如下示例来展示我的问题 想象一个2D自上而下游戏 with a SKSpriteNode它代表一座房子 一个房子有多个
  • 从我的应用程序发送电子邮件时如何避免延迟?

    我有一个小型控制台应用程序 它检查一些设置 做出一些决定 然后发送电子邮件 问题是 在我的申请完成之前 电子邮件实际上并未发送 我希望发送电子邮件的方法完成后立即发送电子邮件 最初 我只是创建了一个 MailMessage 并调用 Send
  • Caliburn.Micro 在 WPF 中拖放文件

    我已经使用 Caliburn Micro 2 0 1 创建了桌面应用程序 现在我需要添加拖放行为 用户将从 Windows 资源管理器中拖动文件 我需要获取它的路径 但是我正在搜索两天了 我没有找到任何关于如何为 Caliburn Micr
  • JPA 关系映射概念

    我有几个关于双向映射的问题 我有这些实体 员工 1 1 Parking Lot 员工 1 部门 员工 1 项目 上述关系的源实体和目标实体是什么 业主有何用ManyToOne关系 我想知道楼主是 多个实体还是一个实体 Do mappedBy
  • 如何解析一个巨大的 JSON 文件而不将其加载到内存中

    我有一个很大的 JSON 文件 2 5MB 包含大约 80000 行 它看起来像这样 a 123 b 0 26 c HUGE irrelevant object d 32 我只想为键存储整数值a b and d并忽略 JSON 的其余部分
  • 连接到 wsdl 时出错?

    I do base64string base64 encodestring s s userid passwd replace n authenticationHeader Authorization Basic s base64strin
  • Kill - 它会立即终止进程吗?

    什么是kill到底是怎么做的 我有一个父进程 它正在一个接一个地创建 100 个 作为示例 子进程 在任何孩子的工作结束时 我都会杀死孩子kill pid of child SIGKILL 我看不到ps输出 但是如果父进程出现问题并且我退出
  • Java - 获取泛型类的名称

    我有以下两个课程 class Generic
  • 为什么 React Native 中“Enter”键不触发 onKeyPress?

    我已在文本输入中添加了一个 onKeyPress 事件侦听器 以便当用户在手机键盘上单击 完成 或 转到 或 输入 时 它将调用我的 searchProducts 函数 我希望有一个 onSubmit 类型的事件侦听器选项 但无法找到类似的
  • 如何在意图中添加.apk文件

    我想在意图中添加 apk 文件 我想创建一个 共享 按钮 它将通过蓝牙或任何其他能够发送应用程序的应用程序共享整个应用程序 如果可以通过其他方式完成此操作 请告诉我 谢谢 List ApplicationInfo mAppList getP
  • 如何配置 gradle 仅使用 logback-classic 进行 Android 中的单元测试?

    我有一个使用 slf4j logback 的 Android 应用程序 Gradle 文件如下所示 compile com github tony19 logback android core 1 1 1 6 exclude group c
  • Android PreferenceFragment 找不到片段 id 的视图

    所以我正在制作一个android应用程序 我开始处理首选项 当我简单地使用 PreferenceActivity 时 一切都很完美 但是 如果我将它与 PreferenceFragment 一起使用 那么在我单击调用意图到 Settings
  • 表单身份验证添加附加信息以及 ReturnUrl

    使用表单身份验证 当应用程序需要重定向到登录页面时 是否有一个事件或任何可扩展点可以让我在重定向到登录页面之前对请求执行其他工作 我想在查询字符串中发送附加信息 这些信息可能会有所不同 因此无法将其静态嵌入到 web config 中的 l
  • 在 Android 上解析 DNS SRV 记录的轻量级方法

    在 Android 上进行 SRV 记录查找最节省资源的方法是什么 例如在 XMPP 客户端中 例如yaxim https github com pfleidi yaxim 我知道 JNDI http docs oracle com jav