admin 管理员组

文章数量: 1184232

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

效果图如下:

目的

需要监听什么时候卸载,卸载后执行部分操作

针对于Android的系统,我们可以试想有一下策略

  • *1、监听系统卸载广播*

    只能监听到其他应用的卸载广播,无法监听到自己是否被卸载。

    内存  --》  监听  别人    
    . ACTION_PACKAGE_REMOVED 
    2.ACTION_PACKAGE_REMOVED 
    
  • 2、 *卸载*

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

    监听自身

  • 3、 *Java线程*

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

  • 4、 *C进程*

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

  • 5、 *静默安装另外的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一进来的时候就开启了一个线程,如下:

利用本利方法进行监听:

在线程中进行操作:

C中fork代码如下:

JNIEXPORT
void JNICALL
Java_unstall_yyh_com_a360installtolistener_MainActivity_callUnInstallListener(JNIEnv *env,jobject obj,jint versionSdk,jstring path){
    LOGD("------------------------");
    LOGF("------------------------");
    constchar * path_str = env->GetStringUTFChars(path,0);
        pid_t pid =  fork();
        if(pid < 0){
               LOGD("克隆失败");
        }elseif(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  
                execlp("am","am","start","-a","android.intent.action.VIEW","-d","",NULL);
            }else{
                execlp("am","am","start","--user","0","-a","android.intent.action.VIEW","-d", "",NULL);
            }
        }
        env->ReleaseStringUTFChars(path,path_str);
    }

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

总结

  • 6.0之后的就不能再进行监听卸载了。
  • 凡是360手机助手能支持的该方式也基本支持
  • 由于部分厂家修改底层源码导致部分手机无法监听下载
  • 通过实验360手机助手也不能适配所有的6.0之前的手机,如小米红木手机

如果对ndk不了的同学们可以一下参考博客:

NDK探究之旅:

GitHub下载链接:

下载慢?

相信自己,没有做不到的,只有想不到的

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部

(欢迎关注学习和交流)

本文标签: 目录是否 手机助手 监听