導航:首頁 > 操作系統 > android監聽自己被卸載

android監聽自己被卸載

發布時間:2022-08-23 04:38:30

Ⅰ 請問android APP 如何防止被系統殺死和用戶卸載

這個有點流氓軟體的味道了……

如果是防止被殺,參照一下這里吧(Android開發之如何保證Service不被殺掉)

如果要防止用戶卸載,可以用輔助功能監聽用戶是否點開了軟體卸載頁面,如果點開了,查找頁面文字或ID,檢測一下是不是你的軟體,如果是就點取消。但是需要引導用戶把輔助功能打開。

建議不要這么做,防止被殺可以,但是防止卸載如果被舉報會招到官司的。

Ⅱ android如何監聽到程序安裝與卸載的名稱,包名

可以使用java輪詢檢測data下包名是否存在來判斷安裝與卸載

Ⅲ 怎麼監聽應用被刪除了 android

ackage main.activity;
2
3 import pym.test.uninstalledmoniter.R;
4 import android.app.Activity;
5 import android.os.Bundle;
6 import android.util.Log;
7
8 /**
9 * @author pengyiming
10 * @note 監聽此應用是否被卸載,若被卸載則彈出卸載反饋
11 *
12 */
13
14 public class UninstalledMoniterActivity extends Activity
15 {
16 /* 數據段begin */
17 private static final String TAG = "UninstalledMoniterActivity";
18 /* 數據段end */
19
20 /* 函數段begin */
21 private native void init();
22 static
23 {

Ⅳ android程序怎樣監聽自身程序被安裝和卸載

在android系統中,安裝和卸載都會發送廣播,當應用安裝完成後系統會發android.intent.action.PACKAGE_ADDED廣播。可以通過intent.getDataString()獲得所安裝的包名。當卸載程序時系統發android.intent.action.PACKAGE_REMOVED廣播。同樣intent.getDataString()獲得所卸載的包名。

Ⅳ android應用是如何監聽自己是否被卸載的呢

Activity啟動時fork出C端進程輪詢目錄:

1 package main.activity;
2
3 import pym.test.uninstalledmoniter.R;
4 import android.app.Activity;
5 import android.os.Bundle;
6 import android.util.Log;
7
8 /**
9 * @author pengyiming
10 * @note 監聽此應用是否被卸載,若被卸載則彈出卸載反饋
11 *
12 */
13
14 public class UninstalledMoniterActivity extends Activity
15 {
16 /* 數據段begin */
17 private static final String TAG = "UninstalledMoniterActivity";
18 /* 數據段end */
19
20 /* 函數段begin */
21 private native void init();
22 static
23 {
24 Log.d(TAG, "load libuninstalled_moniter");
25 System.loadLibrary("uninstalled_moniter");
26 }
27
28 @Override
29 public void onCreate(Bundle savedInstanceState)
30 {
31 super.onCreate(savedInstanceState);
32 Log.d(TAG, "onCreate");
33
34 setContentView(R.layout.uninstalled_moniter_layout);
35
36 init();
37 }
38 /* 函數段end */
39 }

核心——native方法頭文件:

1 /* 頭文件begin */
2 #include <jni.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <android/log.h>
6 #include <unistd.h>
7 /* 頭文件end */
8
9 /* 宏定義begin */
10 //清0宏
11 #define MEM_ZERO(pDest, destSize) memset(pDest, 0, destSize)
12
13 //LOG宏定義
14 #define LOG_INFO(tag, msg) __android_log_write(ANDROID_LOG_INFO, tag, msg)
15 #define LOG_DEBUG(tag, msg) __android_log_write(ANDROID_LOG_DEBUG, tag, msg)
16 #define LOG_WARN(tag, msg) __android_log_write(ANDROID_LOG_WARN, tag, msg)
17 #define LOG_ERROR(tag, msg) __android_log_write(ANDROID_LOG_ERROR, tag, msg)
18 /* 宏定義end */
19
20 #ifndef _Included_main_activity_UninstalledMoniterActivity
21 #define _Included_main_activity_UninstalledMoniterActivity
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 #undef main_activity_UninstalledMoniterActivity_MODE_PRIVATE
27 #define main_activity_UninstalledMoniterActivity_MODE_PRIVATE 0L
28 #undef main_activity_UninstalledMoniterActivity_MODE_WORLD_READABLE
29 #define main_activity_UninstalledMoniterActivity_MODE_WORLD_READABLE 1L
30 #undef main_activity_UninstalledMoniterActivity_MODE_WORLD_WRITEABLE
31 #define main_activity_UninstalledMoniterActivity_MODE_WORLD_WRITEABLE 2L
32 #undef main_activity_UninstalledMoniterActivity_MODE_APPEND
33 #define main_activity_UninstalledMoniterActivity_MODE_APPEND 32768L
34 #undef main_activity_UninstalledMoniterActivity_MODE_MULTI_PROCESS
35 #define main_activity_UninstalledMoniterActivity_MODE_MULTI_PROCESS 4L
36 #undef main_activity_UninstalledMoniterActivity_BIND_AUTO_CREATE
37 #define main_activity_UninstalledMoniterActivity_BIND_AUTO_CREATE 1L
38 #undef main_activity_UninstalledMoniterActivity_BIND_DEBUG_UNBIND
39 #define main_activity_UninstalledMoniterActivity_BIND_DEBUG_UNBIND 2L
40 #undef main_activity_UninstalledMoniterActivity_BIND_NOT_FOREGROUND
41 #define main_activity_UninstalledMoniterActivity_BIND_NOT_FOREGROUND 4L
42 #undef main_activity_UninstalledMoniterActivity_BIND_ABOVE_CLIENT
43 #define main_activity_UninstalledMoniterActivity_BIND_ABOVE_CLIENT 8L
44 #undef main_activity_UninstalledMoniterActivity_BIND_ALLOW_OOM_MANAGEMENT
45 #define main_activity_UninstalledMoniterActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
46 #undef main_activity_UninstalledMoniterActivity_BIND_WAIVE_PRIORITY
47 #define main_activity_UninstalledMoniterActivity_BIND_WAIVE_PRIORITY 32L
48 #undef main_activity_UninstalledMoniterActivity_BIND_IMPORTANT
49 #define main_activity_UninstalledMoniterActivity_BIND_IMPORTANT 64L
50 #undef main_activity_UninstalledMoniterActivity_BIND_ADJUST_WITH_ACTIVITY
51 #define main_activity_UninstalledMoniterActivity_BIND_ADJUST_WITH_ACTIVITY 128L
52 #undef main_activity_UninstalledMoniterActivity_CONTEXT_INCLUDE_CODE
53 #define main_activity_UninstalledMoniterActivity_CONTEXT_INCLUDE_CODE 1L
54 #undef main_activity_UninstalledMoniterActivity_CONTEXT_IGNORE_SECURITY
55 #define main_activity_UninstalledMoniterActivity_CONTEXT_IGNORE_SECURITY 2L
56 #undef main_activity_UninstalledMoniterActivity_CONTEXT_RESTRICTED
57 #define main_activity_UninstalledMoniterActivity_CONTEXT_RESTRICTED 4L
58 #undef main_activity_UninstalledMoniterActivity_RESULT_CANCELED
59 #define main_activity_UninstalledMoniterActivity_RESULT_CANCELED 0L
60 #undef main_activity_UninstalledMoniterActivity_RESULT_OK
61 #define main_activity_UninstalledMoniterActivity_RESULT_OK -1L
62 #undef main_activity_UninstalledMoniterActivity_RESULT_FIRST_USER
63 #define main_activity_UninstalledMoniterActivity_RESULT_FIRST_USER 1L
64 #undef main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_DISABLE
65 #define main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_DISABLE 0L
66 #undef main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_DIALER
67 #define main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_DIALER 1L
68 #undef main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_SHORTCUT
69 #define main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_SHORTCUT 2L
70 #undef main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_SEARCH_LOCAL
71 #define main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
72 #undef main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_SEARCH_GLOBAL
73 #define main_activity_UninstalledMoniterActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
74
75 /*
76 * Class: main_activity_UninstalledMoniterActivity
77 * Method: init
78 * Signature: ()V
79 */
80 JNIEXPORT void JNICALL Java_main_activity_UninstalledMoniterActivity_init(JNIEnv *, jobject);
81
82 #ifdef __cplusplus
83 }
84 #endif
85 #endif

核心——native方法實現:

1 /* 頭文件begin */
2 #include "main_activity_UninstalledMoniterActivity.h"
3 /* 頭文件end */
4
5 #ifdef __cplusplus
6 extern "C" {
7 #endif
8
9 /* 內全局變數begin */
10 static char c_TAG[] = "UninstalledMoniterActivity.init";
11 static jboolean b_IS_COPY = JNI_TRUE;
12 /* 內全局變數 */
13
14 /*
15 * Class: main_activity_UninstalledMoniterActivity
16 * Method: init
17 * Signature: ()V
18 */
19 JNIEXPORT void JNICALL Java_main_activity_UninstalledMoniterActivity_init(JNIEnv *env, jobject obj)
20 {
21 jstring tag = (*env)->NewStringUTF(env, c_TAG);
22
23 //初始化log
24 LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY)
25 , (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "init OK"), &b_IS_COPY));
26
27 //fork子進程,以執行輪詢任務
28 pid_t pid = fork();
29 if (pid < 0)
30 {
31 //出錯log
32 LOG_ERROR((*env)->GetStringUTFChars(env, tag, &b_IS_COPY)
33 , (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "fork error !!!"), &b_IS_COPY));
34 }
35 else if (pid == 0)
36 {
37 //子進程輪詢"/data/data/pym.test.uninstalledmoniter"目錄是否存在,若不存在則說明已被卸載
38 while (1)
39 {
40 FILE *p_file = fopen("/data/data/pym.test.uninstalledmoniter", "r");
41 if (p_file != NULL)
42 {
43 fclose(p_file);
44
45 //目錄存在log
46 LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY)
47 , (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "I'm OK !!!"), &b_IS_COPY));
48
49 sleep(1);
50 }
51 else
52 {
53 //目錄不存在log
54 LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY)
55 , (*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env, "I'm NOT OK !!!"), &b_IS_COPY));
56
57 //執行命令am start -a android.intent.action.VIEW -d http://shouji.360.cn/web/uninstall/uninstall.html
58 execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d", "http://shouji.360.cn/web/uninstall/uninstall.html", (char *)NULL);
59 }
60 }
61 }
62 else
63 {
64 //父進程直接退出,使子進程被init進程領養,以避免子進程僵死
65 }
66 }
67
68 #ifdef __cplusplus
69 }
70 #endif

