簡體   English   中英

Android:長時間運行的應用程序停止響應。 如何調試

[英]Android: Long running application stops responding. How to debug

我有一個長時間運行的Service ,它運行良好,但是,幾個小時后,它停止響應(它似乎正在執行,但實際上沒有)。 我想知道為什么/如何。

故障/錯誤永遠不會發生在“電纜上”,因此在我的本地台式機上調試不起作用。

我還將日志寫入磁盤,以遵循Service的“流程”,但沒有發生故障( MyService執行網絡工作,至少每 20 秒一次,但可能更多)

我有一個有根的 Android 設備。

在這個設備中,我使用 Wifi (IEE802.11) 與 ESP8266 通信。

為此,我有一個無限期運行的服務。 我有“開始”和“停止”動作來控制它。 它通過以下方式啟動和停止:

主要活動:

MyServices mMyServices = null;
boolean mIsBound = false;

onCreate(){
   Intent myIntent = new Intent(this, MyServices.class);
   startService(myIntent);
   bindService(
           myIntent,
           myServiceConnection,
           Context.BIND_AUTO_CREATE
   );
}

onDestroy(){
   unbindService(myServiceConnection);
   stopService(new Intent(this, MyServices.class));
}

private final ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyServices.MyBinder binder = (MyServices.MyBinder) service;
        mMyServices = binder.getService();
        mIsBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mIsBound = false;
    }
};

MyService超過 3k 行,它本身沒有阻塞操作,但持有Thread s,即使MyService停止響應“綁定活動”,它們似乎也能正常工作。

我的服務:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return Service.START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

private final IBinder mBinder = new MyBinder();
public class MyBinder extends Binder {
    public MyServices getService() {
        return MyServices.this;
    }
}

據我所知,當“錯誤”發生時,是當我綁定一個Activity (可能同時綁定幾個),然后在幾個小時后轉到后台,當一個“綁定活動”不在前台時進入前台,沒有任何反應,沒有日志,沒有錯誤,應用程序只是掛起,並出現 ANR(應用程序無響應)消息,並提示終止應用程序。

更新 25/10/2016

所有綁定都已被刪除和測試。 服務將在大約 40 ~ 500 分鍾內停止運行,沒有任何故障源的跡象。 該設備發出“異常發生”的聲音,它是三星 SM-T810 平板電腦,沒有任何內容寫入日志,沒有 DDMS 堆棧跟蹤,沒有可遵循的路徑...

我確實意識到服務“崩潰”了,它的線程和其他部分將繼續正常工作。 服務對象上似乎沒有代碼運行,嘗試寫入磁盤從未成功。 通過電纜調試沒有在超過 1 mb 長的日志上提供任何有用的信息......

我正在嘗試通過 Wifi adb 監控設備。 完成后,將發布結果

在“主”線程中進行一些長時間的操作時,會發生ANR。 這是事件循環線程,如果繁忙,則Android無法處理任何其他事件,因此會引發ANR對話框。

要確定代碼的哪一部分阻塞了主線程,您可以在每個線程狀態和堆棧跟蹤詳細信息可用的情況下提取traces.txt。

adb pull /data/anr/traces.txt

如何避免ANR

https://developer.android.com/training/articles/perf-anr.html

下面的工具也可以幫助對其進行跟蹤。

Systrace

https://developer.android.com/studio/profile/systrace-commandline.html

TraceView

https://developer.android.com/studio/profile/traceview.html

Anr追蹤:

解釋ANR堆棧跟蹤

我建議您創建一個帶有所需消息日志的文本文件,以嘗試查找崩潰的地方,或者甚至在可能的情況下在其中寫入Exception輸出。 在有人提到如何編寫文本文件Log的地方檢查此線程 ,然后使用它在運行的服務中編寫檢查點。 它不是最終的解決方案,也不是調試,但是在許多情況下日志記錄是有幫助的。

希望能幫助到你!

MainActivity在服務被銷毀時將其停止。 只需將其取消綁定到onDestroy中,即可使該服務保持運行狀態。 請看這個例子 該示例還建議使用onStart和onStop而不是onCreate和onDestroy來綁定和取消綁定您的服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM