Android高级面试_8_热修补插件化等
Android 高级面试:插件化和热修复相关
1、dex 和 class 文件结构
class 是 JVM 可以执行的文件类型,由 javac 编译生成;dex 是 DVM 执行的文件类型,由 dx 编译生成。
class 文件结构的特点:
- 是一种 8 位二进制字节流文件;
- 各个数据按顺序紧密的排列,无间隙;
- 每个类或者借口都单独占据一个 class 文件;
class 文件的文件结构:
1. magic 加密字段
2. minor_version 支持最低版本的jdk
3. major_version 编译使用的jdk版本
4. constant_pool_count 常量池的数量
5. cp_info constant_pool 常量池的结构体,数量不定
6. access_flags 访问级别
7. this_class 当前类
8. super_class 父类
9. interfaces_count 类实现接口的数量
10. fields_count 类成员变量的数量
11. methods_count 类方法的数量
12. method_info methods 类方法的结构体
13. attributes_count 类属性的数量
14. attribute_info attributes 类属性的结构体
dex 文件的结构的特点:
1. 是一种 8 位二进制字节流文件;
2. 各个数据按顺序紧密的排列,无间隙;
3. 一般情况下,整个应用所有 java 源文件都放在一个 dex 文件中。
dex 的文件结构分成 3 个区:
1. 第一个区是 header,包括:1. header_item dex_header 这个结构体,
2. 第二个区是索引区,包括:1. string_id_list dex_string_ids(字符串索引2. type_id_list dex_type_ids(类型索引)3. proto_id_list dex_proto_ids(方法原型索引)4. field_id_list dex_field_ids(域索引)5. method_id_list dex_method_ids(方法索引)
3. 第三个区是数据区,包括:1. class_def_item_list dex_class_defs(类的定义)2. data3. link_data(so)
两者的主要区别:
- class 中只包含了一个 java 文件的信息,dex 中包含了多个 java 文件的的信息;
- dex 中包含了很多类的信息,它会把类的信息进行拆分,然后把拆分后的信息分配到指定的索引区域中。比如方法索引区域就包含了所有类的方法的索引。
2、加固的原理
加固的过程分成几个步骤:
- 要加固的 APK + 壳程序 dex 合成新的 dex;
- 然后用新合成的 dex 替换克 apk 中的 dex 得到新的 APK.
第一步的时候可以对 APK 进行加密,然后在运行时对 APK 进行解密。合成新 APK 的本质过程是对 dex 进行拼接,将 APK 文件附加到 dex 文件后面。因为此时 dex 的信息已经发生了变化,所以需要对 dex 的文件头进行修改,包括魔数、检验码和 SHA-1 签名的修改。本质上拼接的过程可以通过读取二进制数组,然后通过数组拷贝将 APK 附加到 dex 末尾。
第二部就是一个打包的过程。不过这个过程会修改 Manifest 文件,将程序中的 Application 替换掉。替换后的 Application 会在程序启动的时候将我们的 APK 加载进来。下面是 360 加固之后的 Manifest 文件:
加固的过程有些类似于插件化的流程,也是将 APK 解压到磁盘之后,通过反射替换掉 AssertsManager,并将其指向我们解压之后的资源的路径。
360 加固的核心算法在 native 层实现,里面针对不同的平台提供了各种 so 库,运行时在 java 层判断平台版本,调用 so 库。
3、热修复的原理
根据修复的类型分成几种:类的修复,资源修复和 so 修复。
类的修复:
4、插件化的原理
另外
有什么技术问题欢迎加我交流 qilebeaf
本人10多年大厂软件开发经验,精通Android,Java,Python,前端等开发,空余时间承接软件开发设计、课程设计指导、解决疑难bug、AI大模型搭建,AI绘图应用等。
欢迎砸单
相关文章:
Android高级面试_8_热修补插件化等
Android 高级面试:插件化和热修复相关 1、dex 和 class 文件结构 class 是 JVM 可以执行的文件类型,由 javac 编译生成;dex 是 DVM 执行的文件类型,由 dx 编译生成。 class 文件结构的特点: 是一种 8 位二进制字节…...
显卡GTX与RTX有什么区别?哪一个更适合玩游戏?
游戏发烧友们可能对游戏显卡并不陌生,它直接关系到游戏画面的流畅度、细腻程度和真实感。在众多显卡品牌中,英伟达的GTX和RTX系列显卡因其出色的性能而备受关注。 一、GTX与RTX的区别 架构差异 GTX系列显卡采用的是Pascal架构,这是英伟达在…...
QT自定义信号和槽函数
在QT中最重要也是必须要掌握的机制,就是信号与槽机制,在MFC上也就是类型的机制就是消息与响应函数机制 在QT中我们不仅要学会如何使用信号与槽机制,还要会自定义信号与槽函数,要自定义的原因是系统提供的信号,在一些情…...
Atcoder Beginner Contest 359
传送门 A - Count Takahashi 时间限制:2秒 内存限制:1024MB 分数:100分 问题描述 给定 N 个字符串。 第 i 个字符串 () 要么是 Takahashi 要么是 Aoki。 有多少个 i 使得 等于 Takahashi ? 限制 N 是整数。每个…...
无线通讯几种常规天线类别简介
天线对于无线模块来说至关重要,合适的天线可以优化通信网络,增加其通信的范围和可靠性。天线的选型对最后的模块通信影响很大,不合适的天线会导致通信质量下降。针对不同的市场应用,天线的材质、安置方式、性能也大不一样。下面简…...
最大团问题--回溯法
一、相关定义 给定一个无向图 ,其中 V 是图的顶点集,E图的边集 完全图:如果无向图中的任何一对顶点之间都有边,这种无向图称为完全图 完全子图:给定无向图 ,如果 ,且对应任意 且 ,则…...
MBSE之简单介绍
MBSE之简单介绍 文章目录 MBSE之简单介绍1. What is MBSE?2. MBSE 最佳实践 1. What is MBSE? Model-Based Systems Engineering (MBSE), a.k.a. Model-Based Systems Development (MBSD), is a Systems Engineering process paradigm that emphasizes t…...
基于ODPS解析字段值为JSON的情况
最近在使用ODPS数据库,其中一个字段他是用JSON存储的,但是我是需要JSON字符串中的一个属性值就行,刚好ODPS中有一个函数可以用来使用! 使用案例 select GET_JSON_OBJECT({"id":1,"name":"xiaobai"},$.name);…...
CesiumJS【Basic】- #020 加载glb/gltf文件(Primitive方式)
文章目录 加载glb/gltf文件(Primitive方式)1 目标2 代码实现3 资源文件加载glb/gltf文件(Primitive方式) 1 目标 使用Primitive方式加载glb/gltf文件 2 代码实现 import * as Cesium from "cesium";const viewer = new Cesium.Viewer...
2024黑盾杯复现赛题MISC部分
一、一个logo 一张png图片,查看颜色通道即可发现flag 二、 学会Office 最好用联想自带的excel工具查看,我用WPS打开未解出题目 这里会发现有隐藏信息 隐藏信息为宏加密 。去百度了解宏加密后,发现有俩个宏,一个加密一个解密 执…...
Linux0.12内核源码解读(5)-head.s
大家好,我是呼噜噜,好久没有更新old linux了,本文接着上一篇文章图解CPU的实模式与保护模式,继续向着操作系统内核的世界前进,一起来看看heads.s as86 与GNU as 首先我们得了解一个事实,在Linux0.12内核源…...
刷代码随想录有感(119):动态规划——打家劫舍III(树形dp)
题干: 代码: class Solution { public:vector<int>dp(TreeNode* cur){if(cur NULL)return vector<int>{0, 0};vector<int> left dp(cur -> left);vector<int> right dp(cur -> right);//偷int val1 cur -> val l…...
vivado CARRY_REMAP、CASCADE_HEIGHT
CARRY_REMAP opt_design-carry_remap选项可用于将单个carry*单元重新映射到LUT中 提高了布线的设计效果。使用-carry_remap选项时,仅 将单级进位链转换为LUT。CARRY_REMAP属性允许您 指定在优化过程中要转换的长度较大的进位链。 您可以使用控制任意长度的单个进位链…...
Ubuntu磁盘分区和挂载 虚拟机扩容 逻辑卷的创建和扩容保姆及教程
目录 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 2、Linux的磁盘分区和挂载 3、创建逻辑卷和逻辑卷的扩容 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 通过下图可以看出我们的根磁盘一共有20G的大小,现在我们把它扩容为30G 注:如果你的虚拟机有快照是无…...
【附精彩文章合辑】哈佛辍学小哥的创业经历【挑战英伟达!00 后哈佛辍学小哥研发史上最快 AI 芯片,比 H100 快 20 倍!】
前情提要 https://blog.csdn.net/weixin_42661676/article/details/140020491 哈佛辍学小哥的创业经历 一、背景与起步 这位哈佛辍学小哥,名为Chris Zhu,是一位华裔学生,他在2020年进入哈佛大学,攻读数学学士学位和计算机科学硕…...
Oracle CPU使用率过高问题处理
1.下载Process Explorer 2.打开Process Explorer,查看CPU使用情况最高的进程 3.双击该进程,查看详情 \ 4. 获取cpu使用最好的线程tid 5. 查询sql_id select sql_id from v$session where paddr in( select addr from v$process where spid in(1…...
pyqt的QWidgetList如何多选?如何按下Ctrl多选?
通过设置setSelectionMode(QAbstractItemView.MultiSelection),可以实现QWidgetList的多选。 但是上述结果不太符合我们需求。设置多选模式后,只需鼠标点击就可以选择多个条目。 我希望按下Ctrl键时才进行多选,仅鼠标单击的话,只进…...
【电路笔记】-MOSFET放大器
MOSFET放大器 文章目录 MOSFET放大器1、概述2、电路图3、电气特性3.1 ** I D = F ( V G S ) I_D=F(V_{GS}) ID=F(VGS)**特性3.2 I D = F ( V D S ) I_D=F(V_{DS}) ID=F(VDS)特性4、MOSFET放大器5、输入和输出电压6、电压增益7、总结1、概述 在前面的文章中,我们已经…...
Ubuntu 20.04安装显卡驱动、CUDA、Pytorch(2024.06最新)
文章目录 一、安装显卡驱动1.1 查看显卡型号1.2 根据显卡型号选择驱动1.3 获取下载链接1.4 查看下载的显卡驱动安装文件1.5 更新软件列表和安装必要软件、依赖1.6 卸载原有驱动1.7 禁用默认驱动1.8 安装lightdm显示管理器1.9 停止显示服务器1.10 在文本界面中,禁用X…...
wpf 附加属性 RegisterAttached 内容属性
// // 摘要: // 选中时展示的元素 public static readonly DependencyProperty CheckedElementProperty DependencyProperty.RegisterAttached("CheckedElement", typeof(object), typeof(StatusSwitchElement), new PropertyMetadata((object)null…...
laravel8框架windows下安装运行
目录 1、安装前如果未安装先安装Composer 2、使用composer安装laravel8 3、使用内置服务器:8000 的命令去访问测试 4、使用本地环境运行phpstudy配置到public目录下 Laravel官网 Laravel 中文网 为 Web 工匠创造的 PHP 框架 安装 | 入门指南 |《Laravel 8 中文文档 8.x…...
如何快速判断IP被墙
IP被墙是指IP部分地区或者运营商无法被正常进行访问的一个情况。 被墙的原因有很多种不一一列举,由于被墙的时间短的为按周按月计算,时间长的则为按年计算,所以一般这种情况下只能选择更换IP。 检查办法: 第一,确认IP…...
vitest-前端单元测试
Vitest是一个轻量级、快速且功能强大的测试框架,特别适用于Vite项目,但也可以与其他前端项目(如使用webpack构建的项目)集成使用。Vitest提供极速的测试体验,并包含一系列用于编写和组织测试用例的API,如de…...
Redis 7.x 系列【9】数据类型之自动排重集合(Set)
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SADD2.2 SCARD2.3 SISMEMBER2.4 SREM2.5 SSCAN2.6 SDIFF2.7 SU…...
【LeetCode】每日一题:反转链表
题解思路 循环的方法需要注意prev应该是None开始,然后到结束的时候prev是tail,递归的思路很难绕过弯来,主要在于很难想清楚为什么可以返回尾节点,需要多做递归题,以及递归过程中,可以不使用尾节点来找当前…...
使用Spring Boot创建自定义Starter
使用Spring Boot创建自定义Starter 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Spring Boot创建自定义Starter,来简化项目…...
cmd设置编码为utf8
文章目录 临时设置永久设置(通过注册表) cmd命令乱码,解决方案比较简单。 输入chcp, 如果返回的是936,通常是GBK或CP936。 如果返回的是65001,表示是UTF-8。 临时设置 chcp 65001 # 设置 chcp # 查看 永久设置(通过注册表) 打…...
一次关于k8s的node节点NotReady的故障排查
master现象 分析 kubectl get nodes -A 看了下pod的状态,好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址,登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务ÿ…...
Java变量与标识符
一、关键字(Keyboard) 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词) 特点:全部关键字都是小写字母 官方地址: https://docs.oracle.com/javase/tutorial/java/nut…...
AWS无服务器 应用程序开发—第十七章 AWS用户池案例
在AWS Cognito用户池中,用户属性可以根据应用程序的需求进行配置和管理。以下是一般情况下用户属性的一些常见设置: 必须的属性: 用户名(Username):通常用作用户的唯一标识符。 密码(Password…...
无代码做网站/windows优化大师是哪个公司的
原标题:Navicat for SQLite 表外键的秘密武器for SQLite 外键是在关联式表中符合另一个表主键的栏位。在外键选项卡,只需点击外键栏位即可编辑,使用外键工具栏,可创建新的、编辑或删除选定的外键栏位。Navicat for SQLite使用“名…...
国外免费做网站软件/福州整站优化
1、安装git 参考:Git 详细安装教程(详解 Git 安装过程的每一个步骤)_mukes的博客-CSDN博客_git安装 2、下载并安装VS2019 点击官网链接下载community版本,在安装界面勾选C,默认安装路径是C盘,C盘空间不够…...
四川省城乡住房与建设厅网站首页/营销推广公司案例
目录 一:MSMQ的一些理论上的知识二:队列类型(Queue Type)三:安装消息队列四:在C#中Messagequeue class五:MSMQ-发送消息到远程专用队列六:例子一、在学习Messagequeue 类之前,首先介绍一下MSMQ的一些理论上的知识 MSMQ(MicroSoft Message Queue…...
橙子建站网/广告优化
“ 关键字:微信 小程序 ”正文:小程序 会议助手01—会议助手小程序,主要功能可以为参会人介绍公司、介绍议程、带领签到,查询座位等,会议助手。同时为举办方和与会人员提供便利,建立纽带。此会议助手主要针…...
微信二维码生成器在线制作/关键词排名优化品牌
响应 在接收到响应Unirest以对象的形式返回结果时,对于响应细节,该对象应该始终具有与每种语言相同的键。.getStatus() - HTTP响应状态代码(示例:200) .getStatusText() …...
wordpress要用什么代码/济南seo关键词排名工具
系列教程: Python 自动化教程(1) 概述,第一篇 Excel自动化 Python 自动化教程(2) : Excel自动化:使用pandas库 Python 自动化教程(3) : 自动生成PPT文件 Part 1 Python 自动化教程(4) : 自动生成PPT文件 Part 2 Python 自动化教程(5) : …...