Android8.1去除user模式下允许usb设备连接提示框

 分类:Android, Java 阅读 (8)  Android8.1去除user模式下允许usb设备连接提示框已关闭评论
5月 262020
 

去除下图所示提示框:

修改文件:frameworks/base/services/usb/java/com/android/server/usb/UsbDebuggingManager.java

增加import头

在处理MESSAGE_ADB_CONFIRM消息那一段,把startConfirmation(key, mFingerprints);去掉,改成如下代码

 

 Posted by on 2020-05-26

Android组件绘制流程

 分类:Android, Java 阅读 (13)  Android组件绘制流程已关闭评论
5月 212020
 

首先是在ViewRootImpl.java中的performTraversals中开始的?

最主要的有三个子函数

performMeasure、performLayout、performDraw

这三个函数分别对应View中的onMeasure、onLayout、onDraw

其中onMeasure是为了计算view的宽度和高度

onLayout是为了给子组件设置尺寸和位置

onDraw是具体的窗体绘制函数

 Posted by on 2020-05-21

Choreographer学习记录

 分类:Android, Java 阅读 (20)  Choreographer学习记录已关闭评论
5月 202020
 
一、官方介绍

Choreographer是用于协调动画、输入和绘图的时间的。

Choreographer从显示子系统接收时间脉冲(比如垂直同步),然后安排下一个显示帧渲染工作。

应用通常通过动画框架和视图层次结构的高级抽象方法与choreographer进行交互。下面是一些可以通过高级api可以做的操作:

使用android.animation.ValueAnimator#start

未完……

二、Choreographer可以协调的操作类型

1. CALLBACK_INPUT = 0

输入回调,最先执行的,优先级比较高

2. CALLBACK_ANIMATION = 1

动画回调,在traversals之前运行

3. CALLBACK_TRAVERSAL = 2;

遍历回调,处理layout和draw,在所有的异步信息处理之后运行。

4. CALLBACK_COMMIT = 3;

处理frame的post-draw操作。在traversal操作完成后运行。

三、Choreographer是如何管理各种回调的

是由一个CallbackRecord组成的链表来记录要执行的各种回调的

是由一个CallbackQueue数组来管理这些链表的(添加、删除),每一种回调类型一个CallbackQueue

mHead是第一个CallbackRecord,执行时间最近的一个

为什么要重新写一个CallbackQueue?

因为这个队列使用的很频繁,所以自己封装一个轻量级的Queue

四、Choreographer是如何与上层Api交互的

如上图:上层框架创建Choreographer的实例,并循环进行调用

五、mCallbackPool对象的使用(性能优化)

其中obtainCallbackLocked是用于试图新建一个CallbackRecord,recycleCallbackLocked是用于回收一个CallbackRecord

重复利用mCallbackPool,尽量避免重复创建CallbackRecord

六、为什么不用Handler管理?

因为它还有自己其他的业务逻辑,比如CallbackQueue。

 

 Posted by on 2020-05-20

Android应用首次启动慢原因分析

 分类:Android, Java 阅读 (22)  Android应用首次启动慢原因分析已关闭评论
5月 192020
 
1. 起动的时候会启动一个闪屏

见AppWindowContainerController.java中的addStartingWindow函数

刚启动程序时,会先弹出一个Activity,那个其实不是主Activity,是framework层创建的一个临时Activity

在开发手机应用时startingWindow是不能去掉的,所以现在一般采取的方案是启动透明窗体或者先启动一个图片闪屏界面

在开发定制系统时,可以去掉,但是点击按钮后过几百毫秒后才会显示Activity,去掉的方法:

在AppWindowContainerController.java中的addStartingWindow函数中提前return false

2. 匹配语言时速度很慢

见ResourceImpl.java中的updateConfiguration函数

如果你的应用只有中文,可以在AndroidManifest.xml中的Activity的节点中增加android:configChanges=”locale”以优化?

3. Choreographer.java中的doFrame函数

 

 Posted by on 2020-05-19

ResourceImpl.java中updateConfiguration函数耗时分析

 分类:Android, Java 阅读 (19)  ResourceImpl.java中updateConfiguration函数耗时分析已关闭评论
