Android系统架构 :
- Linux内核层:底层驱动。
- 系统运行层:特性支持,数据存储显示等。
- 应用框架层:API
- 应用层:应用程序
一、HelloWorld
1、创建项目
- Name:项目名称
- packageName:包名
- savelocation:代码保存位置
- language:默认选择kotlin
- Minimum API level:最低支持的Android版本
2、目录结构
选择project结构展示
- .gradle 和.idea是自动生成的编译相关的缓存。
- app存放资源和代码
- gradle项目构建工具,用来打包程序的
- .gitignore也就是git中不需要参与版本控制
- build.gradle 顾名思义,就是gradle构建出来的
- gradle.properties就是vs里面的属性页面,配置gradle
- gradlew和gradlew.bat在命令行界面执行gradle编译的,其中gradlew是在Linux,gradlew.bat是在windows中的
- local.properties指定本机的Android SDK目录
- settings.gradle 指定项目中所以包含的模块。
3、app模块
- libs链接库,也就是会引用到的第三方jar包,只要把jar包放到libs目录下,就会自动的添加到构建路径当中。
- androidTest编写Android Test测试用例
- java放代码的地方,Kotlin也在这里面
- res资源啊(图片、布局、字符串)
- AndroidManifest.xml整个Android项目的配置文件,之前提到的四大组件已经权限声明都需要在这里注册。
- test存放Unit Test
- .gitignore作用域在app内部的版本控制
- build.gradle是ap模块的gradle构建脚本,也是用于多项目构建配置
- proguard-rules.pro其实就是对代码加密。也就是编译之后的混淆规则。
4、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"<!--指定应用图标-->
android:label="@string/app_name"<!--指定应用名称-->
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"><!--MainActivity活动进行注册,没有进行注册的活动不能运行-->
<intent-filter><!--应用程序入口,也就是点击图标后活动MainActivity首先运行-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
5、MainActivity.kt
也就是应用程序可见的部分
package com.example.helloworld
import androidx.appcompat.app.AppCompatActivity//MainActivity集成子AppCompatActivity,Activity是Android系统一个活动的基类,所有活动都必须集成它或者它的子类。而AppCompatActivity就是Activity的子类
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {//构造函数
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)//在活动中引用布局activity_main
}
}
Android程序设计是逻辑和视图分离的,也就是说界面不在活动中编写,一般都是在布局文件中编写界面,然后在活动中引用进来。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /><!--这是一个控件-->
</androidx.constraintlayout.widget.ConstraintLayout>
6、项目中的资源
- drawable开头的都是用来放图片的,也可以创建和mipmap一样的多个文件夹,放置不同分辨率的图片,程序运行时就会自动的选择合适的文件夹下的图片。一般都是放置在xxhdpi文件夹下。
- mipmap开头的都是用来放图标的。多个是为了兼容各种设备。
- values开头的都是用来放字符串、颜色、样式等显示设置的
- layout放布局文件的
string.xml
<resources>
<string name="app_name">HelloWorld</string>
</resources>
- 代码文件中R.string.app_name获取
- 而XML文件中@string/app_name获取
上面string也可以换成drawable、mipmap、layout。
7、build.gradle
最外层的
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.3.72"
repositories {
google()
jcenter()//repositories声明的jcenter()是一个代码仓库,声明这个之后可以使用任何在jcenter上的开源项目。
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"//dependencies闭包中使用classpath声明了一个gradle,之所以要额外声明就是因为gradle并不职位Android项目,因而需要指定
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app目录下的:
apply plugin: 'com.android.application'//应用了一个插件,com.android.library表示是一个库模块
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {//android闭包
compileSdkVersion 30//编译版本
buildToolsVersion "30.0.1"//构建工具版本
defaultConfig {//defaultConfig闭包
applicationId "com.example.helloworld"//项目的包名
minSdkVersion 28//项目最低兼容的Android版本
targetSdkVersion 30//已经在测试的版本
versionCode 1//项目版本号
versionName "1.0"//项目版本名
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {//buildType闭包,指定安装文件的配置
release {//release和debug(可不写)
minifyEnabled false//是否对项目代码进行混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),//指定混淆规则的文件,整个项目的,在Android SDK目录小
'proguard-rules.pro'//当前项目的混淆规则
}
}
}
dependencies {//dependencies闭包 项目依赖关系,本地依赖、库依赖、远程依赖。本地依赖Jar包或者目录添加依赖关系,库依赖对项目中的库模块添加依赖关系,远程依赖对jcenter库上开源项目添加依赖
implementation fileTree(dir: "libs", include: ["*.jar"])//本地依赖声明,当前libs目录下所有.jar后缀的文件都添加到项目的构建路径当中
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
8、日志工具
Android的日志工具类Log(android.util.Log)5个打印日志的方法:
- Log.v()--verbose级别最低的日志信息
- Log.d()--debug级别的调试信息
- Log.i()--info数据信息
- Log.w()--warn警告信息
- Log.e()--error错误信息
package com.example.myfirstapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("MainActivity", "onCreate execute");//传入两个参数:tag,一般都是当前类名;msg打印的具体内容
}
}
输入logd、logi、logw然后在按下TAB代码就会自动补全
logt然后按下TAB就会自动生成TAG常量
logcat中有很多过滤器
- show only selected application只显示当前选中程序的日志。
- Firebase谷歌提供的分析工具
- No Filters不适用过滤器
- Edit Filter Configuration自定义的过滤器
选择data之后oncreate()方法打印日志就不显示了,因为data过滤器只会显示tag为data的日志。
日志 级别
关键字过滤