NoRoot Firewall v4.0.2版本的 MD5 值为:65ececf86f2a47bb27bef1872f52b654
以下内容为反编译后的 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 str) {
AddressCache.AddressCacheEntry addressCacheEntry;
synchronized (this.lock) {
addressCacheEntry = this.ip2name.get(str);
}
return addressCacheEntry;
}
public void startResolver(final String str, final ResolveNameResult resolveNameResult) {
new Thread(new Runnable() {
@Override
public void run() {
String[] strArr = new String[1];
int i = DnsCache.getnameinfo(str, strArr);
String str2 = null;
if (i == 0) {
str2 = strArr[0];
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putValid(str, str2);
}
} else if (i == 1) {
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putNxDomain(str);
}
} else if (DnsCache.getnameinfo("8.8.8.8", strArr) == 0) {
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putNxDomain(str);
}
} else {
synchronized (DnsCache.this.lock) {
DnsCache.this.ip2name.putError(str);
}
}
resolveNameResult.onFinish(str, str2);
}
}).start();
}
public AddressCache.AddressCacheEntry resolveNameFromIpForUiThread(String str, final ResolveNameResult resolveNameResult) {
AddressCache.AddressCacheEntry resolveNameFromIpPeek = resolveNameFromIpPeek(str);
if (resolveNameFromIpPeek != null) {
return resolveNameFromIpPeek;
}
final Handler handler = new Handler();
startResolver(str, new ResolveNameResult(this) {
@Override
public void onFinish(final String str2, final String str3) {
handler.post(new Runnable() {
@Override
public void run() {
resolveNameResult.onFinish(str2, str3);
}
});
}
});
return null;
}
}