5月 192020
 

本文基于Android8.1系统

应用执行过程:在launcher中打开一个无任何组件的应用

updateConfiguration函数增加计时后的代码(使用SystemClock.elapsedRealtime()来计算时间,单位:毫秒)

会间接调用到LocaleList.java中的computeFirstMatchIndex函数

此函数加时间计数后的代码

执行后的结果:

由此可见time5_5耗时较长,time5_5的耗时是因为computeFirstMatchIndex中的循环造成的。

而且在一个应用启动过程中要执行两次updateConfiguration,所以这个值得研究一下。

 Posted by on 2020-05-19

Android atrace使用说明(Android sdk中的systrace)

 分类:Android, Android, Java, Operating System 阅读 (28)  Android atrace使用说明(Android sdk中的systrace)已关闭评论
5月 182020
 
1. 普通使用

这样会把结果输出到控制台,对分析没什么意义,可以用于测试这个命令

2. 抓trace并保存到文件

这样会把分析文件输出到/sdcard/a.trace文件

将a.trace文件导出到电脑,然后使用sdk下的systrace.py程序将分析结果生成html文件,命令如下:

–from-file 参数表明从文件读入分析数据

~/a.trace 源数据文件

-o ~/a.html 指定输出文件路径

3. 循环抓取

 

4. atrace帮助内容

5. 允许的categories

执行下面命令可以看到atrace允许追踪的category

下面是笔者附上来的列表

6. 在自己的程序中加入trace代码

系统版本大于等于Android 4.3 (API18)以上的才可以用

 

 

python问题No module named six修复

 分类:Android, Java, Others, Python 阅读 (23)  python问题No module named six修复已关闭评论
5月 182020
 

执行python脚本时提示ImportError: No module named six

可能机器上没有python的six模块

(本文基于Ubuntu 18.04.4)

执行以下命令安装

如果提示你电脑上没有pip命令,则先安装python-pip

 

 Posted by on 2020-05-18

Activity什么情况下执行onCreate但不执行onStart

 分类:Android, Java 阅读 (21)  Activity什么情况下执行onCreate但不执行onStart已关闭评论
5月 152020
 

今天看到这样一个面试题,遂看了下Android系统源码

发现在ActivityThread.java中的performLaunchActivity函数中有这么一段代码

可见,如果在onStart之前如果Activity执行了finish函数,就不会再执行onStart函数了。

示例代码如下:

 

Android系统源码解决“已连接,但无法访问互联网”的问题

 分类:Android, Java 阅读 (34)  Android系统源码解决“已连接,但无法访问互联网”的问题已关闭评论
5月 152020
 

本文基于Android8.1系统

 
问题原因:

因为安卓系统默认测试网络的连接是用的google相关的域名,在国内网络无法访问,所以造成即手机连上网络也会出现“已连接,但无法访问互联网”的问题。

 
源码修改:

可以使用下面两个方法其中之一修改,换成国内可访问的链接

1. 修改文件frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java

将文件中常量DEFAULT_HTTPS_URL和DEFAULT_HTTP_URL对应的URL换成可访问的(注意:链接是需要返回http 204返回码的)

2. 修改Android的settings库中Global域中captive_portal_http_url和captive_portal_https_url的值

笔者用的第一种方法,第二种方法没做测试,修改默认设置值请参考下面的链接

编译Android8.1修改默认分辨率和屏幕密度

 
附:一些可用的返回204的链接

http://clients1.google.com/generate_204
http:// clients3.google.com/generate_204
http://www.google-analytics.com/generate_204
http://httpbin.coding.io/status/204
http://www.google.cn/generate_204
http://gen204.sinaapp.com/generate_204
http://g.cn/generate_204
https://mine260309.me/generate_204
http://ping.mine260309.me/generate_204
http://noisyfox.cn/generate_204
https://204.io/generate_204
https://mine260309.me/archives/1587

 
参考链接

https://blog.csdn.net/gsls200808/article/details/54574754

 Posted by on 2020-05-15