注1:為了調試方便,包含<android/log.h>,使得so在執行過程中也可以像Java端一樣方便得打出log。相應的mk文件需要加上以下兩句聲明
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

Ⅵ 程序如何監聽自身卸載呢

這個功能360實現了,卸載自己後彈出瀏覽器訪問卸載統計地址。網上給了很多方案。有2種方案可以解決:1.循環監聽log日誌。輸出remove
自己package的時候,調用命令行執行調用瀏覽器的操作。這樣是絕對可以的。但要注意這個監聽、執行代碼必須用C寫來能成功調出瀏覽器。Java寫的,能監聽到,但執行調用瀏覽器是掉不出來的。而且這中方案會帶來性能問題。循環監聽日誌。會把手機搞死的。
2.監聽data/data/文件夾是否被刪除。使用Android的文件監聽服務。當/data/data目錄被刪除的時候,就是應用被刪除了。這個代碼也必須用C寫。Java寫問題同樣是監聽到了,但是彈不出瀏覽器。具體的代碼,可以到這里去下
http://my.oschina.net/u/559701/blog/151400

Ⅶ 如何對自身應用進行卸載監聽

前段時間有個同事問我android應用在卸載以後,如何能夠通知一下伺服器,讓用戶填寫一下卸載的原因,以求為將來的應用修改積累數據。當時他是有段源代碼的,但是有點小問題,我只是幫他定位一下了代碼的問題,具體細節沒有研究。又加上最近工作比較繁忙,所以就放下來了,今天稍微有點空,就自己做了一個應用demo,告知一下諸位在android中如何做到監聽自身應用被卸載了。

