Skip to content

Commit 874e2aa

Browse files
committed
update
1 parent 3b710ae commit 874e2aa

5 files changed

+40
-30
lines changed

AdavancedPart/如何让Service常驻内存.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33

44
我非常鄙视这种行文,一个公司应该想到如何把产品做的更完善,而不是用这些技术来损害用户的利益,来获取自己肮脏的所谓的功能。
55

6-
- Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
7-
- ​通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被 kill
8-
- 双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
9-
- QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
10-
- 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)
11-
- Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。
12-
鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,
13-
具体的思路如下(Android5.0以下可行
14-
- 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
15-
- 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。
6+
- `Service`设置成`START_STICKY``kill`后会被重启(等待5秒左右),重传`Intent`,保持与重启前一样
7+
- ​通过`startForeground`将进程设置为前台进程,做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此进程不会被`kill`
8+
- 双进程`Service`:让2个进程互相保护,其中一个`Service`被清理后,另外没被清理的进程可以立即重启进程
9+
- `QQ`黑科技:在应用退到后台后,另起一个只有1像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
10+
- 在已经`root`的设备下,修改相应的权限文件,`App`伪装成系统级的应用(`Android4.0`系列的一个漏洞,已经确认可行)
11+
- `Android`系统中当前进程(`Process`)`fork`出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。
12+
鉴于目前提到的在`Android-Service`层做双守护都会失败,我们可以`fork``c`进程,多进程守护。死循环在那检查是否还存在,
13+
具体的思路如下(`Android5.0`以下可行
14+
- 用`C`编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
15+
- 在`NDK`环境中将1中编写的`C`代码编译打包成可执行文件(`BUILD_EXECUTABLE`)。
1616
- 主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
1717

1818
- 联系厂商,加入白名单

AdavancedPart/热修复实现.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ public class PluginClass {
441441
```
442442
现在如果想调用插件`APK`中`PluginClass`内的方法,应该怎么办?
443443

444-
####从已安装的apk中读取dex
444+
#### 从已安装的apk中读取dex
445445

446446
先来看第一种方法,这种方法必须建一个`Activity`,在清单文件中配置`Action`.
447447

@@ -513,7 +513,7 @@ public void btnClick(View view){
513513
}
514514
```
515515

516-
####从apk文件中读取dex
516+
#### 从apk文件中读取dex
517517

518518
这种方法由于并不需要安装,所以不需要通过`Intent`从`activity`中解析信息。换言之,这种方法不需要创建`Activity`。无需配置清单文件。我们只需要打包一个`apk`,然后放到`SD`卡中即可。
519519
核心代码如下:

BasicKnowledge/快捷方式工具类.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
快捷方式工具类
2-
==
2+
===
33

44
```java
55
/**

BasicKnowledge/超级管理员(DevicePoliceManager).md

+14-14
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,21 @@ DevicePolicyManager中的方法
3838
```
3939

4040
2. 在清单文件中配置自定义的类
41-
```xml
42-
<receiver
43-
android:name=".receiver.MyAdmin"
44-
android:description="@string/admin_des"
45-
android:label="防卸载"
46-
android:permission="android.permission.BIND_DEVICE_ADMIN" >
47-
<meta-data
48-
android:name="android.app.device_admin"
49-
android:resource="@xml/device_admin_sample" />
41+
```xml
42+
<receiver
43+
android:name=".receiver.MyAdmin"
44+
android:description="@string/admin_des"
45+
android:label="防卸载"
46+
android:permission="android.permission.BIND_DEVICE_ADMIN" >
47+
<meta-data
48+
android:name="android.app.device_admin"
49+
android:resource="@xml/device_admin_sample" />
5050

51-
<intent-filter>
52-
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
53-
</intent-filter>
54-
</receiver>
55-
```
51+
<intent-filter>
52+
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
53+
</intent-filter>
54+
</receiver>
55+
```
5656

5757
3. 完成第二步中所需的meta-data。在res下新建一个xml文件,device_admin_sample.xml
5858
```xml

JavaKnowledge/volatile和Synchronized区别.md

+13-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@ volatile和Synchronized区别
22
===
33

44
- volatile
5-
`Java`语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量
6-
的原始值对比。这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而`volatile`关键字就是提示`JVM`:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
5+
作用:使变量在多个线程间可见(可见性)
6+
`Java`语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而在这个过程中,变量的新值对其他线程是不可见的.而且只当线程进入或者离开同步代码块时才与共享成员变量
7+
的原始值对比。这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
8+
9+
也就是说每个线程都有一个自己的本地内存空间,在线程执行时,先把变量从主内存读取到线程自己的本地内存空间,然后再对该变量进行操作,当对该变量操作完后,在某个时间再把变量刷新回主内存
10+
11+
`volatile`关键字就是提示`JVM`:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
712
使用建议:在两个或者更多的线程访问的成员变量上使用`volatile`。当要访问的变量已在`synchronized`代码块中,或者为常量时,不必使用。
813
由于使用`volatile`屏蔽掉了`JVM`中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。 就跟`C`中的一样 禁止编译器进行优化.
914

@@ -24,4 +29,9 @@ volatile和Synchronized区别
2429
---
2530

2631
- 邮箱 :charon.chui@gmail.com
27-
- Good Luck!
32+
- Good Luck!
33+
34+
35+
36+
37+

0 commit comments

Comments
 (0)