Android 开发笔记(准备工作)

一、开发工具

  • Java 

Android 开发基于Java 语言,所以Java 语言环境必须安装。

  • Android SDK

Android SDK (Software Development Kit) 是开发Android 软件开发包,为开发者提供调用Android API调用,并负责将编译源码。功能类似于传统C++/MFC中开发的库文件加编译器。

从理论上讲,有Java 和Android SDK 就可以开发出结果为apk 的安卓应用了,但在目录、文件管理上比较困难,和其他工具(如模拟器)的扩展也需要手动操作,因此一般开发人员还需要一个开发平台。

  • Android Studio 或者Eclipse 开发平台

开发平台主要功能有三点:1.组织文件和目录;2.自动生成代码;3.扩展其他工具、插件。类似于Visual Studio平台中的管理功能,平台根据类型和作用分目录存放不同文件,比如res 存放静态文件。类似于使用MFC 新建项目时,VS 会自动生成一些通用代码。平台的另外一个好处就是很方便的能够扩展一些工具,比如模拟器,或者是在编译较老的SDK 时,需要从网上下载,平台都能够自动处理。总之,平台好处就是自动化处理一些原本需要人工操作的过程。

  • gradle

linux/C 项目开发中,如果你有了C语言环境(compiler,linker),有了项目所需要的库文件,你还需要通过一定的方法、规则将源文件生成安装程序,这些方法和规则一般写在Makefile 中,不同硬件设备有所区别,所以在安装源码时常通过configure 等脚本生成makefile,最后才make生成最终程序。Android 开发同理,一个Android 项目也需要通过SDK 的一些命令、工具生成中间文件,最后才生成安装程序,而管理这个过程最流行的工具就是gradle。当然不用gradle 也是可以的,只是需要手工敲得命令有些复杂和单调而已。

  • 模拟器(Emulator)

如果你没有真实的设备运行你的Android 程序,模拟器是不错的选择, 但平台中自带的模拟器效率较低,可以考虑其他模拟器,如Genymotion等。

二、安装过程

  1. 安装JDK(Java Development Kit)
  2. 安装Android SDK
  3. 安装Android Studio (下面全部以AS为例,需要VPN支持,或者使用SS并在AS 配置代理)
  4. 安装Android Emulator

三、Android体系结构

Android 基于Linux 操作系统的一个重要原因就是Linux 内核具有良好的硬件设备的支持,比如用于存储的磁盘,用于无线网连接的wifi。通过公共库(Libraries)对底层硬件的封装,为应用框架(Application Framework)和Android Runtime 提供了更具有特色的功能,比如SQLite 提供结构化数据库存储,OpenGL 提供高性能画图等。Android Runtime 基于优化的Java 虚拟机,称作Dalvik Virtuak Machine,任何Android 应用都是运行在这个虚拟机之上,虚拟机可以为应用分配内存和处理进程和进程间通信。应用框架(Application Framework)为程序提供更高层次的工功能服务,比如资源的访问和进程间消息传递等。

anst

四、应用组件

Android 每个应用包含四类组件:

  • Activities        与用户交互
  • Services         与应用有关的后台服务
  • Broadcast Receiver      Android 系统和应用的通信
  • Content Provider       与其他应用的通信

每一个Activity 对应着一块屏幕和一个与用户交互的事件,比如一个Android 邮件应用,有一个activity 是列出所有邮件,一个activity 读邮件,一个activity 写邮件等。所有的activities 都是源自于应用启动时的一个activity,类似于所有函数都是源于main() 函数调用。

一个Service 对应着一个后台持续运行的线程,比如一个后台播放音乐,在比如不中断用户操作的方式从网络上获取数据。

Broadcast Receiver用于回应其他应用或者系统广播的消息。比如一个应用可能发起广播给其他程序某些数据已经下载完毕了,那么Broadcast Receiver 则会截获这则消息并发起相应的动作。

