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;
    }
}