在Android上解析DNS SRV记录的轻量级方法
在Android上进行SRV记录查找的资源效率最高的方法是什么,例如在XMPP客户端中 我知道:在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
- ,它是JavaSE的一部分,但不在Android中
- ,这将添加800 KB的类文件(ProGuard之后为580KB,因此可能很难分离仅用于SRV查找的文件)
- 本机工具,如dig、
等,静态编译时,其占用空间类似于nslookup
,此外还使应用程序依赖于本机代码dnsjava
编辑:提供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”来增加我的需求;-)