Content Provider 通过请求用于向其他应用提供数据,例如第三方应用请求读取你的通信录。这类请求通过ContentResolver 类处理。一个Content Provider 可以连接多个Content Rsolver。他们关系如下图所示:

Android Training Bangalore

Android 还有其他一些组件,如Manifest 是应用的配置文件,Resources是外部元素,如变量和静态图片等。

五、文件组织结构

以Android Studio 为例,新建一个项目时,会在C:\Users\[your name]\AndroidStudioProjects 下创建你的项目对应的文件夹,而在Android Studio 视图中则有至少manifests、java 和res 三个目录。这三者分别保存配置文件,源代码和资源静态文件。

Screen Shot 2015-11-16 at 10.37.04 PM

  • manifests 目录下有AndroidManifests.xml 文件保存应用的配置信息,它告诉了系统需要哪些资源,以及如何构建起这个应用。
  • java 或src 目录下保存系统的 java 源文件
  • res 保存了用户交互所需要的资源,可能有子文件夹
    • drawable  保存图片
    • layout  保存屏幕布局
    • menu  保存屏幕菜单
    • values 保存为屏幕预定义的值

可能还可能有其他文件夹:

  • gen 是平台IDE 环境在编译时产生的中间文件
  • libs  外部的库文件

六、Android application package (APK) 生成过程

andriod的安装文件.apk如下图所示生成:

apk-structure

  1. .java源文件javac 编译为.class 二进制文件
  2. 项目.class 和其他外部库.class 通过dx编译为classes.dex 二进制可执行文件
  3. aapt 将classes.dex 二进制可执行文件、配置文件AndroidManifest.xml 和Resources 文件打包为apk 文件

知道了这个过程,那么你也可以通过将apk 反编译为xml、资源文件和源码等了。

 

 

 

存储系统中的纠删码(Erasure Codes)—有限域(三)

有限域是纠删码中运算的基础域,所有的编解码和重建运算都是基于某个有限域的。在讲讲为什么纠删码不能基于一般常见的域(自然数域,实数域)之前,需要讲讲域的概念和有限域与其他域的区别。文章将以尽量简单的语言使得更多的读者能够看懂。

一、有限域的基本概念

1. 什么是域?

首先回顾下我们学习数学的历史:从刚开始接触数学时,我们首先学会一些符号(比如从1开始数到100,初中开始学习未知数x, y, z 等),接着开始学习基于这些符号的运算(加减乘除等),这些符号和运算就可以构成一个“域”。比如我们最早接触的是整数域,接着有理数域,然后在高中和大学还接触了虚数域,只不过当时老师没有告诉你这些是域而已。还有一些常见的数不构成域,比如自然数、素数、整数。

 

2. 域具有哪些性质?

在抽象代数中,域是一个非零的可交换环。在域上可以进行我们常见的加减乘除算法,一个域具有以下性质:

  • 加法和乘法的封闭性,加法和乘法结果还在域内
  • 加法和乘法的交换律;a + b = b + a  和  a · b = b · a.
  • 加法和乘法的分配律:a + (b + c) = (a + b) + c  和  a · (b · c) = (a · b) · c.
  • 加法和乘法的分配律:a · (b + c) = (a · b) + (a · c).
  • 存在加法和乘法的单位元素:a+0 = a 和 a·1 = 1(这里的0,1 不是自然数的0,1,代表着域上的加法单位元素和乘法单位元素)
  • 每个域上的元素都存在其负元和逆元: a+(-a) = 0, a·(a-1) = 1

这些性质和我们平时遇到的许多运算性质相同,这是因为我们很多运算就是在域上进行的。

继续阅读

存储系统中的纠删码(Erasure Codes)—XOR 码和RS 码(二)

