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

news2024/11/18 15:00:33

调试前奏(准备)

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.coloradmin.cn/o/2242872.html

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

相关文章

基于Java Springboot拍卖行系统

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

HTML5+CSS前端开发【保姆级教学】+前端介绍和软件安装

学习了基础编程刚刚开始学习计算机的程序员&#xff0c;你是否会这样的想法:前端和后端是什么呢&#xff1f;如果你是刚上大学的大一大二基础小白&#xff0c;但是身边的卷王同学已经超前知道之后要从事前后端开发了&#xff0c;并且在学习各种框架的课程&#xff0c;Aahhahah,…

Android Framework层介绍

文章目录 前言一、Android Framework 层概述二、主要组件1. 应用程序接口&#xff08;API&#xff09;2. 系统服务3. Binder4. 资源管理5. Content Provider6. 广播接收器&#xff08;BroadcastReceiver&#xff09;7. 服务&#xff08;Service&#xff09; 三、与 Linux Kerne…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字&#xff0c;我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

【paper】分布式无人水下航行器围捕智能目标

An Effective Strategy for Distributed Unmanned Underwater Vehicles to Encircle and Capture Intelligent Targets2022.8IEEE TRANSACTIONS ON INDUSTRIAL ELECTRONICS【Q1 7.5】Mingzhi Chen 上海理工大学 Q1 Background&#xff1a;本文试图解决一个什么样的问题&#xf…

【更新中】《硬件架构的艺术》笔记(三):处理多个时钟

介绍 单时钟设计更易于实现&#xff0c;也更少出现亚稳态、建立和保持时间违例方面的问题。但在实践中&#xff0c;很少有设计只在一个时钟下运行。 多时钟域 多个始终可以有以下一种或多种时钟关系&#xff1a; 1、时钟频率不同。 2、时钟频率相同&#xff0c;但相位不同…

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

从客户需求视角去认识ZLG | 边缘计算网关多种应用

在工业领域&#xff0c;串行总线与EtherNET总线广泛应用&#xff0c;物联网的兴起带来众多智能应用。尽管应用多样&#xff0c;但底层技术逻辑却殊途同归&#xff0c;本文将介绍ZLG致远电子串行总线和EtherNET总线之间的联动应用。 本文将从系统集成需求出发&#xff0c;以ZLG致…

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter&#xff0c;一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同&#xff0c;返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…

Linux下使用miniconda构建python运行环境

文章目录 miniconda安装构建python运行环境 miniconda安装 miniconda在linux环境下载安装&#xff1a; # Linux环境下使用wget命令下载选定的miniconda # 这里使用的是清华镜像&#xff0c;这个命令每次下载的是最新版本的miniconda wget -c https://mirrors.tuna.tsinghua.e…

解决failed to execute PosixPath(‘dot‘) 或者GraphViz‘s executables not found

在网上找了很多方法都没解决&#xff0c;所以写一篇文章帮助和我遇到同样问题的人 解决方法&#xff1a; 因为python解释器会解释转移字符&#xff0c;因此在环境变量中把\bin换成\\bin即可 解决过程&#xff1a; 系统&#xff1a;win10 已安装pip install graphviz&#xff0…

Deep-Live-Cam -面部交换、视频深度伪造

文章目录 一、关于 Deep-Live-Cam免责声明 二、安装&#xff08;Windows/Nvidia&#xff09;安装&#xff08;手动&#xff09;基本安装&#xff08;CPU&#xff09; GPU加速&#xff08;可选&#xff09;CUDA执行提供商&#xff08;Nvidia&#xff09;CoreML执行提供商&#x…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Scala-数据类型-概述(Scala 3.x 类型层次结构)

Scala Scala-数据类型 Scala1. Any — 顶级类型2. Matchable — 匹配类型3. AnyVal — 值类型的父类4. AnyRef — 引用类型的父类5. Null - 引用类型的子类型Tips: 为什么 null 不推荐使用&#xff1f; 6. Nothing - 底层类型 (Bottom Type)整理不易&#xff0c;对您有帮助的话…

嵌入式linux中红外接收基本方法分析

大家好,今天主要给大家分享一下,如何使用Linux系统中的红外接收驱动控制方法。 第一:Linux红外基本简介 红外遥控是我们常见的一种无线收发设备,具有抗干扰能力强,功耗低,成本低,易实现等优点。被很多电子设备特别是家用电器广泛采用,如电视遥控、空调遥控等。红外遥控…

AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows

在 Windows 平台上的实现&#xff0c;相对比较顺利&#xff0c;将一个窗口嵌入到另外一个窗口是比较容易的事情。 1. 创建窗口 这里有点需要注意&#xff1a; 父窗口的大小变化时&#xff0c;子窗口也要跟着变化&#xff0c;否则 webview 显示不出来。创建时窗口的大小先设置…

pgAdmin简单介绍

pgAdmin介绍 官网&#xff1a;https://www.pgadmin.org/ pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. pgAdmin may be used on Linux, Unix…

Linux笔记---调试工具GDB(gdb)

1. gdb的概念 GDB&#xff0c;全称GNU Debugger&#xff0c;是一个功能强大的开源调试工具&#xff0c;广泛用于Unix和类Unix系统&#xff0c;以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况&#xff0c;帮助定位和修复程序中的错误。 gd…

如何在 Ubuntu 上安装 Mattermost 团队协作工具

简介 Mattermost 是一个开源、自托管的通信平台&#xff0c;专为团队协作设计。它类似于 Slack&#xff0c;提供聊天、消息传递和集成功能。Mattermost 在重视数据隐私的组织中特别受欢迎&#xff0c;因为它允许团队在自己的服务器上管理通信。以下是 Mattermost 的一些关键特…

2. Django中的URL调度器 (自定义路径转换器)

在 Django 中&#xff0c;URL 路由通常使用路径转换器&#xff08;path converters&#xff09;来匹配和捕获 URL 中的特定模式&#xff0c;例如整数、字符串或 slug 等。默认情况下&#xff0c;Django 提供了一些内置的路径转换器&#xff0c;如 <int>、<str>、&l…