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