Все Android IPC по биндеру заблокированы

У меня возникла проблема, когда все вызовы RPC(будь то провайдер или провайдер) заблокированы в моем сервисном приложении.

Вызываемые функции клиента достаточно просты, и я уверен, что они не будут блокироваться часами (и не имеют мертвой блокировки).

Погрузитесь в драйвер связывателя, найдите некоторую информацию в / sys / kernel / debug / binder.

-fid bidner/stats.txt, не найден ни один из потоков подшивки "готов":

proc 918
threads: 23
requested threads: 0+15/15
ready threads 0

-finder/proc/918 обнаружил некоторые входящие и ожидающие транзакции. -из информации, найденной высокая загрузка ядра

CPU usage from 6506ms to 225ms ago:
   90% 918/com.evideostb.cbb.cbbship: 4.1% user + 86% kernel / faults: 11165203 minor
CPU usage from 3444ms to 3956ms later:
   100% 918/com.evideostb.cbb.cbbship: 0% user + 100% kernel / faults: 1001251 minor
     100% 977/Thread-35507: 0% user + 100% kernel

Попробуйте подключить отладчик к процессу Android через Android-Studio, мой процесс оказался невидимым для Android-студии, хотя я все еще могу это сделать.

-попробовать в gdb, и поток применяет всю информацию, множество потоков (или это все, что является java thead) стек печати, как этот (кажется бесконечным):

#0  0xb6e45968 in syscall () from G:\kdroid\tmp\lib\libc.so
#1  0xb4ff76a6 in art::ConditionVariable::Wait(art::Thread*) ()
    from G:\kdroid\tmp\lib\libart.so
#2  0xb4ff76a6 in art::ConditionVariable::Wait(art::Thread*) ()
    from G:\kdroid\tmp\lib\libart.so
#3  0xb4ff76a6 in art::ConditionVariable::Wait(art::Thread*) ()
    from G:\kdroid\tmp\lib\libart.so
......

Стек JDWP не найден

Нет темы-35507 не найдено

Это приложение слишком сложное, чтобы разместить здесь весь код, просто вставьте ссылочный код.

-Обслуживание:

public void onCreate() {
    super.onCreate();
    Notification notification = new Notification();
    notification.flags = notification.flags
            | Notification.FLAG_NO_CLEAR;
    startForeground(
            getClass().hashCode(),
            notification);
}

- OnBind вернуть помощь, как это:

interface ICbbServiceBinder{
    IBinder getCbbService(int serviceEnumOrdinal);
}

воплощать в жизнь:

private static SparseArray<IBinder> mBinders = new SparseArray<>();
public static IBinder getFunction(CbbClient.ServiceName name){
    return mBinders.get(name.ordinal());
}

-Сторона клиента:

private final SparseArray<IInterface> mCache = new SparseArray<>();
public IInterface getService(ServiceName name){
    if (!mIsInit){
        Log.e(TAG, "getService: cbb remote server down");
        return null;
    }
    int nameOrdinal = name.ordinal();

    synchronized (mCache) {
        IInterface iInterface = mCache.get(nameOrdinal);

        if (iInterface == null) {
            IBinder binder;
            try {
                binder = mCbbServer.getCbbService(nameOrdinal);
            } catch (RemoteException e) {
                Log.e(TAG, "getService: can't get service from cbb remote service");
                return null;
            }

            switch (name) {
                case CBB_CORE:
                    iInterface = ICbbCore.Stub.asInterface(binder);
                    break;
                case ......//select binder by name
                default:
                    iInterface = null;
                    break;
            }
            mCache.put(nameOrdinal, iInterface);
        }

        return iInterface;
    }
}

Затем клиент может использовать возврат IInterface через getService для выполнения RPC.

0 ответов

Другие вопросы по тегам