新塘做網(wǎng)站東莞有哪些做推廣的網(wǎng)站
需求:
如果存在用戶配置的DNS服務(wù)器,則切面攔截運(yùn)行商下發(fā)的DNS,替換為用戶自己配置的DNS.
實(shí)現(xiàn):
直接上代碼:
1:TelephonyProperties 內(nèi)新增屬性保存用戶設(shè)置的dns
//QSSI.13/frameworks/base/telephony/java/com/android/internal/telephony/TelephonyProperties.java/*** PROPERTY_SIM_DEFAULT_DNS is to set the default DNS*/static String PROPERTY_SIM_DEFAULT_DNS = "sim.default.dns";
這里我們注意下TelephonyProperties 為接口類,系統(tǒng)未找到相關(guān)的實(shí)現(xiàn)類,其實(shí)此處的用法類似于aidl文件到j(luò)ava文件的轉(zhuǎn)換,是編譯腳本進(jìn)行轉(zhuǎn)換(build/soong/sysprop/sysprop_library.go)
即會將libsysprop目錄下的.sysprop文件編譯成對應(yīng)的.jar給系統(tǒng)調(diào)用,即會編譯為:PlatformProperties.jar,我們可以把以下目錄中的源碼文件拖到AS看下
目錄:QSSI.13\out\soong\.intermediates\system\libsysprop\srcs\PlatformProperties\android_common\javac\PlatformProperties.jar
我們截取部分TelephonyProperties.class代碼看下
public static Optional<Boolean> airplane_mode_on() {String value = SystemProperties.get("persist.radio.airplane_mode_on");return Optional.ofNullable(tryParseBoolean(value));
}public static void airplane_mode_on(Boolean value) {SystemProperties.set("persist.radio.airplane_mode_on", value == null ? "" : (value ? "1" : "0"));
}
從這個(gè)反編譯出來的文件可以看到,實(shí)際上就是對SystemProperties做了一層封裝。
2:在TelephonyProperties.sysprop 中定義屬性
//QSSI.13/system/libsysprop/srcs/android/sysprop/TelephonyProperties.sysprop
# set default dns list
prop {api_name: "sim_default_dns"type: StringListscope: Publicaccess: ReadWriteprop_name: "sim.default.dns"
}
注意我們新增了屬性,需要執(zhí)行如下指令,更新api文件,具體的詳見腳本文件:/build/soong/scripts/freeze-sysprop-api-files.sh
m PlatformProperties-dump-api && rm -rf system/libsysprop/srcs/api/PlatformProperties-current.txt && cp -f out/soong/.intermediates/system/libsysprop/srcs/PlatformProperties_sysprop_library/api-dump.txt system/libsysprop/srcs/api/PlatformProperties-current.txt
執(zhí)行上述指令以后會更新如下文件
//QSSI.13/system/libsysprop/srcs/api/PlatformProperties-current.txt
prop {api_name: "sim_default_dns"type: StringListaccess: ReadWriteprop_name: "sim.default.dns"}
3:我們新增了屬性為sim.default.dns,我們還需要增加selinux權(quán)限,即為此屬性配置上下文,可直接使用之前系統(tǒng)定義好的上下文
//QSSI.13/system/sepolicy/private/property_contexts
sim.default.dns u:object_r:telephony_status_prop:s0 exact string
//QSSI.13/system/sepolicy/prebuilts/api/33.0/private/property_contexts
sim.default.dns u:object_r:telephony_status_prop:s0 exact string
4:經(jīng)過上述步驟,我們即可在TelephonyManager內(nèi)對屬性sim.default.dns進(jìn)行讀寫
//QSSI.13/frameworks/base/telephony/java/android/telephony/TelephonyManager.java/*** Set TelephonyProperties.default_dns for dns.** @hide*/public void setSimDnsServers(int phoneId, String dnsStr) {if (SubscriptionManager.isValidPhoneId(phoneId)) {List<String> newList = new ArrayList();if (!TextUtils.isEmpty(dnsStr)) {List<String> tList = updateTelephonyProperty(TelephonyProperties.sim_default_dns(), phoneId, dnsStr);newList.addAll(tList);}for (int i = 0; i < newList.size(); i++) {Log.e(TAG, "setSimDns...." + newList.get(i));}Log.e(TAG, "setSimDnsList...." + dnsStr + ":" + newList);TelephonyProperties.sim_default_dns(newList);}}/*** get TelephonyProperties.default_dns** @hide*/public String getSimDnsServers(int phoneId) {return getTelephonyProperty(phoneId, TelephonyProperties.sim_default_dns(), "");}
5:我們在建立datacall的時(shí)候,就可以讀取配置的dns服務(wù)器,然后更新,我是在DataNetwork 中處理的,當(dāng)然也可以在ConnectivityService內(nèi)處理
//QSSI.13/frameworks/opt/telephony/src/java/com/android/internal/telephony/data/DataNetwork.java/*** Update data network based on the latest {@link DataCallResponse}.** @param response The data call response from data service.*/private void updateDataNetwork(@NonNull DataCallResponse response) {.......//phoebe add for set default dns// Set DNS serversList<InetAddress> defaultDns = getDefaultDns(mPhone.getPhoneId());if (defaultDns != null && defaultDns.size() > 0) {loge("set default dns:" + defaultDns);linkProperties.setDnsServers(defaultDns);} else {if (response.getDnsAddresses().size() > 0) {for (InetAddress dns : response.getDnsAddresses()) {if (!dns.isAnyLocalAddress()) {linkProperties.addDnsServer(dns);}}} else {loge("Empty dns response");}}....}public List<InetAddress> getDefaultDns(int phoneId) {String dnsStr = mTelephonyManager.getSimDnsServers(phoneId);logl("zmm add for getDefaultDns..." + dnsStr);String[] split = TextUtils.isEmpty(dnsStr) ? null : dnsStr.trim().split(",");if (split == null || split.length == 0) {return null;}List<InetAddress> dnsService = new ArrayList<>();try {for (String str : split) {if (!str.trim().isEmpty()) {InetAddress dns = InetAddress.parseNumericAddress(str);logl("zmm add for default dns..." + dns);dnsService.add(dns);}}} catch (Exception e) {e.printStackTrace();loge("zmm add for default dns..." + e.getMessage());}return dnsService;}
6:設(shè)置客戶自定義的dns,我是在SIMRecords中設(shè)置默認(rèn)的dns的,當(dāng)然也可在別的地方通過mTelephonyManager.setSimDnsServers()方法設(shè)置不同sim卡的不同dns
當(dāng)然需要再setdatacall建立成功之前,就設(shè)置到屬性中去。
//QSSI.13/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/SIMRecords.java
多個(gè)dns服務(wù)器用逗號隔開
mTelephonyManager.setSimDnsServers(mPhoneId(), "dns1,dns2");