原理解析
下面看一下Android中加壳的原理:
在加固过程中需要三个对象:
- 需要加密的APK(源程序APK)
- 壳程序APK(负责解密APK工作)
- 加密工具(将源APK进行加密和壳程序的DEX合并)
回调机制就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。下面结合经典的例子进行说明:
动态加载可以用来进行插件开发,这些插件大概都是为了在一个主程序中实现比较通用的功能,使主程序具有可扩展性。实现原理是实现一套插件接口,把插件实现编成apk或dex,在运行时用DexClassLoader动态加载进来。
预备知识:Android中的动态加载机制
忘了说我的运行环境是Ubuntu14.04,vim,gcc version 4.8.4,操作系统和编辑器没什么要紧,gcc如果版本低了可能不支持C++11。
编译运行方法如下:
1 | $ g++ -std=c++11 -o test test.c |
下面的方法是基于编译完Android系统源码之后,再另外下载Linux内核进行编译调试的。我在编译Android6.0.1源码,烧录到nexus5真机上这篇文章中编译的是lunch 8
,即aosp_hammerhead-userdebug,但是用emulator
启动模拟器时,需要用模拟器版本的编译lunch 1
,即aosp_arm-eng。
本文主要介绍Android动态加载jar的技术,如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件;如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防止被破解?这篇文章是一个基础,后面的一些文章会以此继续深入。
运行时间
评估算法的性能
。首先,要计算各个排序算法在不同的随机输入下的基本操作的次数(包括比较和交换,或者是读写数组的次数)。然后,我们用这些数据估计算法的相对性能。
额外的内存使用
排序算法的额外内存开销和运行时间是同样重要的。排序算法可分为两类:除了函数调用所需的栈和固定数目的实例变量之外无需额外内存的原地排序算法,以及需要额外内存空间来存储另一份数组副本的其他排序算法。