第1章 开启旅程 —- 你的第一行Android代码
本系列学习笔记第1章
前言
打算把android基本知识点写一个系列,旨在把android基础书,例如《Android 第一行代码 第2版》、《爱上android》、《疯狂android讲义》等书的一些知识点记录一下,会持续更新内容,为了方便自己复习,也希望可以帮助到大家!
1、 Android王国简介
1.1 Android系统架构
Android的系统架构大致可以分为四层,如图所示:
1) Linux内核层
android系统基于Linux内核的,这一层为android设备的各种硬件提供了底层驱动,如显示、音频、照相机、蓝牙、Wi-Fi、电源管理驱动等。
2)系统运行库层
这一层有一些C/C++库来提供一些主要的特性支持,如SQLite库提供数据库支持、OpenGL | OpenES库提供3D绘图的支持,Webkit库提供了浏览器内核的支持。这一层还有Android运行时库,它包括了Dalvik虚拟机,5.0之后的系统改为ART运行环境,它使得Android应用都能运行在独立的进程当中,并且拥有一个自己的虚拟机实例。
3)应用框架层
主要为开发者构建应用程序时可能用到的各种API。
2)应用层
所有安装在手机上的应用程序都是属于这一层的。
1.2 Android各版本一览表
目前4.0以上的系统已经占据超过了98%的android应用市场,因此开发只要兼容4.0以上应该就差不多了。
2、 开发环境搭建
在网上找一下,或者请看我之前重装系统时重新搭建android开发环境写的一篇博文
https://www.jianshu.com/p/7a8556f0b4f9
3、 项目结构模式以及目录文件
3.1 项目结构模式
点击图上所示,就可以看到项目的结构模式,一般常用的有Android 以及 Project这俩种
3.2 项目最外层目录
1).gradle 和.idea
Android Studio自动生成的
2)build
Android Studio 项目编译时自动生成的文件
3)app
开发中的代码、资源都在这里
4)gradle
里面的gradle.wrapper配置文件,会根据Android Studio的设置来决定是否联网下载或者使用离线的
5).gitignore
指定版本控制时要忽略的文件
6)build.gradle
项目全局的gradle构建脚本,Android Studio 是采用Gradle来构建项目的。
7)gradle.properties
全局的gradle配置文件,如果电脑性能不好,嫌弃项目编译速度慢的话,可以更改这里的配置
8)gradlew和gradlew.bat
用了即行gradle命令的,前者是在Linux或者Mac系统中使用,后者是在Windows系统中使用
9)xxx.iml
这个是Android Studio自动生成的,标识这是一个IntelliJ IDEA项目
10)local.properties
指定Android SDK路径
11)settings.gradle
用于指定项目中所有引入的模块
3.3 项目app模块最内层目录
1)build
和外层的build目录类似,都是在编译时Andrid Studio自动生成的文件
2)libs
第三方jar包放置的地方
3)androidTest
用来编写Android Test测试用例的,可以对项目进行一些自动化测试
4)java
所有编写java代码的地方
5)res
项目中使用的所有图片、布局、字符串等资源存储的地方
6)AndroidManifest.xml
程序中所有的4大组件以及应用权限声明都在这里
7)test
用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式
8)版本控制忽略文件,跟外层的一样
9) app.iml
项目自动生成的文件
10)build.gradle
app模块的gradle构建脚本
11)proguard-rules.pro
用于指定项目代码的混淆规则
4、 Android的日志工具Log
1) Log.v() 对应级别verbose,是Android日志里面级别最低的一种,主要打印那些最为琐碎的、意义最小的日记信息
2) Log.d() 对应级别debug,比verbose高一级,主要打印一些调试信息
3) Log.i() 对应级别info,比debug高一级,主要打印一些比较重要的数据信息
4) Log.w() 对应级别warn,比info高一级,主要打印一些警告信息
5) Log.e() 对应级别error,比warn高一级,主要打印程序中的错误信息
5、 buildTypes 在实际项目中的使用
//构建类型:可以根据不同的版本设置不同的参数,进行不同的配置
buildTypes {
debug{
minifyEnabled false
buildConfigField "String","API_URL","\"https://yuedu.baidu.com\""
buildConfigField "boolean","LOG_CALLS","true"
resValue "string","str_name","Example DEBUGLE"
}
release {
minifyEnabled true
buildConfigField "String","API_URL","\"https://yuedu.baidu.com\""
buildConfigField "boolean","LOG_CALLS","false"
resValue "string","str_name","example"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在代码中可以引用自己上图中定义的一些参数,调用如下:
String url = BuildConfig.API_URL;
boolean logCalls = BuildConfig.LOG_CALLS;
int str_name = R.string.app_name;
在LogUtils工具类中的引用:
public class LogUtils {
public static final boolean DEBUG = BuildConfig.LOG_CALLS;
public static void v(String tag,String msg){
if(DEBUG) {
Log.v(tag, msg);
}
}
public static void d(String tag,String msg){
if(DEBUG) {
Log.d(tag, msg);
}
}
public static void i(String tag,String msg){
if(DEBUG) {
Log.i(tag, msg);
}
}
public static void w(String tag,String msg){
if(DEBUG) {
Log.w(tag, msg);
}
}
public static void e(String tag,String msg){
if(DEBUG) {
Log.e(tag, msg);
}
}
}
6、 屏蔽日志输出的终极做法
在混淆文件中对Log的输出添加如下所示的混淆:
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String,int);
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
}
对于assumenosideeffects ,官方的解释就是,混淆器将删除这些方法(如果在程序中使用这些方法的返回值,则不会删除,一般日志不关心返回值)。)
对于build.gradle和日志输出这一块,推荐观看我之前写的博文:
https://www.jianshu.com/p/2febe846f11c