最近看到大量的篇幅报道,空姐遇害案细节曝光:上车第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 !");
}
热门工具 换一换