一、簡介
自己在做專案的時候,發現APK在某廠家的一款機頂盒上開機啟動的時候,接收開機廣播拉起程式之後,程式突然崩潰,如果再次拉起程式,又能夠正常使用了,經過全域性異常捕獲發現,導致程式崩潰的原因居然是okhttp中丟擲的一個異常:
java.lang.SecurityException Permission denied (missing INTERNET permission?)
at java.net.InetAddress.lookupHostByName(InetAddress.java 418)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java 236)
at java.net.InetAddress.getAllByName(InetAddress.java 214)
at okhttp3.Dns$1.lookup(Dns.java 39)
at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java 170)
at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java 136)
at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java 81)
...
複製程式碼
第一眼看這個異常,肯定會想到,這特麼的是沒有加許可權啊!!!然而事情如果有這麼簡單的話,還填個毛的坑啊!!!接下來,講一下關於這個異常的情況。
二、異常原因分析
原因一:AndroidMinifest.xml中未新增網路許可權
對於這種異常,大部分情況下確實因為沒有新增網路許可權導致的,一般只需要新增
<uses-permission android:name="android.permission.INTERNET" />
該許可權即可解決該異常引起的崩潰,然後我再專案中查了一遍又一遍,確認了一次又一次,確定不是由於未新增網路許可權導致的該異常,難道還有其他原因?
原因二:AndroidMinifest.xml中未新增網路狀態許可權
檢視了出現該異常的其他部落格,也有人在出現該異常時新增如下許可權就解決了的
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
事實上,依然沒有效果,開機該崩潰還得崩潰;後來在想幹脆將網路許可權都加上,流氓點就流氓點,但該總不會導致這個異常了吧? 爽不過三秒,開啟重啟,還是崩潰了~~~~~~~
三、解決問題
因為做大屏應用開發,很多應用需要在開機之後就要後臺執行,如果開機程式掛了不能起來就玩完了。查了很多資料,目前尚不明確具體什麼原因導致的該異常,初步定位為與ROM有關,但事情總得想法子解決的。如何解決? 既然是okHttp網路訪問出現的異常導致的崩潰,那麼我這邊想法是通過okHttp攔截器來攔截該異常,並做相關處理。具體的攔截器寫法如下:
public class InternetPermissionExceptionInterceptor implements Interceptor {
private static final String PERMISSION_EXCEPTION = "Permission denied (missing INTERNET permission?)";
@Override
public Response intercept(Chain chain) throws IOException {
try {
return chain.proceed(chain.request());
} catch (Throwable e) {
if (PERMISSION_EXCEPTION.equals(e.getMessage()) || e instanceof SecurityException) {
//此處,根據自己的業務需求來決定如何處理攔截到的該異常
AlarmTimer.setAlarmTimer(
XMContext.AppContext(),
System.currentTimeMillis() + 1000 * 10,
AlarmTimer.TIMER_ACTION,
BootBroadcastReceiver.class);
System.exit(0);
}
if (e instanceof IOException) {
throw e;
} else {
throw new IOException(e);
}
}
}
}
複製程式碼
此處,因為我們的專案一下幾個要點: 1、必須保證開機能夠正常啟動 2、有專門的崩潰收集平臺
所以我這裡就是先搞一個定時器,10秒後定時傳送廣播,拉起自己,同時手動kill掉程式,這樣既保證了崩潰平臺不會大批量收集該異常,同時程式保證也能夠正常再開機的時候執行,雖然kill了一次,但不影響業務,至此,雖然沒找到具體的原因,但還是解決了該問題。
四、寫在最後
如果有哪位在使用oKhttop的時候也出現了這類異常,並且不是由於簡單的許可權問題導致的,分析到了原因還望告知,謝謝。 同步釋出於簡書:https://www.jianshu.com/p/ade033e023e3