前言
最近有个需求,需要在cpp bin中监听phone 进程异常死亡的状态。
代码
test.cpp
bash
#define LOG_TAG "BINDER_DEATH"
#include <binder/IServiceManager.h>
#include <binder/Binder.h>
#include <binder/Parcel.h>
#include <android-base/stringprintf.h>
#include <utils/String16.h>
#include <string>
#include <cstdlib>
#include <pthread.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include <utils/Errors.h>
namespace android{
int binderPhone();
namespace {
Mutex gLock;
class DeathNotifier : public IBinder::DeathRecipient
{
public:
DeathNotifier() {}
virtual void binderDied(const wp<IBinder>& /*who*/) {
ALOGV("binderDied");
Mutex::Autolock _l(gLock);
ALOGW("phone service died!");
sleep(2);
binderPhone();
}
};
sp<DeathNotifier> gDeathNotifier;
};
int binderPhone(){
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->checkService(String16("phone"));
if (binder == nullptr) {
ALOGE("step1: phone binder is null ! ");
return -1;
}
binder = sm->getService(String16("phone"));
if(binder == NULL){
ALOGE("step2: phone binder is null ");
return -1;
}
if (gDeathNotifier == NULL) {
gDeathNotifier = new DeathNotifier();
}
status_t status = binder->linkToDeath(gDeathNotifier);
if(status != NO_ERROR){
ALOGE("linkToDeath fail");
} else {
ALOGD("linkToDeath sucessful");
}
return 0;
}
}
int main(){
android::ProcessState::self()->startThreadPool();
android::binderPhone();
android::IPCThreadState::self()->joinThreadPool();
return 0;
}
bash
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := binderDeathTest
LOCAL_SRC_FILES := test.cpp
LOCAL_CFLAGS := -Wno-unused-parameter
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../inc/
LOCAL_SHARED_LIBRARIES := libcutils libutils liblog libbinder libbase
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
测试
bash
while(true){
kill -9 `pidof com.android.phone`
sleep 1
}