Android通过JNI实现守护进程与卸载后跳转指定网页
JNI进程守护 c代码部分如下:
JNIEXPORT void JNICALL Java_com_sharetimes_qude_jni_JNIDaemon_daemon(JNIEnv * env, jobject obj,jstring packageDir,jint sdkVersion,jstring user) {
char * pd = Jstring2CStr(env, packageDir);
pid_t pid = fork();
if (pid < ) {
LOGD("create process failure");
exit();
} else if (pid > ) {
//pid_r=wait(NULL);
} else {
while (JNI_TRUE) {
pid_t sid_r,sid;
sid = fork();
//创建捕捉子进程退出信号
if(sid == ) {
LOGD("app run create");
if (sdkVersion >= ) {
execlp("am", "am", "startservice", "--user","", "-n","com.sharetimes.qude/.service.StartService", (char*) );
}
else {
execlp("am", "am", "startservice", "-n","com.sharetimes.qude/.service.StartService", (char*) );
}
sleep(); //等待子线程
} else if(sid<) {
exit();
} else {
LOGD("app run clear");
sid_r = wait(NULL);
}
FILE* file = fopen(pd, "rt");
if(file == NULL) {
LOGD("app run daemon exit");
exit();
}
fclose(file);
if(file != NULL) {
free(file);
file==NULL;
}
sleep();
}
}
}
Java代码调用
public class JNIDaemon {
public native void daemon(String packageDir, int sdkVersion, String user);
public void init(Context context) {
String packageDir = "/data/data/" + context.getPackageName();
daemon(packageDir, android.os.Build.VERSION.SDK_INT, context.getApplicationInfo().uid + "");
}
}
JNI 卸载后跳转指定网页
c代码如下:
/**
* 返回值 char* 这个代表char数组的首地址
* Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
*/
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String"); //String
jstring strencode = (*env)->NewStringUTF(env, "GB2312"); // 得到一个java字符串 "GB2312"
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
"(Ljava/lang/String;)[B"); //[ String.getBytes("gb2312");
jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid,
strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env, barr); // byte数组的长度
jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
if (alen > ) {
rtn = (char*) malloc(alen + ); //"\0"
memcpy(rtn, ba, alen);
rtn[alen] = ;
}
(*env)->ReleaseByteArrayElements(env, barr, ba, ); //
return rtn;
} JNIEXPORT void JNICALL Java_com_sharetimes_qude_jni_JNIUninstall_uninstall(JNIEnv * env, jobject obj, jstring packageDir, jint sdkVersion ,jstring parameter,jstring user) {
// 1,将传递过来的java的包名转为c的字符串
char * pd = Jstring2CStr(env, packageDir);
char * para=Jstring2CStr(env, parameter);
char url[];
strcpy (url,"http://vic.i.angjoy.com:8080/uninstall/index.jsp?");
strcat (url,para);
puts (url); char * userid= Jstring2CStr(env,user);
// 2,创建当前进程的克隆进程
pid_t pid = fork();
// 3,根据返回值的不同做不同的操作,<0,>0,=0
if (pid < ) {
exit();
} else if (pid > ) {
} else { while (JNI_TRUE) {
FILE* file = fopen(pd, "rt"); if (file == NULL) {
if (sdkVersion >= ) {
// Android4.2系统之后支持多用户操作,所以得指定用户
execlp("am", "am", "start", "--user", "", "-a","android.intent.action.VIEW", "-d",url, (char*) NULL);
} else {
// Android4.2以前的版本无需指定用户
execlp("am", "am", "start", "-a","android.intent.action.VIEW", "-d",url, (char*) NULL);
}
LOGD("app run uninstall exit");
exit();
} else {
// 应用没有被卸载
LOGD("app run normal");
}
fclose(file);
if(file != NULL) {
free(file);
file==NULL;
} sleep();
} }
}
Java代码调用:
public class JNIUninstall {
static {
System.loadLibrary("uninstall");
}
private String imei;
private String phones;
private String Versions;
private String chanels;
private String imsi;
public native void uninstall(String packageDir, int sdkVersion, String parameter, String uid);
public void init(Context context) {
String packageDir = "/data/data/" + context.getPackageName();
int sdkVersion = android.os.Build.VERSION.SDK_INT;
TelephonyManager mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
ApplicationInfo info;
try {
info = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
imsi = mTelephonyMgr.getSubscriberId();
imei = mTelephonyMgr.getDeviceId();
phones = android.os.Build.MODEL;
Versions = pInfo.versionName;
chanels = info.metaData.getString("ZHUGE_CHANNEL");
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String parameter = "m=" + imei + "&m1=" + imsi + "&model=" + phones + "&v=" + Versions + "&ch=" + chanels + "&sdk_int=" + sdkVersion;
uninstall(packageDir, sdkVersion, parameter, context.getApplicationInfo().uid + "");
}
}
Android通过JNI实现守护进程与卸载后跳转指定网页的更多相关文章
- Android 通过JNI实现守护进程,使得Service服务不被杀死
来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/5054 ...
- android 通过AlarmManager实现守护进程
场景:在app崩溃或手动退出或静默安装后能够自动重启应用activity 前提:得到系统签名 platform.pk8.platform.x509.pem及signapk.jar 三个文件缺一不可(系 ...
- android 6.0+ 动态权限 拒绝不再询问后跳转设置应用详情页面
android 6.0+ 的权限 需要动态申请 这里的权限针对的是 敏感权限: SMS(短信) SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEI ...
- 笔记整理--Linux守护进程
Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...
- Java线程和守护进程
ava的线程机制,有两类线程:User Thread(用户线程).Daemon Thread(守护线程) . 操作系统里面是没有守护线程的概念,只有守护进程,但是Java语言机制是构建在JVM的基础之 ...
- python并发编程基础之守护进程、队列、锁
并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...
- day 7-3 僵尸进程,孤儿进程与守护进程
一.基本定义 正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它 ...
- start-stop-daemon 启动停止系统守护进程
1.start-stop-daemon start-stop-daemon是一个Debian体系里的一个守护进程管理软件,可以用指定的用户启停软件.CentOS有自己的daemon()机制(在/etc ...
- Linux Guard Service - 杀死守护进程
杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 ...
随机推荐
- 提升Scrapy框架爬取数据效率的五种方式
1.增加并发线程开启数量 settings配置文件中,修改CONCURRENT_REQUESTS = 100,默认为32,可适当增加: 2.降低日志级别 运行scrapy时会产生大量日志占用CPU,为 ...
- Phoenix实现分页查询
1 利用offset语法,官网的语法 ELECT * FROM TEST LIMIT 1000; SELECT * FROM TEST LIMIT 1000 OFFSET 100; 2 公式如下 SE ...
- 《python解释器源码剖析》第9章--python虚拟机框架
9.0 序 下面我们就来剖析python运行字节码的原理,我们知道python虚拟机是python的核心,在源代码被编译成字节码序列之后,就将有python的虚拟机接手整个工作.python虚拟机会从 ...
- 静态static最基础的知识
static静态: 常见修饰的内容: 1.变量: 修饰变量时,叫静态变量或类变量.此变量为类所有随着虚拟机加载类是而加载入方法区,此静态变量为该类所有对象共享,在内存中只有一个副本,它 当且仅当 类的 ...
- YII2组件之GridView
采用的是yii2.0.14版本,为了学习方便,以问答式书写. 开始GridView GridView主要是为了实现表格复用,尤其我们做后台的时候,你发现表单和表格占据了大部分页面,而表格的样式又是高度 ...
- Docker容器内服务自启
创建容器时需要配置--privileged和容器启动后执行的命令为/sbin/init/. docker run -d -it --name example -p 3308:3306 -p 2080: ...
- maven的配置和eclipse maven插件安装
1.下载maven:http://maven.apache.org/download.cgi 2. 配置环境变量: 3. 修改maven文件夹下bin/conf/settings.xml:maven仓 ...
- Java一棵树之001线程
一.理解浓缩 线程是计算机cpu调度的最小的单位,并且jvm中的线程和机器中的线程是一一对应的,在现代编程中,很多时候为了充分利用机器资源而使用多线程,当然很多时候工作中并未使用线程,还是根据场景来选 ...
- vmware centos 桥接和NAT的IP配置
先初始化VM, 桥接模式: [root@out network-scripts]# cat ifcfg-ens33 TYPE=EthernetBOOTPROTO=staticDEFROUTE=yesP ...
- router-link
<router-link> 组件支持用户在具有路由功能的应用中 (点击) 导航. 通过 to 属性指定目标地址,默认渲染成带有正确链接的 <a> 标签,可以通过配置 tag 属 ...