1.Android JNI ç¬è®° | GetObjectClassãFindClassåGetMethodID
2.Android-Jetpack笔记-Navigation之Fragment支持复用
3.Android逆向笔记 —— DEX 文件格式解析
4.Android终极笔记—mmap原理与解析
5.Android开发八大模块学习笔记,记源记软件带你初探Android系统开发全貌
6.Android R8代码混淆(笔记)
Android JNI ç¬è®° | GetObjectClassãFindClassåGetMethodID
jclass GetObjectClass(jobject obj)使ç¨å°æ å (å ¶ä¸ç GetMethodID å½æ°è¯·å¾ä¸ç) ï¼
jclass FindClass(const char* name)
å°æ åï¼
jmethodID GetMethodID(jclass clazz,码安 const char* name, const char* sig)
åæ°ä¸ï¼ jclass æ¥æ¾å°çjavaç±»
åæ°äºï¼ const char* name æ¹æ³å
åæ°ä¸ï¼ const char* sig æ¹æ³çè¿åå¼
å°æ åï¼
Android-Jetpack笔记-Navigation之Fragment支持复用
为解决Android应用中Fragment复用问题,遵循Google推荐的卓开单应用单activity原则,以提高用户体验,源笔本文详细阐述了如何支持Fragment复用的记源记软件实现过程。具体步骤如下:
首先,码安android源码预装apk对上篇文章的卓开项目进行日志记录,观察面板页与通知页间的源笔切换。通过日志发现,记源记软件每次切换,码安fragment均经历了销毁与重建的卓开过程,导致了重复的源笔网络请求与视图初始化,严重影响了用户体验。记源记软件
接下来,码安通过继承`FragmentNavigator`类并重写`navigate`方法,卓开实现了Fragment复用功能。具体步骤为:
1. 在初始化fragment的代码中,改变为复用逻辑。
2. 替换`ft.replace`操作为`show`和`hide`,以实现Fragment的切换。
3. 通过反射获取父类的`mBackStack`属性。
4. 复制父类的`generateBackStackName`方法,以管理复用状态。
5. 为`FixFragmentNavigator`添加注解,以便于识别与命名。盘整指标公式源码
完成上述步骤后,即可实现Fragment复用。完整代码与实现细节可参考相关代码库。
为了支持不同类型目的地的复用,自定义了导航器`FixFragmentNavigator`,并为其指定了名称`@Navigator.Name("fixFragment")`。此名称的设定,基于不同类型的页面需要使用不同的导航器,以实现统一跳转与管理。在`NavigatorProvider`中,通过`map`存储多个导航器,以此实现导航器与目的地的绑定。
最后,通过调用`createDestination`方法,使用自定义导航器`FixFragmentNavigator`创建目的地,实现了导航器与目的地之间的关联。Navigation的精髓在于将各种类型的页面抽象为目的地`Destination`,实现统一跳转。而不同的导航器封装了不同类型页面跳转的实现,由`NavController`统一调度,众多`Destination`共同编织成导航图`NavGraph`,实现了高效、灵活的页面导航。
Android逆向笔记 —— DEX 文件格式解析
Android逆向笔记 —— DEX 文件格式解析概览
DEX文件在Android系统中的egret传奇完整源码重要性不言而喻,特别是对于热修复、加固和逆向工程的学习者来说,理解其结构至关重要。DEX文件并非直接源于.java源文件,而是由.class文件打包而成,相比单个Class文件,它更紧凑,便于在Android Runtime下执行。生成DEX文件通常使用Sdk的dx工具,如用Hello.java编译后,通过`dx`命令生成DEX文件。
DEX文件结构复杂,包含多个数据结构,如header、string_ids、type_ids等。这些结构通过偏移量数组连接,实际数据存储在data数据区。DEX文件结构可以从头到尾大致分为几个部分,如header中的元信息,如文件标识、校验值和文件哈希,以及后续的字符串池、类型信息、物品回收平台源码方法声明等。
具体解析时,我们可以参考非虫的看雪神图和Dalvik/libdex/DexFile.h的定义。例如,DEX文件头部分包含magic、checksum和signature等,用于标识和校验文件。继续深入,有string_ids用于存储字符串,如变量名、方法名等;type_ids记录类型信息;method_ids记录方法声明,包括类、方法名和参数等。
解析DEX文件的核心部分是class_def,它存储了类的详细信息,包括类的字段和方法。这部分数据结构复杂,使用了LEB类型的可变长度表示,以节省空间。DEX文件中真正包含代码和指令的部分是DexCode,如Hello.java的main方法,通过指令解析可以还原出Java代码的逻辑。
总结来说,DEX文件的希望ol挂机源码深入理解需要耐心阅读和实践,但收获的逆向知识和技能将十分宝贵。想要了解更多详细内容,可以参考作者提供的源码和思维导图。
Android终极笔记—mmap原理与解析
首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只硬盘上文件的位置与进程逻辑地址空间中一块大小相同的区域之间的一一对应,如图1中过程1所示。这种对应关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在的。在内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,具体到代码,就是建立并初始化了相关的数据结构(struct address_space),这个过程有系统调用mmap()实现,所以建立内存映射的效率很高。
既然建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终直接通过内存操作访问到硬盘上的文件呢?那就要看内存映射之后的几个相关的过程了。
mmap()会返回一个指针ptr,它指向进程逻辑地址空间中的一个地址,这样以后,进程无需再调用read或write对文件进行读写,而只需要通过ptr就能够操作文件。但是ptr所指向的是一个逻辑地址,要操作其中的数据,必须通过MMU将逻辑地址转换成物理地址,如图1中过程2所示。这个过程与内存映射无关。
前面讲过,建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如图1中过程3所示。这个过程与内存映射无关。
如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。这个过程也与内存映射无关。
mmap的强大之处在于,它可以根据参数配置,用于创建共享内存,从而提高文件映射区域的IO效率,实现IO零拷贝,后面讲下零拷贝的技术,对比下,决定这些功能的主要就是三个参数,下面一一解释
prot
四种情况如下:
flags
比较有代表性的如下:
fd
当参数fd不等于0时,内存映射将与文件进行关联,如果等于0,就会变成匿名映射,此时flags必为MAP_ANONYMOUS
一个mmap竟有如此丰富的功能,从申请分配内存到加载动态库,再到进程间通信,真的是无所不能,强大到让人五体投地。下面就着四种情况,拿一个我最关心的父子进程通信来举例看下,实现一个简单的父子进程通信逻辑,毕竟我们学习的目的就是为了应用,光有理论怎么能称之为合格的博客呢?
父子进程共享内存
运行后打印如下
用mmap创建了一块匿名共享内存区域,fd传入-1和MAP_ANONYMOUS配置实现匿名映射,使用MAP_SHARED创建共享区域,使用fork函数创建子进程,这样来实现子进程通信,通过sprintf将格式化后的数据写入到共享内存中。
通过简单的几行代码就实现了跨进程通信,如此简单,这么强大的东西,背后有什么支撑么?带着问题我们接着一探究竟。
MMAP背后的保护神
说到MMAP的保护神,首页了解下内存页:在页式虚拟存储器中,会在虚拟存储空间和物理主存空间都分割为一个个固定大小的页,为线程分配内存也是以页为单位。比如:页的大小为4K,那么4GB存储空间就需要4GB/4KB=1M条记录,即有多万个4KB的页,内存页中,当用户发生文件读写时,内核会申请一个内存页与文件进行读写操作,如图:
这时如果内存页中没有数据,就会发生一种中断机制,它就叫缺页中断,此中断就是MMAP的保护神,为什么这么说呢?我们知道mmap函数调用后,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存,当访问这些没有建立映射关系的虚拟内存时,CPU加载指令发现代码段是缺失的,就触发了缺页中断,中断后,内核通过检查虚拟地址的所在区域,发现存在内存映射,就可以通过虚拟内存地址计算文件偏移,定位到内存所缺的页对应的文件的页,由内核启动磁盘IO,将对应的页从磁盘加载到内存中。最终保护mmap能顺利进行,无私奉献。了解完缺页中断,我们再来细聊下mmap四种场景下的内存分配原理
四种场景分配原理
上面是一个简单的原理总结,并没有详细的展开,感兴趣可以自己查查资料哈。
以上就是Android开发中技术,非常重要的mmap原理解析,更多Android高级进阶技术;可以参考《Android核心技术手册》里面内容包含几个模块。
本次分享,主要介绍了mmap的四种应用场景,通过一个实例验证了父子进程间的通信,并深入mmap找到它的保护神,且深入了解到mmap在四种场景下,操作系统是如何组织分配,通过对这些的了解,在你之后的mmap实战应用有了更好的理论基础,可以根据不同的需求,不同的性能要求等,选择最合适的实现。
Android开发八大模块学习笔记,带你初探Android系统开发全貌
Android操作系统,自Andy Rubin开发以来,逐渐由Google收购并拓展至包括智能手机、平板电脑在内的多个领域,以其免费、智能和开放性在全球市场份额中占据重要地位。 Android系统庞大,学习内容繁杂,本文将通过八大模块深入讲解,旨在带领初学者全面了解Android系统架构及其运作机制,构建坚实的技术基础。架构师筑基必备技能
深入理解Java泛型
注解使用详解
并发编程实践
数据传输与序列化技术
Java虚拟机原理探索
高效IO操作
Android百大框架源码解析
Retrofit 2.0源码剖析
Okponents或permissions)。