自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 Android 安装过程五 MSG_INSTALL消息的处理 安装

安装这个过程还是挺复杂的,最主要的是它将之分成4个阶段:准备、浏览、协调、提交。每个步骤中都有好多代码,并且代码中处理不是只针对普通应用的安装,它是包括其他形式安装的处理,该文章主要是有关普通应用的安装,还是结合了前面文章的例子,将所有的流程过了一遍,其中的相关细节,还没有深究,留待后续继续琢磨。

2024-10-08 23:12:52 1158 1

原创 Android 安装应用-提交阶段之后剩下的操作

该阶段主要就是创建应用需要使用的目录,在更新应用安装情况下,会将代码缓存目录"code_cache"目录及其中文件清除。如果有dex元数据文件(.dm文件)会将它更新到应用的profile中去,如果满足dex优化条件,会执行Dexopt。

2024-09-30 21:31:27 1111

原创 Android 应用安装-提交阶段

提交,就是把这些安装应用的相关信息和状态都放到系统中。对于已安装普通应用,它其实分为两个步骤,先卸载旧包,再安装新包。当然,如果是新安装的应用包,只涉及安装新包这个步骤。在安装过程中会将PackageImpl对象添加到PackageManagerService对象中成员mPackages中,将PackageSetting对象添加到Settings类的成员变量mPackages中的。

2024-09-16 23:57:59 1003

原创 Android 应用安装-协调阶段

Android应用的安装的协调阶段总结如下:对普通APP替换安装的生成一个删除包行为对象。对新生成的PackageSetting对象,验证签名。验证通过之后,将相关信息封装成ReconciledPackage对象,放到返回结果中。对每一个安装应用包,收集共享库信息。

2024-08-04 17:01:09 687

原创 Android 安装应用-浏览阶段

这个浏览阶段主要是得到相关内容封装到ScanRequest对象(包括解析包对象、共享用户对象、旧安装包对象、现在使用PackageSetting对象、禁止的系统PackageSetting对象、旧PackageSetting对象(改包名之前)、真包名、解析标识、浏览标识、是否是系统平台包、用户、CPU ABI参数)中,之后就是调用scanPackageOnlyLI()方法,它主要是创建一个新的PackageSetting对象,并设置相关内容。最后封装成ScanResult对象返回。

2024-08-03 12:03:42 822

原创 Android 安装应用-准备阶段

应用安装准备阶段做的事情1、解析安装包,并且这里是以Cluster方式解析的。2、如果是更新安装,会检查签名。还会检查安装文件中声明的权限和权限组。3、解析包的so包复制到对应目录中,并将使用的ABI和对应的so包路径设置到解析包对象中。4、修改解析包的安装路径和安装位置。5、如果可能,会将安装文件设置FsVerity6、如果更新安装,还会检查签名,这次比上次严格。7、如果更新安装,会设置删除包的信息。8、最后将信息封装到PrepareResult对象中返回。

2024-08-02 13:07:38 1269

原创 Android 安装过程四 MSG_INSTALL消息的处理 安装之前的验证

首先会将相关安装信息封装成一个VerificationParams对象,然后会发送完整性验证、有可能发送包验证请求,之所以说是有可能,是因为它是有条件的。这些条件包括不是V4签名、不是增量安装、系统配置的验证者。还有可能发送应用回退请求。这些请求处理的流程都是相似的,对应的处理者处理完毕会发送应答。如果超时会有超时处理,这里面细节太多,需要好好理解揣摩,以上这些就是安装之前的验证过程。

2024-06-16 22:32:12 1216

原创 Android 安装过程三 MSG_ON_SESSION_SEALED、MSG_STREAM_VALIDATE_AND_COMMIT的处理

该文章主要讲述在安装过程中在PackageInstaller线程中,MSG_ON_SESSION_SEALED、MSG_STREAM_VALIDATE_AND_COMMIT消息的相关处理,其中细节很多,需要静下心来揣摩。

2024-05-04 21:58:21 1535

原创 Android SystemConfig相关