一 效果演示

打開應用效果圖:

圖1

點擊卸載後提示,如下圖:

圖2

然後退出應用,卸載程序,會發現當應用被卸載以後,會彈出調用瀏覽器的提示,這里隨便放了一個搜狐瀏覽頁面,在自己的應用中應該調用的一般都是調查頁面。如下圖:

圖3

ok,效果前面已經演示了,現在需要討論一下其具體實現了。
首先,通過adb shell進入手機,然後第一次進入應用,,像圖1一樣,不點擊按鈕,通過 ps | busybox grep ubuntu 看這個應用的進程信息,如下圖:

這個時候只有
u0_a108 2953 124 490956 47792 ffffffff 40052a40 S com.example.ubuntuforandroid
2953 這一個進程

點擊 卸載後提示 按鈕再次,執行剛才執行的ps命令,發現已經有兩個進程了如下圖:

其實新產生的進程是通過程序調用jni介面

public static native int Reguninstall(String path,String url);

這個介面fork了一個進程,而新fork的進程負責監聽本應用是否被卸載了

源碼分析

java層的代碼如下,很簡單,就是調用一下jni介面

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initInjectFunction("testfile"); test = (TextView)this.findViewById(R.id.testview); test.setText("點擊卸載後提示按鈕,你的應用在卸載以後會調用瀏覽器,然後調用你需要的頁面。"); btn = (Button)this.findViewById(R.id.testbtn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String directory = MainActivity.this.getFilesDir().getAbsolutePath(); String url = "http://www.sohu.com/"; JniExec.Reguninstall(directory,url); test.setText("現在可以退出應用,然後卸載應用,看看是否有效果"); } }); }

