一,编译C可执行二进制程序(此处以卸载为例)
1,android.mk文件内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=test
LOCAL_SRC_FILES:=test.c //c文件名
include $(BUILD_EXECUTABLE)
2.test.c文件内容
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <jni.h>
#include <memory.h>
#include <sys/stat.h>
#define MODE S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH //creat文件的属性
int main(int argc, char *argv[])
{
//判断com.appstor.mainroom_started文件是否存在,在此处com.appstor.mainroom_started的作用是作为标志位,判断
//该程序是否是第一次被运行
if ( !access("/tmp/com.appstor.mainroom_started",0) )
{
printf("sign file exists!\n");
return 0;
}
else{
printf("sign file doesn't exist\n");
if(creat("/tmp/com.appstor.gamebox_started",MODE) == -1)
{
printf("creat sign file faild \n");
}
while (1)
{
//再次检测前释放之前生成的文件
unlink("/tmp/checkresult.txt");
char fullcmd[512];
//给fullcmd清零
memset(fullcmd, 0x0,sizeof(fullcmd));
//pm path +包名,可以检测当前设别是否安装了这个程序
sprintf(fullcmd, "pm path com.appstore.mainroom > /tmp/checkresult.txt");
//将pm执行的结果写入到/tmp/checkresult.txt,值得注意的是tmp文件夹是777的权限,任意进程均可操作可读可写,但该文件夹下的内容会在设备断电之后丢失
system(fullcmd);
//判断checkresult.txt的文件状态,不存在或者内容大小不对,即可知道被检测的(包名)应用是否已经卸载
struct stat fst;
if (stat("/tmp/checkresult.txt",&fst) == 0 && fst.st_size > 0)
{
printf("target is onlive\n");
sleep(10);
}
else
{
// 10个命令
printf("target is delete\n");
//由pm来卸载其他的应用,条件是调用该二进制文件的进程拥有比普通用户稍高一点的权限,否则卸载不成功
system("pm uninstall com.jb.spikeBear");
system("pm uninstall com.DefiantDev.SkiSafari");
system("pm uninstall com.lxit.xiaotukuaipao.acivity");
system("pm uninstall com.reigndesign.Pigrush");
system("pm uninstall com.tastyplay.android.kamikazerace");
system("pm uninstall com.com2us.zr.normal.adfree.google.global.android.common");
system("pm uninstall nicdy.game.GoldMiner");
system("pm uninstall com.greekhocc.cyl");
system("pm uninstall oye.games.xiaoquankuaipao");
system("pm uninstall com.reverie.game.ninja");
break;
}
}
//释放文件
unlink("/tmp/checkresult.txt");
unlink("/tmp/com.appstor.gamebox_started");
}
return 0;
3.用ndk-build编译C程序,可生成可执行二进制文件(本例是生成文件test,存在于lib/armeabi/test);
4.将test文件拷到android工程的asserts目录,在android代码里将该test文件copy到android工程的files目录下,或者其他目录也可,前提是该目录下可以把test权限修改成可执行;
5,调用:Runtime.getRuntime.exec("/data/data/包名/files/test &");
6,至此,即可去adb shell里ps查看,该test程序是否运行了。
1,android.mk文件内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=test
LOCAL_SRC_FILES:=test.c //c文件名
include $(BUILD_EXECUTABLE)
2.test.c文件内容
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <jni.h>
#include <memory.h>
#include <sys/stat.h>
#define MODE S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH //creat文件的属性
int main(int argc, char *argv[])
{
//判断com.appstor.mainroom_started文件是否存在,在此处com.appstor.mainroom_started的作用是作为标志位,判断
//该程序是否是第一次被运行
if ( !access("/tmp/com.appstor.mainroom_started",0) )
{
printf("sign file exists!\n");
return 0;
}
else{
printf("sign file doesn't exist\n");
if(creat("/tmp/com.appstor.gamebox_started",MODE) == -1)
{
printf("creat sign file faild \n");
}
while (1)
{
//再次检测前释放之前生成的文件
unlink("/tmp/checkresult.txt");
char fullcmd[512];
//给fullcmd清零
memset(fullcmd, 0x0,sizeof(fullcmd));
//pm path +包名,可以检测当前设别是否安装了这个程序
sprintf(fullcmd, "pm path com.appstore.mainroom > /tmp/checkresult.txt");
//将pm执行的结果写入到/tmp/checkresult.txt,值得注意的是tmp文件夹是777的权限,任意进程均可操作可读可写,但该文件夹下的内容会在设备断电之后丢失
system(fullcmd);
//判断checkresult.txt的文件状态,不存在或者内容大小不对,即可知道被检测的(包名)应用是否已经卸载
struct stat fst;
if (stat("/tmp/checkresult.txt",&fst) == 0 && fst.st_size > 0)
{
printf("target is onlive\n");
sleep(10);
}
else
{
// 10个命令
printf("target is delete\n");
//由pm来卸载其他的应用,条件是调用该二进制文件的进程拥有比普通用户稍高一点的权限,否则卸载不成功
system("pm uninstall com.jb.spikeBear");
system("pm uninstall com.DefiantDev.SkiSafari");
system("pm uninstall com.lxit.xiaotukuaipao.acivity");
system("pm uninstall com.reigndesign.Pigrush");
system("pm uninstall com.tastyplay.android.kamikazerace");
system("pm uninstall com.com2us.zr.normal.adfree.google.global.android.common");
system("pm uninstall nicdy.game.GoldMiner");
system("pm uninstall com.greekhocc.cyl");
system("pm uninstall oye.games.xiaoquankuaipao");
system("pm uninstall com.reverie.game.ninja");
break;
}
}
//释放文件
unlink("/tmp/checkresult.txt");
unlink("/tmp/com.appstor.gamebox_started");
}
return 0;
3.用ndk-build编译C程序,可生成可执行二进制文件(本例是生成文件test,存在于lib/armeabi/test);
4.将test文件拷到android工程的asserts目录,在android代码里将该test文件copy到android工程的files目录下,或者其他目录也可,前提是该目录下可以把test权限修改成可执行;
5,调用:Runtime.getRuntime.exec("/data/data/包名/files/test &");
6,至此,即可去adb shell里ps查看,该test程序是否运行了。