Android中正方形TextView的实现

 分类:Android, Java 阅读 (138)  Android中正方形TextView的实现已关闭评论
8月 012020
 

  本自定义组件实现了一个以高度为标准的正方形TextView组件,如果想以其他标准(最大或者最小宽度、高度)需要再进行修改:

  自定义View的代码如下;

 

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

 分类:Android, Android, Java, Operating System 阅读 (548)  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)以上的才可以用

 

 

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

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

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

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

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

示例代码如下:

 

关于Zygote Server的一些问题

 分类:Android, Java 阅读 (96)  关于Zygote Server的一些问题已关闭评论
5月 112020
 
既然Zygote Server是使用网络通讯,为什么普通应用不能和它通讯?

笔者本来以为zygote是通过127.0.0.1这种方式创建的server,所以会有此疑问。经过研究发现,zygote是通过文件建立的socket server(具体文件名/dev/socket/zygote),并且zygote是以root权限运行的,所以它生成的socket文件普通应用是无法进行通讯的。

Ubuntu18.04.4编译Nxp android_o8.1.0_2.1.0-auto-GA版本安卓系统源码

 分类:Android, Java 阅读 (154)  Ubuntu18.04.4编译Nxp android_o8.1.0_2.1.0-auto-GA版本安卓系统源码已关闭评论
4月 132020
 

一、环境准备

Ubuntu18.04.4,不能使用Ubuntu16会有很多依赖软件版本太低

硬盘200G,内存4G+,交换分区(swap)4G+(可装完系统后添加,见后面错误处理部分)

二、下载源码

官方源码下载脚本链接:https://www.nxp.com/webapp/Download?colCode=O8.1.0_2.1.0_AUTO_GA_SOURCE&appType=license&location=null

三、安装编译时需要的第三方库

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

sudo apt install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop git-core curl u-boot-tools mtd-utils android-tools-fsutils device-tree-compiler gdisk liblz4-tool m4 libz-dev

安装open-jdk-8

sudo add-apt-repository ppa:openjdk-r/ppa

sudo apt-get update

sudo apt-get install openjdk-8-jdk

安装gcc-arm-none-eabi

sudo apt-get install gcc-arm-none-eabi

安装完这一项后,在~/.bashrc中最后一行添加脚本export ARMGCC_DIR=/usr/

然后执行source ~/.bashrc

安装cmake,需要3.13.0版本以上,安装步骤如下,其中./bootstrap那一步可以不用加后面的–qt-gui参数
https://blog.csdn.net/huigougou/article/details/84326907

四、开始编译

  然后进入到Android源码目录,假设源码在用户根目录的aosp目录中:

cd ~/aosp

  然后初始化编译环境,使用下面的命令:

source build/envsetup.sh

  然后选择要编译的目标版本,先输入lunch命令

lunch

  然后在显示的列表中选择你的目标版本,输入相应的数字,按回车即可

  然后使用make开始编译,可以使用-j参数增加编译的线程以提高速度,线程数量为cpu核心数的2倍比较合适,比如你的cpu是4核的使用

make -j8

  就可以了

五、遇到的问题

1. 错误:flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed.
Aborted (core dumped)

解决办法:
This will do the trick:

export LC_ALL=C

Add it to your bashrc file or equivalent.
参考链接:https://stackoverflow.com/questions/49955137/error-when-build-lineageos-make-ninja-wrapper-error-1
https://www.jianshu.com/p/2beae17c9b12

2、错误2:
JackServer提示out of memory

解决方案:
修改jack server内存
步骤:
打开./prebuilts/sdk/tools/jack-admin
找到下面这一行
JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8}”
修改为
JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096M}”
保存jack-admin文件
在命令行执行
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
重启jack server
然后重新编译

Android系统源码中SeLinux的配置

 分类:Android, Java 阅读 (261)  Android系统源码中SeLinux的配置已关闭评论
3月 312020
 
模块中定义的sepolicy策略文件目录如下加入到系统编译中:

