android权限代码分析(四)

来源:互联网 发布:类似hdp直播软件 编辑:程序博客网 时间:2024/05/01 06:42

5:实战之设置时间

5.1配置elf可执行文件方式实现设置时间代码

5.1.1:NDK介绍

NDK全称:Native Development Kit。

1、NDK是一系列工具的集合。

* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。[1]

* NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

* NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2、NDK提供了一份稳定、功能有限的API头文件声明。

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

---------------

NDK,配置NDK,具体参照百度 提供的书籍Pro Android C++ with the NDK.pdf

---------------------

5.1.2配置设置时间c代码,以及编译脚本,生成elf可执行文件测试

我们进入android-ndk-r8d\samples\hello-jni\jni里面:

配置Android.mk 与Systemtime.c

Android.mk 



LOCAL_MODULE := systemtime   编译最终名称

LOCAL_SRC_FILES := systemtime.c  编译c代码列表

include $(BUILD_EXECUTABLE)  编译成可执行文件

Systemtime.c里面代码为:(系统里面的设置时间代码在android\frameworks\base\core\jni\android_os_SystemClock.cpp

android\frameworks\base\core\java\android\os\SystemClock.java

这里是从android_os_SystemClock.cpp文件直接偷来的代码,^_^


Cmd进入到此目录,输入:



编译完成即可在samples\hello-jni\libs\armeabi里面看到systemtime文件。

执行如下操作:(mount 命令需要root支援)



此时systemtime具有执行权限。运行我们会发现出错。



原因便是fb=open("/dev/alarm", O_RDWR); 我们使用可读可写去打开文件,但是/dev/alarm 不允许用户shell直接已读写的方式打开。

我们来看/dev/alarm 的文件权限:



这里我们可以看到只用system 和组 radio可以有写的权限。

我们使用su切成root (万能权限),然后执行结果为



实际时间已改变,这里报错的unable to set rtc to 102045返回值是参数错误,应该是传递参数还需要一定的要求,这里没细看,这里执行是成功的,在我们的公司测试机上面,运行不报错。。。

5.2 配置apk方式实现设置时间代码

5.2.1 JNI介绍


JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了.

5.2.2 JNI 执行过程分析

我们知道android系统是在linux基础上,增加了java虚拟机Dalvik,虚拟机作为桥梁,来将java层调用转为本地代码调用,最终来实现各个功能,如何验证呢?孵化器zygote的进程实现代码在

android\frameworks\base\core\jni\AndroidRuntime.cpp 里面,




startReg-里面



我们来看一个gRegJNI的具体内容:(android_view_KeyEvent.cpp


这里 来看下这行

{ "native_isSystemKey", "(I)Z", (void*)native_isSystemKey },

通过AndroidRuntime::registerNativeMethods函数将本地的c代码native_isSystemKey 注册给android/view/KeyEvent 类里面的native_isSystemKey函数。这样处理后,我们调用KeyEvent.java的native_isSystemKey函数,系统会知道实质调用的为c代码native_isSystemKey,这样子便将java和C C++本地代码关联起来。



0 0
原创粉丝点击