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

整体想法: 替换sdk-28源码中每一个x.java文件为指向软连接LineageOS-16.0对应的x.java

调试前奏(准备)

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.mzph.cn/diannao/61372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析——Python绘制实时的动态折线图

最近在做视觉应用开发&#xff0c;有个需求需要实时获取当前识别到的位姿点位是否有突变&#xff0c;从而确认是否是视觉算法的问题&#xff0c;发现Python的Matplotlib进行绘制比较方便。 目录 1.数据绘制2.绘制实时的动态折线图3.保存实时数据到CSV文件中 import matplotlib.…

Unity 使用 ExcelDataReader 读取Excel表

文章目录 1.下载NuGet包2.通过NuGet包获取dll3.将dll复制unity Plugins文件夹下4.代码获取Excel表内容 1.下载NuGet包 通过NuGet下载&#xff1a; ExcelDataReaderExcelDataReader.DataSet离线下载方法 2.通过NuGet包获取dll 根据编译时程序集找到dll位置&#xff0c;找到与…

【vmware+ubuntu16.04】ROS学习_博物馆仿真克隆ROS-Academy-for-Beginners软件包处理依赖报错问题

首先安装git 进入终端&#xff0c;输入sudo apt-get install git 安装后&#xff0c;创建一个工作空间名为tutorial_ws&#xff0c; 输入 mkdir tutorial_ws#创建工作空间 cd tutorial_ws#进入 mkdir src cd src git clone https://github.com/DroidAITech/ROS-Academy-for-Be…

九、FOC原理详解

1、FOC简介 FOC&#xff08;field-oriented control&#xff09;为磁场定向控制&#xff0c;又称为矢量控制&#xff08;vectorcontrol&#xff09;&#xff0c;是目前无刷直流电机&#xff08;BLDC&#xff09;和永磁同步电机&#xff08;PMSM&#xff09;高效控制的最佳选择…

【MySQL】MySQL中的函数之JSON_KEYS

在 MySQL 中&#xff0c;JSON_KEYS() 函数用于获取 JSON 对象中的所有键名。这个函数非常有用&#xff0c;特别是在你需要知道 JSON 对象中包含哪些键时。下面是一些关于如何使用 JSON_KEYS() 的详细说明和示例。 基本语法 JSON_KEYS(json_doc [, path])json_doc: 要从中提取…

Linux的指令(三)

1.grep指令 功能&#xff1a; 在文件中搜索字符串&#xff0c;将找到的行打印出来 -i&#xff1a;忽略大小写的不同&#xff0c;所以大小写视为一样 -n&#xff1a;顺便输出行号 -v:反向选择&#xff0c;就是显示出没有你输入要搜索内容的内容 代码示例&#xff1a; roo…

2025蓝桥杯(单片机)备赛--扩展外设之DS1302的使用(九)

1.DS1302数据手册的使用 a. DS1302 features: 工作电压&#xff1a;2V-5.5V 通信协议&#xff1a;3线接口&#xff08;CE、IO、SCLK&#xff09; 计时&#xff1a;秒、分、小时、月日期、月、星期、年&#xff08;闰年补偿器期至2100年&#xff09; b.原理图接线说明&#xff…

Leetcode(滑动窗口习题思路总结,持续更新。。。)

讲解题目&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target &#xff0c;找出该数组中满足其和 ≥ target 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。示例: 输入: target 7, nums [2,3,1,2,4,3] 输出: 2 解…

在CentOS中,通过nginx访问php

其实是nginx反向代理到php-fpm&#xff0c;就像nginx反向代理到tomcat。 1、安装PHP-FPM 1.1 安装 yum install php yum install php-fpm php-common 这里只安装了php-fpm&#xff0c;根据需要安装php模块&#xff0c;比如需要访问mysql则添加安装 php-mysqlnd。 1.2 启动…

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统

一、Photino.NET简介&#xff1a; 最近发现了一个不错的框架 Photino.Net 一份代码运行&#xff0c;三个平台 windows max linux &#xff0c;其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。 github:https://github.com/t…

深度学习:神经网络的搭建

深度学习&#xff1a;神经网络的搭建 神经网络的搭建涉及多个步骤&#xff0c;从选择合适的网络架构到定义网络层、设置超参数以及最终的模型训练。下面我将详细介绍这些步骤&#xff0c;并提供一个具体的示例来展示如何使用PyTorch框架构建一个卷积神经网络&#xff08;CNN&a…

编辑器vim 命令的学习

1.编辑器Vim 1.vim是一个专注的编辑器 2.是一个支持多模式的编辑器 1.1见一见&#xff1a; vim 的本质也是一条命令 退出来&#xff1a;-> Shift:q 先创建一个文件 再打开这个文件 进入后先按 I 然后就可以输入了 输入完后&#xff0c;保存退出 按Esc --> 来到最后一…

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…

Python爬虫:如何从1688阿里巴巴获取公司信息

在当今的数字化时代&#xff0c;数据已成为企业决策和市场分析的重要资产。对于市场研究人员和企业分析师来说&#xff0c;能够快速获取和分析大量数据至关重要。阿里巴巴的1688.com作为中国最大的B2B电子商务平台之一&#xff0c;拥有海量的企业档案和产品信息。本文将介绍如何…

10 基于深度学习的目标检测

首次完成时间&#xff1a;2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1&#xff09;程序代码&#xff1a; import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …

Spring WebFlux 高级实战(3-2)

1、SpringBoot 使用 1.1、Spring Core 中的响应式 Spring 生态系统的核心模块是Spring Core 模块。Spring 5.x 引入对响应式流和响应式库的原生支持&#xff0c;其中&#xff0c;响应式库包含RxJava 1/2 和Project Reactor 3。 1.1.1、响应式类型转换支持 为了支持响应式流规…

河道水位流量一体化自动监测系统:航运安全的护航使者

在广袤的水域世界中&#xff0c;航运安全始终是至关重要的课题。而河道水位流量一体化自动监测系统的出现&#xff0c;如同一位强大的护航使者&#xff0c;为航运事业的稳定发展提供了坚实的保障。 水位传感器&#xff1a;负责实时监测河道的水位变化。这些传感器通常采用先进的…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中…

经验笔记:从生成 SSH 密钥到成功连接测试(以Gitee为例)

从生成 SSH 密钥到成功连接测试的经验笔记&#xff08;以Gitee为例&#xff09; 1. 生成 SSH 密钥对 选择合适的加密算法 ED25519&#xff1a; 密钥长度&#xff1a;私钥 256 位&#xff08;32 字节&#xff09;&#xff0c;公钥 256 位&#xff08;32 字节&#xff09;&#…

uni-app Vue3语法实现微信小程序样式穿透uview-plus框架

1 问题描述 我在用 uni-app vue3 语法开发微信小程序时&#xff0c;在项目中使用了 uview-plus 这一开源 UI 框架。在使用 up-text 组件时&#xff0c;想要给它添加一些样式&#xff0c;之前了解到微信小程序存在样式隔离的问题&#xff0c;也在uview-plus官网-注意事项中找到…