wangxiaobai123 发表于 2024-7-2 18:15

从android开发到运行

# 从android开发到运行[第二天/时长:3h]



今天准备把昨天的内容实践一下,就先自己写了个超级简单的程序示例(第一次写安卓程序感觉好像Qt开发,尤其是目录结构,不同的是多了个AndroidManifest.xml文件)

> 使用身份证的类比,`AndroidManifest.xml` 文件的重要性和作用更容易理解:它不仅定义了应用程序的身份和特征,还决定了应用程序在 Android 系统中的运行方式和访问权限。管理好这个文件,就像管理好自己的身份证一样,能够确保应用程序在 Android 平台上的正常运行和合规使用。

当用户输入错误密码则弹出提示。

!(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

!(https://s2.loli.net/2024/07/02/FfGBO5z8xvgWlke.png)

(https://segmentfault.com/a/1190000038390259#item-5)

以上是16进制表示,当然我们可以用jdk自带的命令来查看具体信息如:

!(https://s2.loli.net/2024/07/02/D2AOjxJfEFReZdp.png)

[详解Java的类文件结构(.class文件的结构) | 二哥的Java进阶之路 (javabetter.cn)](https://javabetter.cn/jvm/class-file-jiegou.html)

随后dx 工具将 .class 文件转换成 .dex 文件以便Dalvik VM执行:

!(https://s2.loli.net/2024/07/02/xMdKzZhv9rQ7BlP.png)

[一篇文章带你搞懂 DEX 文件的结构-CSDN博客](https://blog.csdn.net/freeking101/article/details/107551057)

然后ART 加载 .dex 文件,JIT 和 AOT 编译生成机器码在 CPU 上执行

------

然后我还在想这个机器码是类似PC上由像x86汇编语言经汇编器而来的吗?查了半天资料都是由Dalvik虚拟机或ART将其转换为对应设备架构的机器码执行。插个眼,回头再看

------

查资料过程中看到了安卓Native层。不懂概念直接GPT

> 安卓的Native层指的是使用C、C++等本地编程语言编写的代码,这些代码直接运行在安卓操作系统的底层。与之相对的是Java或Kotlin等高级语言编写的代码,这些代码运行在安卓应用程序框架层。
>
> 具体来说,安卓的软件堆栈可以分为以下几个层次:
>
> 1. **应用层(Application Layer):** 这一层包括用户直接与之交互的应用程序,通常使用Java或Kotlin编写。这些应用程序通过Android框架提供的API与系统和硬件进行交互。
>
> 2. **框架层(Framework Layer):** 安卓框架提供了许多高级API和服务,供应用程序使用。这些框架层的代码大部分是使用Java编写的,例如活动管理、视图系统、通知管理等。
>
> 3. **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文件那样,劫持?啥的。就这样散会!!!

正己 发表于 2024-7-2 21:50

图床试试这个,另外学习思路可以参考一下我的系列课程
ShareX 全功能截图 v16.1.0 便携版 | 附图床配置,发帖再也不怕找不到图床了
https://www.52pojie.cn/thread-1925145-1-1.html
(出处: 吾爱破解论坛)

zhurainyk 发表于 2024-7-2 23:15

好东西,感谢分享!!!

天心阁主 发表于 2024-7-3 02:29

不错,最近在学安卓看看

zhangting2022 发表于 2024-7-3 05:24

感谢感谢分享

timelessxp 发表于 2024-7-3 09:42

感谢楼主的分享

debug_cat 发表于 2024-7-3 10:23

感谢分享,学习就是应该这样多写笔记。

dfg63678 发表于 2024-7-3 11:52

谢谢楼主分享

qgg9527 发表于 2024-7-3 17:02

希望继续更新,一直想学

666888tzq 发表于 2024-7-3 21:51

图都挂了,啥也看不到啊。{:1_908:}
页: [1] 2
查看完整版本: 从android开发到运行