一目瞭然,不用多言了

現在就分析
package com.example.ubuntuforandroid; public class JniExec { static { System.loadLibrary("uninstall"); } public static native int Reguninstall(String path,String url); }
Reguninstall 這個jni介面裡面做了什麼事情,能夠達到監聽本身應用卸載的效果。

native代碼分析

jint Java_com_example_ubuntuforandroid_JniExec_Reguninstall(JNIEnv* env, jobject thiz, jstring path, jstring url) { LOGI("Java_com_example_ubuntuforandroid_JniExec_Reguninstall"); char *listenpath = (char*) (*env)->GetStringUTFChars(env,path, 0); char *jumpurl = (char*) (*env)->GetStringUTFChars(env,url, 0); LOGI("notify path is %s",listenpath); LOGI("jumpurl is %s",jumpurl); pid_t pid; pid = fork(); if(pid == 0) { //子進程 inotify_main(listenpath,jumpurl); } //父進程不阻塞調用 waitpid ok 子進程變成了孤兒進程,被init進程收養了 pid = waitpid(-1,0,1); LOGI("father bye bye"); return 0; }

這個介面裡面最關鍵的是調用了 inotify_main 這個函數。如果看這段代碼比較費力的話,建議先弄清楚linux 下的fork機制,搞清楚 孤兒進程 僵屍進程這些如何產生的情況。

下面看 inotify_main 這個函數
void inotify_main(char *path,char *url) { struct pollfd poll_list[2]; poll_list[0].fd = inotify_init(); poll_list[0].events = POLLIN; int wd = inotify_add_watch(poll_list[0].fd, path, IN_DELETE | IN_CREATE); if(wd < 0) { fprintf(stderr, "could not add watch for %s, %s\n", path, strerror(errno)); return ; } int retval; while(1) { retval = poll(poll_list,(unsigned long)1,-1); /* retval 總是大於0或為-1,因為我們在阻塞中工作 */ LOGI("retval = %d\n",retval); if(retval < 0) { fprintf(stderr,"poll錯誤: %s/n",strerror(errno)); return; } if((poll_list[0].revents & POLLIN) == POLLIN) { LOGI("poll_list[0].revents&POLLIN\n"); inotify_handle(poll_list[0].fd,url); } } inotify_rm_watch(poll_list[0].fd,wd); }

Ⅷ android程序如何監聽到自己被卸載這個事件。

手段略曲折

首先給你的程序注冊讀取log許可權,

<uses-permissionandroid:name="android.permission.READ_LOGS"/>

然後在你的程序里開一個後台線程,不停的讀取log,當你的應用(包括其他任何應用)被卸載時,系統的ActivityManager會列印出一行log,大概是removing:你的包名。這個時機是在卸載界面點擊確定後的一瞬間觸發的,如下圖


但是不能保證用戶就會點確定真把你的卸載了。。所以自己權衡吧。

這是我在網上找到的唯一方法

代碼如下:

privatevoidListenLog(){

Threadt=newThread(newRunnable(){

publicvoidrun(){

//TODOAuto-generatedmethodstub

Log.v("Fuck","Startlisteninglog");

String[]cmds={"logcat","-c"};

StringshellCmd="logcat";

Processprocess=null;

InputStreamis=null;

DataInputStreamdis=null;

Stringline="";

Runtimeruntime=Runtime.getRuntime();

try{

intwaitValue;

waitValue=runtime.exec(cmds).waitFor();

process=runtime.exec(shellCmd);

is=process.getInputStream();

dis=newDataInputStream(is);

while((line=dis.readLine())!=null&&mKeepListenFlag){

if(!line.contains("Fuck")){

Log.v("Fuck",line);

//這里只是把每個log都列印了一遍,可以再此判斷line里是否有removing字樣,然後做些處理

}

}

Log.v("Fuck","finishedlisten");

}catch(InterruptedExceptione){

e.printStackTrace();

}catch(IOExceptionie){

ie.printStackTrace();

}finally{

try{

if(dis!=null){

dis.close();

}

if(is!=null){

is.close();

}

if(process!=null){

process.destroy();

}

}catch(Exceptione){

e.printStackTrace();

}

}

}

});

//mKeepListenFlag是個成員變數,是為了讓程序結束時終止線程的,否則可能產生程序多次啟動,然後這個線程就啟動了多個。Android線程可不會因為Activity的退出而終止。

mKeepListenFlag=true;

t.start();

}

Ⅸ android程序怎樣監聽自身程序被安裝和卸載

這個我想到的就一種方法,讀取Log信息,然後判斷是否被安裝,其實系統安裝成功之後,會發廣播的,很詳細,但是這種廣播最好是第三方軟體堅定為好,自己就沒法監聽,我前一陣子做升級,就像用這個,但是沒用成,最後只是下載apk成功之後,發送給伺服器日誌信息,感覺自己監聽自己,功能實現上好像有些矛盾,個人意見..

閱讀全文

與android監聽自己被卸載相關的資料

熱點內容
phpsocketepoll 瀏覽:725
小孩和熊的電影 瀏覽:241
python寫網頁界面的框架 瀏覽:6
當通過ssh遠程連接彈性雲伺服器時 瀏覽:655
12306哪個app 瀏覽:680
免費網站電視劇電影全免費在線觀看 瀏覽:737
如何快速清除app廣告 瀏覽:716
單片機按鍵外部中斷 瀏覽:560
單片機的usb供電 瀏覽:256
更改android解析度 瀏覽:186
phpstaticfinal 瀏覽:695
成人倫理風月片電影 瀏覽:294
禁播愛情片 瀏覽:21
動漫電影免費版大全 瀏覽:14
java什麼是this 瀏覽:811
拍攝指南by小說製造機txt下載 瀏覽:738
豆瓣pdf 瀏覽:723
春宮妖姬演員表 瀏覽:112
韓國情愛電影在線 瀏覽:812
程序員那麼可愛顧墨吃醋 瀏覽:201