RK平台Android分区大小修改说明
不同于一般的Android系统(一般Android系统分区信息在BoardConfig.mk BoardConfigCommon.mk中),RK平台的分区信息文件在自带的烧录工具包中的parameter文件中
Hexo入手
1. 安装Git和node.js
从官网下载对应平台binary 包,安装(linux直接将bin lib目录的文件cp到usr/local对应目录下,Window直接点击安装)
Ubuntu平台:
sudo apt-get install git-core
curl https://raw.github.com/creationix/nvm/v0.33.11/install.sh | sh
安装完成后,重启终端并执行下列命令即可安装 Node.js。
nvm install stable
Windows平台:
下载并安装 https://git-scm.com/download/win
下载并安装https://nodejs.org/en/download/
2. 安装hexo
npm install hexo-cli -g //终端或者cmd命令行
Android fstab介绍
ubuntu fstab文件格式
下面是/etc/fatab文件的一个示例行:
fs_spec fs_file fs_type fs_options fs_dump fs_pass
/dev/hda1 / ext2 defaults 1 1
fs_spec - 该字段定义希望加载的文件系统所在的设备或远程文件系统,对于一般的本地块设备情况来说:IDE设备一般描述为
/dev/hdaXN,X是IDE设备通道 (a, b, or c),N代表分区号;SCSI设备一描述为/dev/sdaXN。对于NFS情况,格式一般为:
例 如:`knuth.aeb.nl:/'。对于procfs,使用`proc'来定义。
fs_file - 该字段描述希望的文件系统加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来
表示空格。
fs_type - 定义了该设备上的文件系统,一般常见的文件类型为ext2 (linux设备的常用文件类型)、vfat(Windows系统的fat32格
式)、NTFS、iso9600等。
fs_options - 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用"defaults"
就可以满足需要。其他常见的选项包括:
选项含义:
ro 以只读模式加载该文件系统
sync 不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度
user 允许普通用户加载该文件系统
quota 强制在该文件系统上进行磁盘定额限制
noauto 不再使用mount -a命令(例如系统启动时)加载该文件系统
fs_dump 该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0
fs_pass 该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,
其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0
Java enum
1. enum 基本概念和用法
enum Color { RED,BLUE,BLACK YELLOW,GREEN}; //创建时自动继承java.lang.Enum这个类
(1) ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
Color.RED.ordinal(); //返回结果:0
Color.BLUE.ordinal(); //返回结果:1
(2) compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。
当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
Color.RED.compareTo(Color.BLUE); //返回结果 -1
(2) equals()方法: 比较两个枚举类对象的引用。
(3.1) values()方法: 静态方法,返回一个包含全部枚举值的数组。
Color[] colors=Color.values();
for(Color c:colors){ System.out.print(c + ","); }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
(3.2) toString()方法: 返回枚举常量的名称。
Color c=Color.RED;
System.out.println(c);//返回结果: RED
(3.2) name()方法: 返回枚举实例声明时的名字String //"RED","BLUE","BLACK" "YELLOW","GREEN"
(5) valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
Color.valueOf("BLUE"); //返回结果: Color.BLUE
(8) getDeclaringClass()方法: 返回该enum变量所属Class<E>
总结:
1. enum -> int:
int i = enumValue.ordinal(); // enumValue = Color.RED;
int i = Color.ordinal();
2. int -> enum: Color b = Color.values()[i]; // int i = 0 1 2 3 4;
3. enum -> String:
String s = enumValue.name(); //enumValue = Color.RED;
String s = enumValue.toString(); //enumValue = Color.RED;
String s = Color.RED.name();
String s = Color.RED.toString();
4. String -> enum: enumType.valueOf(name); //name = "RED"
2. enum类实现原理及扩展
final class enum Color extends java.lang.Enum {
enum RED(“红色”), //自带实例,在类前部定义
enum BLUE(“蓝色”), //自带实例,在类前部定义
enum BLACK(“黑色”), //自带实例,在类前部定义
enum YELLOW(“黄色”), //自带实例,在类前部定义
enum GREEN(“绿色”); //自带实例,在类前部定义,最后一个需要加分号
//todo 可新增成员变量和成员方法 及 构造函数
private Color (String description) { //此处需要声明为private,就算不声明,只用于自带实例进行构建,在外部不能构建???
this.description = description;
}
private String description;
public String getDescr() { return description;}
public static void main(String[ args]) {
for (Color c : Color.values()) {
System.out.println(c + ": " + c.getDescr());
}
}
};
//Output:
RED: 红色
BLUE: 蓝色
BLACK: 黑色
YELLOW: 黄色
GREEN: 绿色
Android版本-sdk-ndk-对应关系表
Code name | Version | API level | Rlease Date | Kernel |
---|---|---|---|---|
Pie | 9 | API level 28 | 2018/8/6 | 4.4.107, 4.9.84, and 4.14.42 |
Oreo | 8.1 | API level 27 | 2017/12/21 | 4.10 |
Oreo | 8.0 | API level 26 | 2017/8/21 | 4.10 |
Nougat | 7.1 | API level 25 | 2016/11/16 | 4.4.1 |
Nougat | 7.0 | API level 24 | 2016/8/22 | 4.4.1 |
Marshmallow | 6.0.1 | API level 23 | 2015/12/15 | |
Marshmallow | 6.0 | API level 23 | 2015/10/5 | 3.18.10 |
Lollipop | 5.1.1 | API level 22 | 2015/4/21 | |
Lollipop | 5.1 | API level 22 | 2015/3/9 | 3.16.1 |
Lollipop | 5.0 | API level 21, NDK 10 | 2014/11/12 | 3.16.1 |
KitKat | 4.4 - 4.4.4 | API level 19 | 2013/10/31 | 3.10 |
Jelly Bean | 4.3.x | API level 18 | 2013/10/3 | 3.4.39 |
Jelly Bean | 4.2.x | API level 17 | 2013/2/11 | 3.4.0 |
Jelly Bean | 4.1.x | API level 16 | 2012/7/9 | 3.0.31 |
Ice Cream Sandwich | 4.0.3 - 4.0.4 | API level 15, NDK 8 | 2012/3/29 | 3.0.1 |
Ice Cream Sandwich | 4.0.1 - 4.0.2 | API level 14, NDK 7 | 2011/10/18 | 3.0.1 |
Honeycomb | 3.2.x | API level 13 | 2.6.36 | |
Honeycomb | 3.1 | API level 12, NDK 6 | 2.6.36 | |
Honeycomb | 3.0 | API level 11 | 2011/2/22 | 2.6.36 |
Gingerbread | 2.3.3 - 2.3.7 | API level 10 | 2.6.35 | |
Gingerbread | 2.3 - 2.3.2 | API level 9, NDK 5 | 2010/12/6 | 2.6.35 |
Froyo | 2.2.x | API level 8, NDK 4 | 2010/5/20 | 2.6.32 |
Eclair | 2.1 | API level 7, NDK 3 | 2.6.29 | |
Eclair | 2.0.1 | API level 6 | 2.6.29 | |
Eclair | 2.0 | API level 5 | 2009/10/26 | 2.6.29 |
Donut | 1.6 | API level 4, NDK 2 | 2009/9/15 | 2.6.29 |
Cupcake | 1.5 | API level 3, NDK 1 | 2009/4/27 | 2.6.27 |
(no code name) | 1.1 | API level 2 | 2009/2/9 | 2.6 |
(no code name) | 1.0 | API level 1 | 2008/12/23 | ? |
References:
https://en.wikipedia.org/wiki/Android_version_history
Android init.rc
init.rc主要有两大元素: Actions和Service
一种是定时任务——Actions,由以下构成:
on
…
一种是固定顺序的任务(初始化启动,可以重启),即Services
service
Android 中同步和并发实现的几个方式
1. 关键字synchronized
实例方法同步/静态方法同步
class Demo{
public synchronized void print(){ //实例方法
System.out.println(“print”);
}
public static synchronized void print2(){ //静态方法
System.out.println(“print2”);
}
}
Demo demo1; //同一时间段只能有一个线程可以访问demo1.print
Demo demo2; //可以同时访问demo1.print 和 demo2.print
//同一时间段只能有一个线程可以访问demo1.print2 或者 demo2.print2
实例方法中同步块 //分为对象锁和全局的Class锁,
静态方法中同步块 //只有全局锁
static synchronized方法也相当于全局锁synchronized(xxx.class) 如果{}范围相同的话
synchronized方法也相当于synchronized(this) 如果{}范围相同的话
2. 类java.util.concurrent.locks.ReentrantLock (比synchronized 功能更全更灵活, 还多了锁投票,定时锁等候和中断锁)
lock() 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
tryLock() 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
tryLock(long timeout,TimeUnit unit)
如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
lockInterruptibly
如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断
异同:
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
3. AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference:
在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。
区别:
和上面的类似,不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。
4. 特殊域变量(volatile)实现线程同步
a.volatile关键字为域变量的访问提供了一种免锁机制,
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
5. 使用局部变量实现线程同步
如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,
副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。
明天看下ThreadLocal