首页
社区
课程
招聘
[求助]请问究竟如何防止自己开发的应用被整个杀死?
发表于: 2014-9-12 21:53 19181

[求助]请问究竟如何防止自己开发的应用被整个杀死?

2014-9-12 21:53
19181
前段时间给家里买了一个小米盒子,但是后来爸妈年纪都大了,不怎么会用安卓系统。老是打电话问我,但是我又在外地上班。
  问的多了我就想给他们开发一个APP,用来远程遥控家里的盒子 仿照遥控器的功能做了一个APP,现在的情况是 功能实现基本上没什么太大的问题,就是我没有想到的一点是  小米盒子的ROM 太贱了。完全不允许后台运行,我的APP 本来打算在service里面开一个socket 监听端口传过来的命令的。但是 在自己做的APP里面一切都正常,一旦返回桌面就被立马杀死了。
  现在就是 一按HOME键返回桌面,APP完全失灵,自定义的广播包括系统广播也收不到。
  查了下官方的说法"MiBox1和MiBox1S:在任意画面按下后切换到系统主页,同时系统将当前应用自动关闭。"!  
  目前尝试了N多办法还是未能解决。盒子已经ROOT,而且已经尝试过 安装 xposed 框架 设置 内存常驻、提升service权重、安装内存锁等等 都失效了。包括android上面的 数字助手、LBE大师之类的安全软件 上了小米盒子全部 武功全废。
  目前我发现的唯一的一款软件能够避免被杀死的应用就是 安全管家 了,我用了他的应用锁对 当前的桌面启动器设置了之后 返回桌面  安全管家 会隔断时间 就要求我输入密码。我特意看了下他的权限  也没什么 特别的呀。不知道他是什么实现的?
一直都知道看雪牛人多,虽然太高深的也看不懂,不过时不时也上来看看大家。
  现在主要是有两点疑问想请大家帮忙分析下:
  1、究竟 小米盒子的ROM 是调用的什么方法把我的后台服务 和进程 全都杀掉的?甚至连我静态广播都给禁用了?
  2、安全管家他是如何突破这种限制的呢?
  
麻烦大家看到的帮帮忙啊,附件是 我文中提到的 安全管家的APK 和 我从小米盒子ROM里 提取出来的几个执行关闭应用的 可能的APK,为了这事 我已经连续找了差不多一个星期了,每天晚上都差不多两三点才睡。。。 o(︶︿︶)o 唉  

附件太大,放在百度盘里了。  坐等大神
附件地址:http://pan.baidu.com/s/1hqehXhM

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 19
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
友情帮顶
2014-9-12 23:51
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
3
唉 别提了。到现在了 也就你一个人回复。

试了N种办法  都是 退出后 进程 和 线程 全部被终止
2014-9-13 02:17
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
4
实在不行 谁能告诉我  怎么样 才能让自己的广播不被屏蔽啊。 尼玛,连个广播都给我屏蔽掉了 这样下去 谁还能开发APP了?雷军个死太监
2014-9-13 02:18
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
5
已经找到 程序 调用的那个函数了  forceStopPackage 只要把自己的包名过滤掉就好了
2014-9-13 09:28
0
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
难道程序员都是为了吃口牛肉就要先养一头牛吗?还是养了牛另有他用?
2014-9-13 09:40
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
7
不是很明白您的意思。我现在 为了这个问题 都找了 一夜了 。
目前 可能的办法 也只是 进程注入 和 删除 调用的那个系统的APP了
2014-9-13 16:18
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
1.用AlarManager,不断间隔的给增加发送消息,确认Service的状态是否正常,否则重启。
2.监控多个状态,如开关机,收发短信,屏幕开关,应用程序被关闭,卸载,网络状态等接受消息的机会进行自检。
2014-9-13 20:17
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
9
可能是我说的不太清楚。只要调用了上面的那个终止进程的方法之后,会把这个进程附属的 一切全部清空。包括了 定时器、开的线程、后台服务 全部被终止了。而且更狠的是  他会把你的APP 状态设成 stopped  和 刚安装一样。这个时候 APP 是接收不到任何系统广播的  也就无法完成自启。
  不过不管怎么说,还是很感激你回复
