Все 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.