NDK项目实战—高仿360手机助手之卸载监听

NDK项目实战仿360手机助手卸载监听提交报告。

效果图以下:android

效果图
效果图

目的

须要监听何时卸载,卸载后执行部分操做git

针对于Android的系统,咱们能够试想有一下策略

  • 一、监听系统卸载广播github

    只能监听到其余应用的卸载广播,没法监听到本身是否被卸载。数组

    内存  --》  监听  别人    
      . ACTION_PACKAGE_REMOVED 
      2.ACTION_PACKAGE_REMOVED 复制代码
  • 二、卸载 bash

    经过系统log (正在被安装的包程序不能接收到这个广播)微信

监听自身   复制代码
  • 三、Java线程 函数

    轮训 监听 监听/data/data/{package-name}目录是否存在学习

  • 四、C进程ui

    监听/data/data/{package-name}目录是否存在 跳转到网页spa

image
image

  • 五、静默安装另外的apk

    监听本身是否被卸载 能够,可是前提须要(root)

从上面分析来看

  • 若是开启线程 ,则耗资源比较大
  • File 的监听 能够试试

360卸载监听的方式:

监听  /data/data/{package-name}目录是否存在复制代码

总结

从前四种方案能够看到,单纯的Java层代码是没法监听自身卸载的。既然Java层没法实现,咱们试着使用C语言在底层实现。
借助Linux进程fork出来的C进程在应用被卸载后不会被销毁,监听/data/data/{package-name}目录是否存在,若是不存在,就证实应用被卸载了。

说干就干,开始撸码

  1. fork()子进程
  2. 建立监听文件
  3. 初始化inotify实例
  4. 注册监听事件
  5. 调用read函数开始监听
  6. 卸载反馈统计

实现原理

是仿照FileObserve监听文件的方式,在本地方式中进行拦截和操做

接下老我么来看下FileObserve的源码

FileObserve一进来的时候就开启了一个线程,以下:

FileObserve进来初始化.png
FileObserve进来初始化.png

利用本利方法进行监听:

FileObserve.png
FileObserve.png

在线程中进行操做:

执行操做.png
执行操做.png

C中fork代码以下:

JNIEXPORT
void JNICALL
Java_unstall_yyh_com_a360installtolistener_MainActivity_callUnInstallListener(JNIEnv *env,jobject obj,jint versionSdk,jstring path){
    LOGD("------------------------");
    LOGF("------------------------");
    const char * path_str = env->GetStringUTFChars(path,0);
        pid_t pid =  fork();
        if(pid < 0){
               LOGD("克隆失败");
        }else if(pid > 0){
            LOGD("父进程");
        }else{
            LOGD("子进程!");
            //*******************在这里进程操做*****************
            LOGD("你好,终端研发部");
            int fuileDescript = inotify_init();
            int watch = inotify_add_watch(fuileDescript,path_str,IN_DELETE_SELF);
           void * p =  malloc(sizeof(struct inotify_event));
            read(fuileDescript,p, sizeof(struct inotify_event));
            inotify_rm_watch(fuileDescript,watch);
            LOGD(LOG_TAG,"接下来进行操做,来条状网页!!!");
            if(versionSdk< 17){
                //am start -a android.intent.action.VIEW -d  http://gityuan.com
                execlp("am","am","start","-a","android.intent.action.VIEW","-d","https://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247484366&idx=2&sn=a015497277d2a6380a80fdc9031ca51c&chksm=eb476f50dc30e64620fbb8a7ce0aebc445638c5f1097763e0da36fc40beb85fb256d980af440&scene=18#wechat_redirect",NULL);
            }else{
                execlp("am","am","start","--user","0","-a","android.intent.action.VIEW","-d", "https://mp.weixin.qq.com/s?__biz=MzI3OTU0MzI4MQ==&mid=2247484366&idx=2&sn=a015497277d2a6380a80fdc9031ca51c&chksm=eb476f50dc30e64620fbb8a7ce0aebc445638c5f1097763e0da36fc40beb85fb256d980af440&scene=18#wechat_redirect",NULL);
            }
        }
        env->ReleaseStringUTFChars(path,path_str);
    }复制代码

最后卸载监听的是我技术号里的一篇文章。

总结

  • 6.0以后的就不能再进行监听卸载了。
  • 凡是360手机助手能支持的该方式也基本支持
  • 因为部分厂家修改底层源码致使部分手机没法监听下载
  • 经过实验360手机助手也不能适配全部的6.0以前的手机,如小米红木手机

若是对ndk不了的同窗们能够一下参考博客:

NDK探究之旅:

NDK和JNI初探及其联系和区别

NDK探究之旅《一》——对jni和NDK的认识

NDK探究之旅《二》——C语言的基本认识

NDK探究之旅《三》—C语言的输入输出函数

NDK探究之旅《四》——指针的强化理解

NDK探究之旅《五》——指针和数组之间的关系

NDK探究之旅《六》—函数的指针、结构体、枚举、宏定义

NDK探究之旅《七》—函数指针,宏定义的优缺点及应用场景

NDK探究之旅《八》——jni的开发流程规范及环境配置

NDK探究之旅《九》——jni开发中常见的错误及其注意事项

NDK探究之旅《十》——ndk项目实战之Androidstudio开发经验总结

NDK探究之旅《十一》—C代码调用Java代码之项目实战

关于更多:

2017上半年技术文章集合—184篇文章分类汇总

GitHub下载连接:

github.com/androidstar…

下载慢?

download.csdn.net/download/an…

相信本身,没有作不到的,只有想不到的

若是你以为此文对您有所帮助, 欢迎关注微信公众号:终端研发部 这里不单单学到的是技术

技术+职场
技术+职场

(欢迎关注学习和交流)

相关文章
相关标签/搜索