Packet Capture v1.4.7版本的 MD5 值为:edce2fbbf748df1d1d0ca3d6f00c9bc3
以下内容为反编译后的 DnsCache.java 源代码,内容仅作参考
package app.greyshirts.firewall.cache;
import android.os.Handler;
import app.greyshirts.firewall.cache.AddressCache;
public class DnsCache {
private static final DnsCache instance = new DnsCache();
private final Object lock = new Object();
private final AddressCache ip2name = new AddressCache();
public interface ResolveNameResult {
void onFinish(String str, String str2);
}
public static native int getnameinfo(String str, String[] strArr);
static {
System.loadLibrary("core");
}
public static DnsCache getInstance() {
return instance;
}
private DnsCache() {
}
public AddressCache.AddressCacheEntry resolveNameFromIpPeek(String ip) {
AddressCache.AddressCacheEntry addressCacheEntry;
synchronized (this.lock) {
addressCacheEntry = this.ip2name.get(ip);
}
return addressCacheEntry;
}
public void startResolver(final String ip, final ResolveNameResult listener) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String name;
String[] result = new String[1];
int ret = DnsCache.getnameinfo(ip, result);
switch (ret) {
case 0:
name = result[0];
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putValid(ip, name);
}
listener.onFinish(ip, name);
return;
case 1:
name = null;
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putNxDomain(ip);
}
listener.onFinish(ip, name);
return;
default:
int ret2 = DnsCache.getnameinfo("8.8.8.8", result);
if (ret2 == 0) {
name = null;
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putNxDomain(ip);
}
} else {
name = null;
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putError(ip);
}
}
listener.onFinish(ip, name);
return;
}
}
});
thread.start();
}
public AddressCache.AddressCacheEntry resolveNameFromIpForUiThread(String ip, final ResolveNameResult listener) {
AddressCache.AddressCacheEntry name = resolveNameFromIpPeek(ip);
if (name == null) {
final Handler handler = new Handler();
startResolver(ip, new ResolveNameResult() {
@Override
public void onFinish(final String ip2, final String name2) {
handler.post(new Runnable() {
@Override
public void run() {
listener.onFinish(ip2, name2);
}
});
}
});
return null;
}
return name;
}
}