SystemConfig中的内容是读取的/system/etc/sysconfig、/system/etc/permissions、/vendor/etc/sysconfig、/vendor/etc/permissions、/odm/etc/sysconfig、/odm/etc/permissions、/oem/etc/sysconfig、/oem/etc/permissions、/product/etc/sysconfig、/product/etc/permissions、/system_ext/etc/

2024-02-10 01:36:47 1428

原创 Android安装过程二 系统进程中PackageInstallerSession对象的创建

该篇文章主要根据代码讲述在APP安装过程中,系统进程中PackageInstallerSession对象的创建过程,它主要用来保存安装过程中需要的信息,在后续的安装过程中,还会频繁提到该对象。

2023-11-18 00:10:25 870

原创 Android 安装过程一 界面跳转

该篇文章说了安装应用时,相关界面的显示,以及涉及到的Activity的跳转和其作用。其中进行了两次APK的复制,第一次将它复制到包安装进程的私有存储空间中,第二次拷贝到的则是在系统进程中创建的安装APK文件。包安装进程中的APK文件会在DeleteStagedFileOnResult收到应答之后,执行删除,系统进程中的会在之后进行安装的时候,继续处理。

2023-10-31 22:58:56 1762 1

原创 Android 得到安装包的信息

APK安装包里的配置信息都在“AndroidManifest.xml”文件中,通过解析它之后,是放到了ParsingPackageImpl类对象中。ParsingPackageImpl类对象通过自己的toAppInfoWithoutState(),将自己的值生成到ApplicationInfo对象中,而PackageInfo类对象的applicationInfo正是ApplicationInfo对象,并且PackageInfo类对象的其他成员也来自ParsingPackageImpl类对象。

2023-10-25 22:57:13 879

原创 Android 解析APK包

解析apk包信息时,一种是通过apk文件作为参数解析,另外一种是通过apk文件所在目录作为参数来解析。解析出来的类对象是ParsingPackageImpl类型的,它主要解析的是"AndroidManifest.xml"文件,类对象的成员也主要对应配置文件的属性和值。

2023-10-17 22:57:51 1510

原创 Android APK文件完整性验证

APK完整性的校验方式:一种是对应CONTENT_DIGEST_CHUNKED_SHA256(对应摘要算法"SHA-256")或CONTENT_DIGEST_CHUNKED_SHA512(对应摘要算法"SHA-512")算法的摘要验证,它是将参与摘要的数据分成1M字节大小;另外一种是对应CONTENT_DIGEST_VERITY_CHUNKED_SHA256(对应摘要算法"SHA-256"),它将构建Merkle树,它的分块大小是4096字节,并且得到树根的摘要值,拿它和v2分块中的摘要进行比对。

2023-09-01 03:22:31 1419

原创 Android APK文件的签名V2查找、验证

在查找V2签名块时,我们需要了解APK文件的结构,明白签名数据块在中央目录之前存放,并且需要知道签名块的数据结构。在签名验证过程中,更需要熟悉v2分块的数据存储结构形式。通过找到需要签名的数据,签名数据,还有签名算法、公钥。之后,就能使用公钥验签私钥签名的数据。

2023-08-28 02:25:46 2665

原创 Android 提取出Apk的本地库

一、现在我们知道了在什么情况下,会提取本地库文件?解析包不是库并且解析包的extractNativeLibs=true。在上面这种条件下,还要排除掉一种情况:解析包是系统包,并且不是处于更新状态时,也不能提取。二、如何提取本地库文件?主要就是调用copyNativeBinariesForSupportedAbi()来实现的。大致意思就是从压缩包里找到"lib/"开头的文件,然后通过和系统支持的ABI进行比较,找到最合适的ABI,然后确定提取路径,最后再通过合适的ABI,去APK文件中找到对应的包,将

2023-08-21 03:49:24 665

原创 Android EventBus使用优化

官网上看到了推荐使用Subscriber Index在APP产品中。给的理由是更快和避免崩溃。使用Subscriber Index避免用反射在运行时做昂贵的订阅方法的查找。它用注解处理器在编译时查找订阅方法。

2023-08-12 13:19:30 250 2

原创 Android EventBus使用理解

