NDK專案實戰—高仿360手機助手之解除安裝監聽

codeGoogle發表於2017-09-14

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}目錄是否存在 跳轉到網頁

image
image

  • 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一進來的時候就開啟了一個執行緒,如下:

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…

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

如果你覺得此文對您有所幫助, 歡迎關注微信公眾號:終端研發部 這裡不僅僅學到的是技術

技術+職場
技術+職場

(歡迎關注學習和交流)

相關文章