android9-sdk-28源码替换为-Lineageos-9源码-android-studio-4.2调试LineageOS-16.0的view绘制流程

调试前奏(准备)

android-studio-4.2并不像老版本android-studio那样容易替换api源文件路径

android-studio-4.2:

  • 在Project Structure不能设置api(如28)的源码路径
  • 在x.class的反编译窗口,并没有提供选择源码路径的界面

因此 以下记录 简单粗暴的替换android-studio-4.2的android-sdk-manger中api(android9, api28)的源码为LinageOS-16.0(android9,api28)的方法

1. android studio 4.2 下载api 28源码

android-studio-4.2 --> Tools --> sdk manager --> show package details --> android 9.0 (pie) --> sources for android 28

2. 寻找下载的源码目录路径

下载的源码目录为android-sdk-home/sources/android-28

find ~/ -type f -name "*.xml"  | while read k ; do ( grep -Hn "/sources/" $k ;) ; done
/home/z/.config/Google/AndroidStudioPreview4.2/options/jdk.table.xml:65:            <root url="file:///app5/android-sdk-home/sources/android-35" type="simple" />
/home/z/.config/Google/AndroidStudioPreview4.2/options/jdk.table.xml:120:            <root url="file:///app5/android-sdk-home/sources/android-28" type="simple" />

3. android9(pie)源码目录与LinageOS16.0源码frameworks/base/core*.java差异

只做了一边差集(L中的每一个在A中有无情况),另一边TODO

( cd /app5/OP3TLos16Build/frameworks/base/core/java && find .  -type f -name "*.java" ;) | while read k ; do (  cd /app5/android-sdk-home/sources/android-28/ && [[ ! -f $k ]] && echo $k     ;); done 
./android/app/NotificationGroup.java
./android/database/sqlite/SQLiteTokenizer.java
./android/view/WindowManagerPolicyControl.java
./com/android/internal/os/DeviceKeyHandler.java
./com/google/android/collect/Lists.java
./com/google/android/collect/Maps.java
./com/google/android/collect/Sets.java
./com/google/android/util/AbstractMessageParser.java
./com/google/android/util/Procedure.java
./com/google/android/util/SmileyParser.java
./com/google/android/util/SmileyResources.java
./com/nvidia/NvAppProfiles.java
./com/nvidia/NvAppProfileService.java
./com/nvidia/NvConstants.java
./com/nvidia/NvCPLSvc/NvAppProfile.java
./com/nvidia/NvCPLSvc/NvSaverAppInfo.java
./com/nvidia/NvWhitelistService.java
./com/nvidia/profilemanager/NvAppProfileSettingId.java
./com/nvidia/profilemanager/ProfileTypeId.java

4. LinageOS16.0源码frameworks/base/core每个*.java文件 覆盖 android9(pie)源码目录的对应文件

LosD=/app5/OP3TLos16Build/frameworks/base/core/java
AnD=/app5/android-sdk-home/sources/android-28/
( cd $LosD && find .  -type f -name "*.java" ;) | while read k ; do (   rm $AnD/$k && ln -s  $LosD/$k  $AnD/$k   ;); done 

find $AnD -type l | wc -l == 2537

find $LosD -type f -name "*.java" | wc -l ==2556

比如
file /app5/android-sdk-home/sources/android-28/android/view/ViewRootImpl.java
/app5/android-sdk-home/sources/android-28/android/view/ViewRootImpl.java: symbolic link to /app5/OP3TLos16Build/frameworks/base/core/java/./android/view/ViewRootImpl.java

还原方法: 重做1 卸载、安装 即可还原

5. 此时android-studio-4.2即可调试LinageOS16.0的frameworks/base/core

而不是 调试 AOSP的frameworks/base/core

android-studio-4.2打开 比如 /app5/android-sdk-home/sources/android-28/android/view/ViewRootImpl.java 在以下方法加断点,即可调试view的绘制流程

performMeasure

performLayout

performDraw

4B. LinageOS16.0源码frameworks/support/v7/appcompat/src/main/java/androidx每个*.java文件 覆盖 android9(pie)源码目录的对应文件

androidx下x.java文件个数 二者相差不多

AOSP api28(android9): find /app5/android-sdk-home/sources/android-28/androidx -type f -name "*.java" |wc -l ==2452