分析完整个框架代码,我们知道EventBus是通过反射来实现订阅方法的注册、订阅方法的执行。通过注解能设置订阅方法的线程调度、优先级、粘性事件。确实使用起来比较简单,代码看起来也比较简洁。它在自己内部实现了线程调度,用户只需设置订阅方法的线程调度模式即可。

2023-08-11 19:04:16 218

原创 Android UserManagerService初始化

Android UserManagerService初始化,它主要设置用户类型,得到用户数据。在最开始不存在/data/system/users/userlist.xml的情况下,会回落到单用户模式。生成用户以后,它会将用户信息保存成/data/system/users/id.xml,将用户列表保存成/data/system/users/userlist.xml。他还会得到系统包能被哪些用户类型安装。

2023-08-07 03:58:44 536

原创 RxJava/RxAndroid源码使用理解

Rx是Reactive Extensions,RxJava就是响应式扩展在Java上的实现。它主要通过观察者模式解决了接口回调嵌套阅读复杂的问题,实现链式调用简洁易读的特点。它还实现了适合不同任务的线程,像计算型,IO型,普通型,方便用户选择。

2023-07-31 00:52:32 153

原创 Android 窗口结构(二) 添加Home Task

Android层次结构构造完成之后,需要添加第一个任务HomeTask。HomeTask是Launcher应用所在的任务,该篇文章就试着分析一下添加Home Task的源代码,Task对象都是通过建造者模式创建的,分析完之后,对其他任务的创建也是有帮助的。

2022-11-21 21:13:11 1852 1

原创 Android 窗口结构(一) 窗口层级构造

Android窗口是根据显示屏幕来管理,每个显示屏幕的窗口层级分为37层,0-36层。每层可以放置多个窗口,上层窗口覆盖下面的。要理解窗口的结构,需要学习下WindowContainer、RootWindowContainer、DisplayContent、TaskDisplayArea、Task、ActivityRecord、WindowToken、WindowStateWindowContainer等类。

2022-11-14 22:35:34 5220

原创 Android LayoutInflater from(@UiContext Context context)

其实不止LayoutInflater实例,是这样实现的。像其他的ActivityManager、ActivityTaskManager、AccessibilityManager等实例都是通过类似这样的一种方式实现的。这样就通过设计形式,将这些实例的获取方式统一了起来。这也是值得我们学习的。

2022-09-21 22:13:49 1142

原创 Android 内存紧张,回收Activity,那它的进程呢?

Activity和进程一块销毁

2022-08-26 22:32:23 885

原创 Android Binder事务调用方法梳理

Android Binder事务调用方法梳理

2022-08-22 09:07:09 390

原创 Android 源码编译问题总结

Android编译源代码问题记录

2022-07-30 19:02:50 4950

原创 Android 二进制XML文件格式XML

BinaryXmlSerializerForcedTypedXmlSerializer 代理类 它代理FastXmlSerializerFastXmlSerializer

2022-06-12 11:24:28 2408

原创 Android 找到资源的内存数据位置

  Android 得到主题中对应的属性的结果或自己设置的style中的结果该文在说GetBag(uint32_t resid, std::vector<uint32_t>& child_resids)的时候,会通过FindEntry(resid, 0u /* density_override /, false / stop_at_first_match /, false / ignore_configuration */)会得到一个ResTable_map_entry结构的数据指针。该

2022-05-20 20:32:15 765

原创 Android 得到主题中对应的属性的结果或自己设置的style中的结果

接着分析AttributeResolution类的ApplyStyle()函数

2022-05-18 10:45:24 827

原创 Android TypedArray简单分析(二)源代码分析

