Android ANR

什么是ANR

ANR(Application Not Responding)就是通常我们在Andrid上遇到的程序无法响应问题。

如果APP的UI线程被长时间阻塞,就会触发ANR错误,如果我们的应用在前台运行,那么系统就会弹出对话框提示用户,允许用户强制结束程序。

如果应用在后台运行,默认不会弹出对话框;当然,我们也可以在系统设置中的开发者选项中,设置允许后台允许的程序也弹出ANR对话框。

ANR的触发

Show More

Android类加载机制

ClassLoader

Android 中使用PathClassLoaderDexClassLoader等来实现类的加载,这两个类都继承自BaseDexClassLoader,而BaseDexClassLoader继承自ClassLoader

从Android官方文档中可知:PathClassLoader用来加载系统类及已安装的应用程序的类;DexClassLoader用来加载jarapkdex文件中的类。

ClassLoader使用了一种称为“双亲委托”的机制:

Show More

Java 之 try-with-resources

Java中打开的某些资源需要我们在使用完成后主动关闭,譬如输入输出流:

final InputStream in = con.getInputStream();
final FileOutputStream os = new FileOutputStream(file);

final byte[] buf = new byte[1024 * 8];

int len;

while (-1 != (len = in.read(buf))) {
    os.write(buf, 0, len);
}

os.close();
in.close();

但是我们有时候忘了主动关闭,或者逻辑有疏漏导致无法关闭,譬如以上代码在os.close()调用时抛出异常,就会导致in.close()无法执行到。

try-with-resources语句

Java7中新增了try-with-resources语句,提供了资源关闭的新方法。

Show More

Android2.3源码学习06 -- 编译linux内核源代码

Android模拟器使用的是armCPU架构,首先需要设置环境变量:

$ cd $WORKING_DIRECTORY/kernel/goldfish
$ export ARCH=arm
$ export CROSS_COMPILE=arm-eabi-

将交叉编译工具添加到PATH环境变量:

$ export PATH=$WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
Show More

Android2.3源码学习05 -- 下载内核源码

AOSP源码里不包含内核源代码,需要单独下载。不同的内核对应不同的代码仓库,下面我们使用模拟器内核代码来学习。

下载模拟器对应的内核代码:

$ cd $WORKING_DIRECTORY
$ mkdir kernel
$ cd kernel
$ git clone https://android.googlesource.com/kernel/goldfish.git
Show More

Android2.3源码学习04 -- 运行模拟器

安装 SDL 库

运行模拟器时,会提示:

SDL init failure, reason is: No available video device

因此需要安装SDL库:

$ sudo apt-get install ia32-libs
Show More

Ubuntu中安装JDK

Ubuntu中安装JDK主要有PPA安装和手动安装两种方式:

PPA安装

添加PPA

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
Show More

Android2.3源码学习03 -- 编译源码

设置环境

在工作目录运行脚本:

$ cd $WORKING_DIRECTORY
$ source build/envsetup.sh
# 或
$ . buuid/envsetup.sh
Show More

Android2.3源码学习

Android2.3源码为样本,依照罗升阳博客等文章、教程为参照,研究Android框架实现。

环境

采用Mac+ 虚拟机的方式学习,具体环境如下:

Host    : macOS High Sierra(10.13.2)
VM      : VMWare Fusion 10.1.1 (7520154)
Guest   : Ubuntu 12.04.5LTS
Show More

Linux中添加硬盘

下面研究下怎么在Linux系统中增加新的硬盘。

当前环境如下:

Host    : macOs High Sierra(10.13.6)
VM      : VMWare Fusion 10.1.3 (9472307)
Guest   : Ubuntu 12.04.5LTS

查看已有硬盘:

$ lsblk  -d
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda    8:0    0    60G  0 disk
sr0   11:0    1  1024M  0 rom
Show More

—  我的个人空间 |   —