纠删码(Erasure Codes)能够总体上分为XOR 码和RS 码两类,XOR 码基于有限域GF(2),编、解码只需要按位异或(bit-wise exclusive-OR)即可完成,速度较快;RS 码基于有限域GF(2w),编、解码需要有限域上(后面的文章将详细介绍)的运算,速度慢于XOR码。常见的XOR码有:

  • 低密度奇偶校验码(Low Density Parity Code, LDPC)
  • 柯西-里德所罗门码(Cauchy-Reed-Solomon Codes,CRS)
  • RAID码(如RAID5、RAID6)
  • 奇偶码(EVENODD)
  • X-码(X-code)

按照编码理论来说,RS码是一个字长为n,维度为k,码字间距为n-k+1 的最小距离可分码(MDS codes),但为了能够让读者能够更容易接受,我们这里的RS 码是基于有限域上GF(2w)编解码运算的编码。

继续阅读

存储系统中的纠删码(Erasure Codes)—综述(一)

一、背景与挑战

数据的爆炸式增长使得存储系统的规模不断增加,存储设备的可靠性却一直没有得到显著提高(SSD 从SLC 到MLC 和TLC 可靠性不断下降,磁盘随着单位面积写入数据更多导致可靠性无法提升),从而给数据的持久化存储带来巨大挑战。另外随着存储系统规模的增大,存储系统中的冷数据的增加将远超过热数据的增加,如何安全保存冷数据,在需要的时候能够获取冷数据也成为存储系统中的重要挑战。下面是近年全球估计的数据量增长情况(GB,TB,PB,EB,ZB,YB…)。

2007    281 EB
2010     1.2 ZB
2011     1.8 ZB
2020      35 ZB

继续阅读

哪些情况会导致"Undefined Reference Error"

“Undefined Reference Error” 是在程序链接(link)时经常遇到的错误,字面意思来说就是没有找到已经定义的引用,在编译器无法找到用户所使用的变量或函数:

一、缺失头文件

例如声明变量 uint64_t tmp,但没有在开头包含 #include<stdint.h>

例如使用 memset() 需要包含头文件 string.h 或 memory.h

二、缺失目标文件或者库文件(.a .o .so …)

编译器查找用户函数,首先会在本文件中的函数中找,然后在系统环境变量定义的目标文件/库(.a .o .so …)文件中找,最后在链接的目标文件/库文件(.a .o .so …)中寻找用户函数;如果没有找到则报”Undefined Reference Error”错

四、库(目标)文件链接顺序有误

库文件的链接顺序是:依赖的库A 放后面,被依赖的库B 放前面。如果A 和B 相互依赖,则使用A B A 或者B A B 的。

例如main 文件中引用func 文件中函数,则编译顺序为main.o func.o

五、C 函数和C++函数引用问题

C++ 程序链接时可以链接C 的库文件,但在.cc(.cpp) 中引用头文件时需要通过extern “C”{ #include “func.h”} 的方式引用该头文件,否则会提示”Undefined Reference Error”

C 程序无法链接C++ 库文件,否则会提示”Undefined Reference Error”,找不到引用C++ 函数的引用

 

参考:http://blog.csdn.net/aiwoziji13/article/details/7330333

内存拷贝速度(memcpy())和异或速度

内存拷贝(memcpy())和异或(bit-wise XOR)是程序中运行最快的操作之一,其速度受到CPU、内存和编译器(GCC版本)的影响。

内存拷贝memcpy(des, src, len) 则是将长度为len 的数据从地址src 拷贝到地址des 。

按位异或(异或)可以分为几类:

  1. a^b:两个数值的异或。相当于两个寄存器内值在CPU 中计算异或,大多数CPU 中一个时钟周期完成。速度取决于CPU 的频率,频率越高,速度越快。
  2. a^Region:一个数值与一块内存Region 中的每个值异或,结果保存在Region 中,速度相当于顺序访存。
  3. RegionA = RegionA^RegionB:两块内存中对应位置上的值异或。
  4. RegionC = RegionA^RegionB:两块内存中对应位置上的值异或,结果保存在另一块内存中。

四类异或速度依次递减。平常中越到的是第3 种,本文中异或速度也是第3 种。

继续阅读