2014-9-13 22:34
0
雪    币: 30050
活跃值: (2432)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
创建ServicesAAAAAAAAAAA,其创建进程BBBBBBBBBBBBBB。进程BBBBBBBBBBBBB被关闭的时候,是否ServicesAAAAAAAAAAA也会被关闭?
这个对付359手机安全助手和QQ安全助手是可行的,小米盒子就不知道了。
2014-9-14 20:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
有一个办法就是用jni
创建一个守护进程,守护进程派生一个子进程,并让守护进程进入状态D(阻塞状态)
然后就可以放心啦
所有的工作在子进程中完成
因为守护进程进入状态D,系统无法kill他(kill -9也不行)
而系统清楚进程的时候是先父后子,这样就可以避免子进程被kill了
2014-10-23 10:53
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
12
全部关闭
2014-11-9 22:32
0
雪    币: 279
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cid
13
为什么要用JNI创建呢?普通的不行?
2014-11-9 22:35
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
简单来说,就是要提高自己进程的权限,这样就不会被随随便便杀掉了。

第一步(不建议加,可忽略)
让你的service是系统进程,例如

<service
android:name="com.example.service.MyService"
android:process="system" />

第二步
让你的UID为1000,也就是和System共享ID
方法很简单,AndroidManifest.xml中的manifest标签下加一个属性android:sharedUserId="android.uid.system",例如

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example"
android:versionCode="1"
android:versionName="1.0.0"
android:sharedUserId="android.uid.system" >

第三步,最关键
APK编出来后,用signapk.jar和platform的key对你的APK重新签名。
signapk和platform的key(有两个文件,platform.pk8和platform .x509.pem)都是Android源码下面现成的,如果楼主没有Android源码,这三个文件也可以在网上找到。
当然,如果楼主有Android源码,直接在Android.mk里面指定LOCAL_CERTIFICATE为platform,然后mm就可以了。

需要注意的是,楼主需要保证自己的Service健壮性,因为成为加了android:process="system"而成为system进程之后,你的Service挂掉,将会导致整个系统Crash,对于用户来说就是看到开机动画重新跑一遍。。。
2014-11-18 22:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
普通的进程不行,因为java我还不知道任何方法可以阻塞进程
2015-2-4 13:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
另外提升权限可以尝试修改/proc/<pid>/oom_adj
写入一个-16,即可将制定pid的进程提升到系统级别的优先级
我测试过,开启应用,设置后,一般不会kill掉这样的进程
另外启动其他应用,小米会最后kill该进程来释放内存空间
2015-2-4 13:46
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
写adj除非是root才行
$ ll /proc/xxx/oom_*
-rw-r--r-- root     root            0 2015-03-06 15:47 oom_adj
-rw-r--r-- root     root            0 2015-03-09 11:14 oom_score_adj

想把process指定到system,除非是shareUserId到android.uid.system,即签名要用OEM厂商的platform签名,这个第三方应用是不可能的。

第三方常用的方式是,前边有人已经讲过了:daemon进程,这些都是C的接口,fork^2/setsid 之类的,java层无类似的封装接口,当然得在JNI里边做了;sogou、360都这样干的
2015-3-9 11:17
0
雪    币: 5
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
如果系统直接kill 子进程呢?
2015-8-28 15:47
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
JNI怎么创建阻塞进程?NFS需要root,其他方法触发Uninterruptible Sleep也几乎不可能
2015-12-30 16:00
0
雪    币: 178
活跃值: (402)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
楼主问题解决了吗
2016-1-21 18:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
系统是按照先父后子的顺序kill的
不过最新的Android版本已经解决了这个问题,已经无法用任何方式阻止kill了
最新的小米系统可以kill一切普通用户进程,双进程守护也不行
2016-2-25 10:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
使用vfork函数即可将父进程切到阻塞状态
2016-2-25 10:50
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这个D状态能被kill掉
2016-2-25 13:46
0
雪    币: 30
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
有可能的话, 写个 android 上的驱动, 然后 jni 调用驱动, 驱动里面死锁不返回. 估计就杀不掉了.
我以前写 linux 下的驱动, 碰到这样的情况, 只有重新启动机器
2016-2-26 17:52
0
雪    币: 34
活跃值: (50)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
hook  system service 进程劫持packagemanager找到forceStopPackage函数地址替换掉。
2016-2-28 08:41
0
游客
登录 | 注册 方可回帖
返回
//