LineageOS16.0(android9)find /app5/OP3TLos16Build/frameworks/ -type f -path "*/androidx/*/*.java" | wc -l ==2593

但是

但是LineageOS16.0/frameworks/下的androidx是分散的, 则有可能有重复,理想做法是遍历 AOSP api28(android9) 这边(虽然也一样可能捞错) 但至少脚本更容易点

find /app5/OP3TLos16Build/frameworks/ -type d -name "androidx" | while read k ; do ( c=$(find $k -type f -name "*.java" | wc -l) && [[ $c -gt 20 ]] && echo "$k: $c" ;); done

/app5/OP3TLos16Build/frameworks/base/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx: 80
/app5/OP3TLos16Build/frameworks/support/annotations/src/main/java/androidx: 53
/app5/OP3TLos16Build/frameworks/support/car/src/androidTest/java/androidx: 21
/app5/OP3TLos16Build/frameworks/support/car/src/main/java/androidx: 36
/app5/OP3TLos16Build/frameworks/support/compat/src/androidTest/java/androidx: 66
/app5/OP3TLos16Build/frameworks/support/compat/src/main/java/androidx: 177
/app5/OP3TLos16Build/frameworks/support/emoji/core/src/androidTest/java/androidx: 32
/app5/OP3TLos16Build/frameworks/support/emoji/core/src/main/java/androidx: 24
/app5/OP3TLos16Build/frameworks/support/fragment/src/androidTest/java/androidx: 44
/app5/OP3TLos16Build/frameworks/support/leanback/src/androidTest/java/androidx: 87
/app5/OP3TLos16Build/frameworks/support/leanback/src/main/java/androidx: 217
/app5/OP3TLos16Build/frameworks/support/media/src/main/java/androidx: 43
/app5/OP3TLos16Build/frameworks/support/mediarouter/src/main/java/androidx: 30
/app5/OP3TLos16Build/frameworks/support/preference/src/main/java/androidx: 36
/app5/OP3TLos16Build/frameworks/support/recyclerview-selection/src/androidTest/java/androidx: 36
/app5/OP3TLos16Build/frameworks/support/recyclerview-selection/src/main/java/androidx: 33
/app5/OP3TLos16Build/frameworks/support/room/common/src/main/java/androidx: 22
/app5/OP3TLos16Build/frameworks/support/room/integration-tests/testapp/src/androidTest/java/androidx: 78
/app5/OP3TLos16Build/frameworks/support/slices/view/src/main/java/androidx: 24
/app5/OP3TLos16Build/frameworks/support/transition/src/androidTest/java/androidx: 28
/app5/OP3TLos16Build/frameworks/support/transition/src/main/java/androidx: 58
/app5/OP3TLos16Build/frameworks/support/v7/appcompat/src/androidTest/java/androidx: 89
/app5/OP3TLos16Build/frameworks/support/v7/appcompat/src/main/java/androidx: 130
/app5/OP3TLos16Build/frameworks/support/v7/recyclerview/src/androidTest/java/androidx: 84
/app5/OP3TLos16Build/frameworks/support/v7/recyclerview/src/main/java/androidx: 38
/app5/OP3TLos16Build/frameworks/support/wear/src/androidTest/java/androidx: 31
/app5/OP3TLos16Build/frameworks/support/wear/src/main/java/androidx: 42
/app5/OP3TLos16Build/frameworks/support/webkit/src/main/java/androidx: 29
/app5/OP3TLos16Build/frameworks/support/work/workmanager/src/androidTest/java/androidx: 45
/app5/OP3TLos16Build/frameworks/support/work/workmanager/src/main/java/androidx: 103

