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}目錄是否存在,如果不存在,就證明應用被解除安裝了。
說幹就幹,開始擼碼
- fork()子程式
- 建立監聽檔案
- 初始化inotify例項
- 註冊監聽事件
- 呼叫read函式開始監聽
- 解除安裝反饋統計
實現原理
是仿照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("------------------------");
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探究之旅《十》——ndk專案實戰之Androidstudio開發經驗總結
NDK探究之旅《十一》—C程式碼呼叫Java程式碼之專案實戰
關於更多:
GitHub下載連結:
下載慢?
相信自己,沒有做不到的,只有想不到的
如果你覺得此文對您有所幫助, 歡迎關注微信公眾號:終端研發部 這裡不僅僅學到的是技術
(歡迎關注學習和交流)