第一次自己编译so包,app自己监测本应用是否被卸载

来源:互联网 发布:linux系统下载iso 编辑:程序博客网 时间:2024/06/05 18:22

近期和服务端的同事讨论一些问题时,提到软件能否自己监测自己是否被卸载,这样服务端在向客户端推送通知的时候,就可以不用给“僵尸用户”推送,从而减少一些无用功。因为之前没有自己研究过ndk,自己动手生成so(别嘲笑我啊,之前都是直接使用别人编译好的so或者常见的就是第三方开放平台提供的so库),自己的知识范围仅仅receiver,还有广播之类的,想了想,软件都被卸载了,服务和广播根本起不到作用,自己给的答案是“做不到吧”,给的是不太确定的答案。

后来在网上搜了一下,还真的可以做到!!开启C进程,监控应用包是否存在,如果不存在了,说明应用被卸载了,厉害了,之前没有接触过自己编译。应用是以包名来区分唯一的,而应用包会装载/data/data目录下,而C进程是独立于java进程的,说明java程序被卸载了,它也还是会执行(除非被ROM杀死)

没自己动手生成so过,从头开始学吧。参考这篇博客
http://blog.csdn.net/laczff21/article/details/7542236
不过前面的ndk安装什么的我是搜索“android studio生成so”,可以参考这篇文章,直接在studio中创建了快捷键,这样更方便
http://blog.csdn.net/u010030505/article/details/51942157

自己监测本应用是否被卸载,关于这个资料还真不少,我一开始也是选了几篇作为参考,后来发现了一篇更简单的,
感谢这篇博客的分享,原文链接http://blog.csdn.net/sinat_31311947/article/details/54178422
相比较其他的,c的代码真的是少了太多了。
下面是我的demo运行结果
这里写图片描述

另外自己试了一下
demo可以正常运行,然后集成到自己的项目中,发现软件不能正常运行了,应该是调用出现了问题,因为demo中也是和上面的博客一样,按钮出发调用,但是项目中总不能给个按钮去让用户点击吧,我在项目中放到service调用,结果就是会导致软件不能正常运行。
大家可以参考这篇文章:
http://www.apkbus.com/thread-250628-1-1.html
我并没有下载他的压缩包,因为通过上面的几篇文章已经可以自己编译so包了,所以我直接把文章中的c文件拷贝然后修改了一下,然后重新放到自己工程里面,可以使用了!!!

我只是总结了一下自己在这个过程中遇到的一些情况,然后搜的那些文件整理了一下,让大家少耽误点时间

说说这个过程中需要注意的问题:
1、c文件中头文件的正确引用,缺少头文件,编译生成so是过不去的
2、c中需要输出日志文件的方便查看调试的,有可能会遇到这种错误
undefined reference to __android_log_print
搜了一些解决方案,不过都不全面,总是会出现,最终解决方案请参考:
http://blog.csdn.net/u010331406/article/details/50907714
其中android.mk文件中关于日志的,建议使用
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
这个也是我找其他资料中综合考虑决定使用的。

还有可能是报LOGI的错误的,LOGI是把复杂的输出格式
android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS)
自定义了简化的方式
解决方案

#ifndef LOG_TAG#define LOG_TAG "UninstalledMonitor"#endif#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

3、最终运行错误
java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader couldn’t find xxx.so
这是因为so的路径问题引起的
打开gradle.build文件,修改为(这一步是为了能把.so文件编译进去)

android{//添加sourceSets {   main {      jniLibs.srcDirs = ['src/main/jniLibs']//这个替换成你的so包路径   }}       
阅读全文
0 0