偶然发现了这个问题。由于没有公认的答案,并且 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 大小的影响。