在BoardConfig.mk中找BOARD_SEPOLICY_DIRS,将你的sepolicy目录加到这个变量中,如下所示:

 
如何定义域?

在/system/sepolicy/public/attributes文件中输入如下的行来定义

 
如何定义某个目录或者应用文件的安全上下文?

首先在/system/sepolicy/private/file_contexts中定义如下:

然后创建my_app.te的文件来定义具体的规则:

 

根据logcat中的avc denied的log生成合适的seLinux规则。

我们可以在logcat中看到类似如下的日志:

我们可以通过audit2allow工具把上面的log转换成合适的规则,配置在策略文件中,如果没有安装过这个工具先安装工具,如下:

将相关的log保存到一个文件中,如avclog.txt,然后执行下面的命令来生成规则:

 

adb shell dumpsys可以dump的服务

 分类:Android, Android, Java, Operating System 阅读 (274)  adb shell dumpsys可以dump的服务已关闭评论
3月 122020
 

   adb shell dumpsys显示的结果比较长,有的时候我们只想看某一个服务的dump信息,在后面加上那个服务的名字就可以了。我们执行完adb shell dumpsys后,最顶部显示的是当前运行的服务列表,这个列表就是可以细项输出的每个服务名称的列表。

  比如:adb shell dumpsys alarm输出的就只有SurfaceFlinger服务的输出信息。

  对于某些服务,还能指定更小的分类,比如adb shell dumpsys activity还有更细的输出adb shell dumpsys activity broadcasts,这个我们通过adb shell dumpsys activity -h打印帮助信息就能看到子分类的参数说明了。

  adb shell dumpsys生成的列表

 

5月 252018
 

  Settings Provider是指通过如下方式设置的系统变量数据库

  Settings共有三种分类,分别如下:

  • global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限;
  • system:包含各种各样的用户偏好系统设置;
  • secure:安全性的用户偏好系统设置,第三方APP有读没有写的权限。
查看某一个设置项的值:

  当我们调试时,需要查看设置里面的值,通过调试程序会比较慢,其实我们通过adb就可以查看,命令行如下:

  其中的get system可以根据设置的具体情况改成get global或者get secure

  如果返回null说明没有这个选项

设置某个项的值:

  当然我们也可以设置相关选项的值,通过put命令,示例如下:

打印某个域的所有值:

 

9月 152017
 

我们可以使用adb shell dumpsys 来查看android设备中的相关服务信息,dumpsys后的参数为相关服务的名称。

比较常用的如:

那么我们如何查看其他我们可以dump的服务名称呢?答案是使用如下的命令即可获得android设备中的所有运行的服务列表

如下,是在我三星手机上运行命令获得的服务列表:

 

2月 202017
 

1.什么场景下需要使用HandlerThread

1). 比较耗时,不易于放在主线程中执行的操作(不考虑第2点使用其他线程方式也可以)

2). 有多个耗时操作需要后台执行(如果不嫌麻烦也可以考虑使用多个TThread)

2.HandlerThread的使用步骤

1). 创建HandlerThread对象

2). 执行start方法,启动HandlerThread的Looper循环

3). 在主线程中创建Handler对象并引用HandlerTherad的looper

4). 在Handler对象中加入各种消息的处理

5). 在需要的时候给步骤3创建的Handler对象发送消息

6). 不再需要HandlerThread的时候调用quit或者quitSafely停止HandlerThread

示例代码如下(没做各种错误处理,仅供参考):

测试时多次点击Download1和Download2按钮,handler对象就会按点击的顺序多次下载网页baid.com和bcoder.com

3. 要不要像Thread那样写一个HandlerThread的子类?

完全没有必要,因为真正程序执行部分都在handler的消息处理里

4. quit和quitSafely的区别?

 

5. HandlerThread的其它特点

1). HandlerThread中的多个操作是串行按序执行的,即任务1\任务2\任务3....,所以如果你想尽早的获得运行结果,不建议使用HandlerThread这种方式

6. 测试代码下载

LocaleTest