从android开发到运行[第二天/时长:3h]
今天准备把昨天的内容实践一下,就先自己写了个超级简单的程序示例(第一次写安卓程序感觉好像Qt开发,尤其是目录结构,不同的是多了个AndroidManifest.xml文件)
使用身份证的类比,AndroidManifest.xml
文件的重要性和作用更容易理解:它不仅定义了应用程序的身份和特征,还决定了应用程序在 Android 系统中的运行方式和访问权限。管理好这个文件,就像管理好自己的身份证一样,能够确保应用程序在 Android 平台上的正常运行和合规使用。
当用户输入错误密码则弹出提示。
![image-20240702171617646](https://s2.loli.net/2024/07/02/GzovgVsq1Q6lW39.png)
用户输入正确密码则跳转到另一个界面。
![](https://s2.loli.net/2024/07/02/apH3xoJdYIGivhA.png)
首先Java 编译器生成 .class 文件,可以看出是针对每个类都生成了1个.class文件,当存在嵌套类时生成多个.class。一般来说.class文件是Java程序跨平台运行的关键,它包含了编译后的字节码,JVM可以解释并执行这些字节码,从而实现Java程序的运行。
具体路径: D:\Code\app\build\intermediates\javac\debug\classes\com\droider\firstapp
![image-20240702171805403](https://s2.loli.net/2024/07/02/FfGBO5z8xvgWlke.png)
android - 如何读懂晦涩的 Class 文件|进阶必备 - 个人文章 - SegmentFault 思否
以上是16进制表示,当然我们可以用jdk自带的命令来查看具体信息如:
![image-20240702163414949](https://s2.loli.net/2024/07/02/D2AOjxJfEFReZdp.png)
详解Java的类文件结构(.class文件的结构) | 二哥的Java进阶之路 (javabetter.cn)
随后dx 工具将 .class 文件转换成 .dex 文件以便Dalvik VM执行:
![image-20240702165504467](https://s2.loli.net/2024/07/02/xMdKzZhv9rQ7BlP.png)
一篇文章带你搞懂 DEX 文件的结构-CSDN博客
然后ART 加载 .dex 文件,JIT 和 AOT 编译生成机器码在 CPU 上执行
然后我还在想这个机器码是类似PC上由像x86汇编语言经汇编器而来的吗?查了半天资料都是由Dalvik虚拟机或ART将其转换为对应设备架构的机器码执行。插个眼,回头再看
查资料过程中看到了安卓Native层。不懂概念直接GPT
安卓的Native层指的是使用C、C++等本地编程语言编写的代码,这些代码直接运行在安卓操作系统的底层。与之相对的是Java或Kotlin等高级语言编写的代码,这些代码运行在安卓应用程序框架层。
具体来说,安卓的软件堆栈可以分为以下几个层次:
-
应用层(Application Layer): 这一层包括用户直接与之交互的应用程序,通常使用Java或Kotlin编写。这些应用程序通过Android框架提供的API与系统和硬件进行交互。
-
框架层(Framework Layer): 安卓框架提供了许多高级API和服务,供应用程序使用。这些框架层的代码大部分是使用Java编写的,例如活动管理、视图系统、通知管理等。
-
Native层(Native Layer): Native层是直接运行在操作系统上的底层代码,通常使用C、C++等编程语言编写。这些代码能够直接访问设备的硬件资源和系统服务,提供了更高效和更接近硬件的访问能力。
安卓Native层的主要组成部分包括:
-
系统运行库(System Libraries): 包括C库、图形库(如OpenGL ES)、多媒体库等,提供了底层的系统功能和服务。
-
硬件抽象层(Hardware Abstraction Layer, HAL): 提供了与设备硬件交互的接口,允许上层软件通过标准API访问设备硬件,例如摄像头、传感器等。
-
驱动程序(Drivers): 这些是硬件设备的实际驱动程序,用于控制设备和处理设备级别的输入输出操作。
安卓Native层的优势在于能够提供更高的性能、更直接的硬件访问能力,适合需要处理复杂计算或与底层硬件交互的应用程序功能。
个人感觉也就是个上层到底层交互的中间件。这个库中的的文件大多是.so文件形式。
什么是.so文件?.so文件与ELF关系?不多解释,直接类比PC:
特性 |
Windows(PE格式) |
Linux/Unix(ELF格式) |
文件格式 |
PE(Portable Executable) |
ELF(Executable and Linkable Format) |
可执行文件 |
.exe |
无特定扩展名的可执行文件 |
动态链接库 |
.dll |
.so(Shared Object) |
静态链接库 |
.lib |
.a(Archive) |
预处理文件 |
.i(C预处理文件) |
.i(C预处理文件) |
编译输出文件 |
.obj(目标文件) |
.o(目标文件) |
调试信息文件 |
.pdb(Program Database) |
.dbg(调试符号文件) |
符号表文件 |
.sym |
.symtab |
资源文件 |
.res(资源文件) |
.rc(资源文件) |
.so文件中的机器码是从ARM汇编代码编译而来的,这些机器码针对ARM架构,而安卓系统主要运行在arm架构上。
今日总结
还是扫盲学习,学习了安卓基本开发方式和运行流程。主要时间耗费在了工具使用(吐槽难用的图床)。围绕着android程序从开发到运行,我觉得其中任意一个环节都有逆向的可能。.class可以反编译成java源代码,而.dex可以相对应对于.class。而smali可以修改.dex进而破解,如果更进一步是否也可以在.so文件上做手脚,比如修改arm汇编代码进行程序流程的跳转,类似PC中的hook dll文件那样,劫持?啥的。就这样散会!!!