最近看到大量的篇幅报道,空姐遇害案细节曝光:上车第10分钟,嫌疑人就卸载了滴滴软件,当时就一直在想滴滴公司,
是怎么监听到用户卸载了应用,难道android
sdk有开放api。思路大致是监听用户卸载行为,处理卸载后的业务逻辑,可以发送网页请求或通过浏览器打开网页,此时可以把当前用户信息+设备信息+时间
发送到服务器上,记录当前应用卸载记录。

      研究一番android通过监听是可以实现抓取用户卸载这一操作,话不多说, 直接贴代码。

      1、MainActivity onCreate监听

      package com.ninetowns.demo;


import org.apache.cordova.DroidGap;


import com.ninetowns.common.UninstallObserver;


import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.util.Log;
import android.widget.Toast;


@SuppressWarnings("unused")
public class MainActivity extends DroidGap {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//super.loadUrl("file:///android_asset/www/index.html");

//监听卸载事件
listening();

}

private void listening() {
        UninstallObserver.startWork("/data/data/" + getPackageName(),
"https://www.xx.com", android.os.Build.VERSION.SDK_INT);
    }


}




 2、UninstallObserver监听类

package com.ninetowns.common;
public class UninstallObserver {

static{
System.loadLibrary("observer");
}

public static native String startWork(String path, String url, int version);


}




3、C语言来监听jni及am

3.1、android.mk  

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=observer
LOCAL_SRC_FILES:=observer.c
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog


include $(BUILD_SHARED_LIBRARY)




3.2、observer.c

#include <string.h>
#include <jni.h>


#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <android/log.h>
#include <unistd.h>
#include <sys/inotify.h>

#define MEM_ZERO(pDest, destSize) memset(pDest, 0, destSize)
#define LOG_INFO(tag, msg) __android_log_write(ANDROID_LOG_INFO, tag, msg)
#define LOG_DEBUG(tag, msg) __android_log_write(ANDROID_LOG_DEBUG, tag, msg)
#define LOG_WARN(tag, msg) __android_log_write(ANDROID_LOG_WARN, tag, msg)
#define LOG_ERROR(tag, msg) __android_log_write(ANDROID_LOG_ERROR, tag, msg)

static char c_TAG[] = "onEvent";
static jboolean b_IS_COPY = JNI_TRUE;

jstring Java_com_zgy_catchuninstallself_UninstallObserver_startWork(JNIEnv*
env,
jobject thiz, jstring path, jstring url, jint version) {
jstring tag = (*env)->NewStringUTF(env, c_TAG);
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "init OK"),
&b_IS_COPY));
pid_t pid = fork();
if (pid < 0) {
LOG_ERROR((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "fork failed !!!"),
&b_IS_COPY));
} else if (pid == 0) {
int fileDescriptor = inotify_init();
if (fileDescriptor < 0) {
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "inotify_init failed
!!!"), &b_IS_COPY));

exit(1);
}

int watchDescriptor;
watchDescriptor = inotify_add_watch(fileDescriptor,
(*env)->GetStringUTFChars(env, path, NULL), IN_DELETE);
if (watchDescriptor < 0) {
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "inotify_add_watch
failed !!!"), &b_IS_COPY));
exit(1);
}

void *p_buf = malloc(sizeof(struct inotify_event));
if (p_buf == NULL) {
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "malloc failed !!!"),
&b_IS_COPY));

exit(1);
}

LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "start observer"),
&b_IS_COPY));

size_t readBytes = read(fileDescriptor, p_buf,
sizeof(struct inotify_event));
free(p_buf);
inotify_rm_watch(fileDescriptor, IN_DELETE);


LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "uninstalled"),
&b_IS_COPY));

if (version >= 17) {
execlp("am", "am", "start", "--user", "0", "-a",
"android.intent.action.VIEW", "-d",
(*env)->GetStringUTFChars(env, url, NULL), (char *) NULL);
} else {
execlp("am", "am", "start", "-a", "android.intent.action.VIEW",
"-d", (*env)->GetStringUTFChars(env, url, NULL),
(char *) NULL);
}


//处理卸载后的业务逻辑 可以发送网页请求或通过浏览器打开网页,此时可以把当前用户信息+设备信息+时间 发送到服务器上,记录当前应用卸载记录


} else {


}


return (*env)->NewStringUTF(env, "Hello from JNI !");
}



友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信