经过检验Los16.0/frameworks/*/androidx/*.java大部分无重复(有一个重复)

LosD=/app5/OP3TLos16Build/frameworks/
AnD=/app5/android-sdk-home/sources/android-28/androidx#直接书写版(太慢了)
( cd $AnD && find .  -type f -name "*.java" ;) | while read k ; do ( k2="androidx/${k/.\//}"  && cd $LosD && c=$(find . -path "*$k2"|wc -l) && [[ $c -ge 2 ]] && echo "$k2:$c"     ;); done#(等效加速版)
LosDJLsF=/tmp/LosD-java.txt
( cd $LosD && find .  -type f -name "*.java" -path "*/androidx/*" | tee $LosDJLsF 1>/dev/null ;)( cd $AnD && find .  -type f -name "*.java" ;) | while read k ; do ( k2="androidx/${k/.\//}"  &&  c=$(grep -E "*$k2" $LosDJLsF|wc -l) && echo -n ",$c" && [[ $c -ge 2 ]] && echo -e "\n,$k2:$c,\n"     ;); done

有一个重复androidx/work/impl/utils/taskexecutor/InstantTaskExecutorRule.java:2

执行软链接: ASOP9(api28)/sources/androidx/.java --> LineageOS16.0(android9,api18)/frameworks//androidx/*.java


LosD=/app5/OP3TLos16Build/frameworks/
AnD=/app5/android-sdk-home/sources/android-28/androidx#直接书写版(太慢了)
( cd $AnD && find .  -type f -name "*.java" ;) | while read k ; do ( k2="androidx/${k/.\//}"  && cd $LosD && fL=$(find . -path "*$k2") && echo -e "${fL}\n" && fLF=$LosD/$fL && fAF=$AnD/$k && rm -v $fAF && ln -s $fLF $fAF   && ls -lh $fAF  ;); done#(等效加速版)
LosDJLsF=/tmp/LosD-java.txt
( cd $LosD && find .  -type f -name "*.java" -path "*/androidx/*" | tee $LosDJLsF 1>/dev/null ;)( cd $AnD && find .  -type f -name "*.java" ;) | while read k ; do ( k2="androidx/${k/.\//}"  &&  fL=$(grep -E "*$k2" $LosDJLsF) &&  echo "$fL" && fLF=$LosD/$fL && fAF=$AnD/$k && rm -v $fAF && ln -s $fLF $fAF   && ls -lh $fAF   ;); done

检查成果、有无伤害

无伤害 find $LosD -type l -name "*.java" | wc -l == 0

成果大约正常 find $AnD -type l -name "*.java" | wc -l ==2441

android9 view绘制流程理解笔记

被调试的布局树 截图0

测量

android/view/ViewRootImpl.java/performMeasure 调用 XLayout.onMeasure

  • android/widget/FrameLayout.java/onMeasure循环对每个?元素?做测量? 截图1

  • android/widget/LinearLayout.java/onMeasure直接调用measureVertical中循环对每个?元素?做测量 截图2, 截图3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18357.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献&#xff1a;蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…

Uni-APP+Vue3+鸿蒙 开发菜鸟流程

参考文档 文档中心 运行和发行 | uni-app官网 AppGallery Connect DCloud开发者中心 环境要求 Vue3jdk 17 Java Downloads | Oracle 中国 【鸿蒙开发工具内置jdk17&#xff0c;本地不使用17会报jdk版本不一致问题】 开发工具 HBuilderDevEco Studio【目前只下载这一个就…

Unity-Editor扩展Odin + 自定义EditorWindow记录

没有上下文&#xff0c;可能你不知道这是什么&#xff08;关于Odin Inspector) 在写一个 Odin 插件的完整文章&#xff0c;卡了三天&#xff0c;之后会放出 使用Unity的人之中 1/10 可能会使用Editor扩展&#xff0c;而这之中的又1/10的 人可能会用Odin这个Editor的附加扩展 -…

FIFO系列 - FIFO使用中需要注意的若干问题

FIFO使用中需要注意的若干问题 文章目录 FIFO使用中需要注意的若干问题前言场景1:包数据FIFO设计之冗余法场景2、FIFO数据传输之流控总结前言 场景1:包数据FIFO设计之冗余法 场景:类似图像、文字等码流数据是不需要重复被访问的,因此使用FIFO进行缓存(如果需要被存储,一…

计算机毕业设计 | springboot+vue大学城水电管理系统 校园学校物业水电管理(附源码+文档)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学城水电管理系统的相关信息成…

5-对象的访问权限

对象的访问权限知识点 对象的分类 在数据库中&#xff0c;数据库的表、索引、视图、缺省值、规则、触发器等等、都可以被称为数据库对象&#xff0c;其中对象主要分为两类 1、模式(schema)对象&#xff1a;模式对象可以理解为一个存储目录、包含视图、索引、数据类型、函数和…

药方新解:Spring Boot中药实验管理系统设计

3系统分析 3.1可行性分析 通过对本中药实验管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中药实验管理系统采用SSM框架&#xff0c;JAVA作为开发语…

动态规划-完全背包问题——279.完全平方数

1.题目解析 题目来源 279.完全平方数——力扣 测试用例 2.算法原理 1.状态表示 完全背包问题通常都是使用一个二维数组来表示其状态&#xff0c;这里是 dp[i][j]&#xff1a;在[1,i]区间选择平方数&#xff0c;当此时已选择平方数的总和完全等于j时所选择的最小平方数个数 …

二叉树的层序遍历

一、题目 给定一个二叉树&#xff0c;返回该二叉树层序遍历的结果&#xff0c;&#xff08;从左到右&#xff0c;一层一层地遍历&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,null,null,15,7}, 该二叉树层序遍历的结果是 [[3],[9,20],[15,7]] 二、解决方案 2.0 树…

模型训练过程的显存占用实测

依赖项说明 pip install nvitop pip install timm pip install peft后续的显存占用数据截图&#xff0c;均基于nvitop命令实现 1、模型显存占用说明 1.1 理论占用值 在 一文讲明白大模型显存占用&#xff08;只考虑单卡&#xff09;与大模型显存占用分析都对模型训练过程中…

后端分层解耦

引入 在上篇所举的例子中&#xff0c;我们将所有的代码均放在HelloControl方法之中&#xff0c;这样会导致代码的复用性、可读性较差&#xff0c;难以维护。因此我们需 三层架构 在之前的代码中&#xff0c;代码大体可以分为三部分&#xff1a;数据访问、数据逻辑处理、响应数…

AIGC 入门全攻略:开启智能创作新时代

一、AIGC 初印象 AIGC&#xff0c;即人工智能生成内容&#xff0c;是继专业生产内容&#xff08;PGC&#xff09;、用户生产内容&#xff08;UGC&#xff09;之后的新型内容创作方式。它涵盖了文本生成、图像与视频创作、音频生成等多个领域&#xff0c;正在以惊人的速度改变着…

约克VRF地暖中央空调,让你舒适过冬

想要冬季过得舒服&#xff0c;采暖必须要到位&#xff01;对于没有集中供暖的南方地区来说&#xff0c;冬季室内阴冷刺骨。 选购地暖中央空调时&#xff0c;强效制热的能力必不可少&#xff0c;让我们可以享受温暖的室内温度&#xff0c;有效减少室内忽冷忽热的温度变化。 约克…

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者&#xff1a;来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板&#xff0c;这些配置和仪表板旨在通过 Elastic Observ…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统&#xff0c;旨在通过技能匹配的方式对招聘信息进行分析与预测&#xff0c;帮助求职者根据自身技能找到最合适的职位&#xff0c;同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

安装 python-pcl 遇到的问题

安装python-pcl 成功安装错误尝试尝试一尝试二尝试三 本人环境 Ubuntu 22.04.4LTS ros2-humble cpython 3.0.11 python 3.10.12 libpcl-dev 1.12.1dfsg-3build1 pcl-tools 1.12.1dfsg-3build1 代码摘抄来源&#xff1a;Breadcrumbsouster-ros-extras/scripts/ros2_pcl_filters.…

【C++进阶篇】——string类的使用

文章目录 前言&#xff1a;1. string的介绍2. string类对象的常见构造3. string类对象的容量操作4. string类对象的访问5. 迭代器6. string类对象的修改操作7. string类对象的字符串运算8.string类成员函数9.string类非成员函数10.string类常量成员 前言&#xff1a; std::str…

vmware虚拟机给创建的centos扩展磁盘步骤

1.先看看原来的磁盘信息&#xff0c;目前磁盘是20g的&#xff0c;重点关注红色箭头指向的地方&#xff0c;一个17g 可用11g&#xff0c;接下来要对其进行扩展 df -h2.关闭当前虚拟机&#xff0c;先进行磁盘扩展&#xff0c;目前我扩展到了50g。 3.重新开启虚拟机&#xff0c;…

开源物业管理系统助力智能社区提升服务效率与用户体验

内容概要 开源物业管理系统是一种灵活、智能的解决方案&#xff0c;专为社区物业管理而生。随着智能社区的发展&#xff0c;这种系统变得越来越重要。它不仅帮助物业管理者高效地处理日常事务&#xff0c;还提升了居民的生活体验。在这个日新月异的时代&#xff0c;开源物业管…