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++本地代码关联起来。
- android权限代码分析(四)
- android权限代码分析
- android权限代码分析(五)
- android权限代码分析(六)
- Android 权限控制代码分析
- Android 权限控制代码分析
- android权限代码分析(二)
- android权限代码分析(三)
- Android权限控制代码分析
- Android权限控制代码分析
- Android 权限控制代码分析
- Android PackageManagerService流程详细分析(四)之权限
- Android 4.1 Netd详细分析(四)代码分析2
- Android 4.1 Netd详细分析(四)代码分析2
- Android的gps的代码分析(四)
- android启动代码init.c文件分析(四)
- Android的gps的代码分析(四)
- lvm代码分析(四)
- 每日一文
- 整合apache和tomcat构建Web服务器-linux
- VS2012 中完整配置OpenGL环境(最新)
- ubuntu下软件安装报错一例
- EntityFramework之领域驱动设计实践 (一)
- android权限代码分析(四)
- 微信CRM六大模块详解
- 运行jar包出现乱码
- [Leetcode] Subsets II (Java)
- git 代码协同之回车问题
- Android 代码强制启动GPU渲染
- EntityFramework之领域驱动设计实践(二)
- C# winform下的富文本编辑器
- html <table>表数据转 Json 格式