源代码分析  从Context类的obtainStyledAttributes()方法一直往下看, /** * Retrieve styled attribute information in this Context's theme. See * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)} * for more i

2022-05-02 22:24:56 2446

原创 Android WatchedArrayMap

WatchedArrayMap从它的名字可以知道它是一个被观察的ArrayMap,它有一个成员变量是Watcher类型的mObserver,这个类型是一个观察者。如果它里面的值是Watchable类型的,值发生改变可以向mObserver报道改变,这个时候WatchedArrayMap就知道了有数据改变,并且通过参数可以知道是哪个数据发生了改变。

2022-04-22 10:13:48 222

原创 Android PropertyInvalidatedCache分析

PropertyInvalidatedCache类说明  该类是为了优化改动不频繁的数据在进程间交互使用的。Android大多进程间交互,使用了Binder机制。每次交互数据都需要Binder调用,但是对于那些很少改动的数据,每次都使用Binder调用,开销是不小的。该类会在首次Binder调用之后,会将结果缓存到本地,之后如果Server端数据一直都没有改动,那Client就会一直使用本地缓存。如果数据发生了改变,那么下次客户端再获取数据的时候,又会通过Binder调用获取最新的数据,再缓存,后续又会使

2022-04-19 16:40:39 1341

原创 Android MUTF-8转化为UTF-16

public static Byte[] decode(byte[] src) { int len = src.length; List<Byte> res = new ArrayList<>(); for (int i = 0; i < len; i++) { if (src[i] > 0 && src[i] < 127) { res.a...

2022-03-20 18:31:51 2610

原创 Android Binder机制的一次数据拷贝

  传统进程间的交互需要先将数据从用户态拷贝到内核态,然后在内核态将数据拷贝到对应的进程申请的内存中,对应的进程再将数据从内核态拷贝到用户态。

2022-03-07 17:18:46 3816

原创 Android Binder getCallingUid() getCallingPid()

Binder getCallingUid() getCallingPid() 返回?  Android在进程间交互的时候,会使用Binder机制。在Binder交互过程中,通过Binder.getCallingUid()、Binder.getCallingPid()得到调用方的UID和进程PID。 /** * Return the ID of the process that sent you the current transaction * that is being pr

2022-02-27 16:38:52 7448

原创 Android C++ Parcel

成员变量mData是存储数据的内存,mDataSize是数据的大小,mDataCapacity是存储内存的容量,mDataPos是数据的位置。mObjects是为了保存Binder类对象使用的,mObjectsSize数据里面保存的Binder类对象的数量,mObjectsCapacity是内存中可以保存Binder类对象的大小容量。成员变量mOwner是释放内存的方法,可能设置,也可能不设置。ServiceManager IBinder b = ServiceManager.getServiceOr

2022-02-24 21:58:23 2801

原创 Android TypedArray简单分析(一)使用

每次看View源码的时候总能在构造函数那块看到TypedArray,看一下常用的方法 /** * Retrieve styled attribute information in this Context's theme. See * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)} * for more informati

2021-11-23 17:29:25 4482

原创 Android 查找最近的可以获取焦点的控件(二) 未指明控件下一个查找属性的查找

该篇文章承接Android 查找最近的可以获取焦点的控件(一)findNextFocus()第3步将其相关代码摘录如下: focusables.clear(); effectiveRoot.addFocusables(focusables, direction); if (!focusables.isEmpty()) { next = findNextFocus(effectiveRoot, focu

2021-11-11 23:25:00 2737

原创 Android 查找最近的可以获取焦点的控件(一) 指明控件下一个查找属性的查找

/** * Find the nearest view in the specified direction that can take focus. * This does not actually give focus to that view. * * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT * * @return The ne...

2021-11-11 23:20:30 3734

原创 Android 控件获取焦点

请求焦点  方法requestFocus()代码如下: public final boolean requestFocus() { return requestFocus(View.FOCUS_DOWN); } public final boolean requestFocus(int direction) { return requestFocus(direction, null); } public boolean reque

2021-11-07 00:23:01 8760 1

Android系统配置相关平台xml文件

Android平台系统配置相关xml文件 在/system/etc/permissions目录下 可以用来理解代码使用,作为参考

2024-02-06

Windows10_WMVCORE.DLL

如果win10里WMVCORE.DLL找不到了,其他的修复方法都试过了还不行,可以试试直接将该文件放到 C:\Windows\System32\。然后建立文件,regis.bat,向其中复制如下 @echo 开始注册 regsvr32 %windir%\system32\WMVCore.dll /s @echo dll注册成功 @pause 保存,执行。

2022-08-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除