Android初认识-《第一行代码-Android》
题记
进入手游公司,公司项目使用cocos2d-x游戏引擎。发布在android和ios平台。所以需要对android进行学习。此博客作为我的学习笔记 ,也希望能帮助到正在学习android的同学。知识内容来自《第一行代码-Androids(第二版)》
Android项目结构
首先是android的项目结构解读。
我使用的环境是mac下的android studio。首先新建一个android的空项目来初步了解android的项目结构。
项目中结构比较复杂,接下来我会就关键的项目结构进行解析。
- app ,项目中代码,资源都在这里,后续开发工作都在这个目录中;
- .gitignore 用来将指定的目录或文件排除在版本控制之外。
- bulid.gradle 全局gradle构建脚本,通常不需要修改,注意app中也有一个.gradle文件,此文件据老大说时用来控制sdk的,非常重要。
- grade.properties gradle配置文件,配置属性将影响项目中所有的gradle编译脚本。
- gradlew和gradlew.bat 在命令行中执行gradle命令,gradlew在Mac中使用。
在所有的一级项目结构中最重要的是app和build.gradle文件。接下来是app中的项目结构
app项目结构
- bulid 编译时自动生成的文件,不用关心。
- libs 项目中如果使用到第三方jar包,放到libs目录下,会自动添加到构建路径里去
- androidTest 编写安卓测试用例,进行自动话测试。
- main里面有java和res两个目录,java逻辑代码,res资源目录。
- res项目中所有图片,布局,字符串等资源,图片统一放在drawable,布局放在layout,字符串values。
- AndroidManifest.xml整个Android的配置文件,安卓程序中国所有四大组件都在这个文件中注册。这个文件还会给应用程序添加权限声明,会常常用到。
- test:用来编写Unit test测试用例,自动化测试的另一种方式
- .gitignore app模块内的排除版本控制的文件或目录
- app.iml :自动生成,不需要关心
- build.gradle app模块的gradle构建脚本,很重要
- proguard-rulers.pro 混淆规则,通常会将代码进行混淆。
AndroidManifest.xml
AndroidManifest.xml文件中能确定项目从哪个文件开始运行。
.MainActiviity在AndroidManifest.xml中注册,注意在AndroidManifest.xml中注册的活动才可以使用,
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
在读其他人写的代码时,先要去找action.MAIN和.LAUNCHER,就可以找到这个项目的主活动。
这里解释一下:活动Android程序的门面,类似于cocos2d中的scene一样。
MainActivity
从xml中找到主活动,然后在java代码中找到对应文件
`public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}`
可以看到MainActivity继承AppCompatActivity,AppCompatActivity继承于Activity,所有活动必须继承或继承Activity子类。onCreate()是必须执行的方法,其中两行代码并没有hello World字样,这是因为Android程序讲究逻辑和视图分离。所以视图子一定在R.layout.activity_main所对应的activity_main.xml中。
activity_main.xml
<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" />
注意TextVIew,这是Android系统提供的控价,用于布局显示文字,注意其中text中的hello world。
项目中的资源
项目中的资源基本都在res中,看看res目录结构
res中目录非常简单,drawable开头文件夹都是放图片的,mipmap开头文件夹放图标,values开头的文件夹放字符串,样式,颜色等配置。layout文件夹中放布局文件。mipmap开头的文件夹这么多,是为了让程序能够跟好兼容各种设备。
res/values/strings.xml
<resources>
<string name="app_name">Litepal</string>
</resources>
两种引用它的方式
代码:R.sring.app_name
xml:@string/app_name
如果是引用图片资源就将string替换为drawable,图标换成mipmap,布局文件替换layout,以此类推。
build.gradle 文件
重头戏build.gradle
Android Studio使用Gradle构建项目,使用DSL来声明项目设置.先从外层的build.gradle分析
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
// 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
}
这些代码都是自动生成的,首先来分析repositories闭包中声明了jcenter()和google(),这两个都是代码托管仓库,目前jcenter仓库要关闭了,可以使用阿里云
接下来分析dependencies闭包,其中使用classpath声明了一个Gradle的一个安卓插件。因为Gradle不单单为安卓开发,java和c++,所以要申明com.android.tools.build:gradle:3.5.2这个插件。
app中的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.litepal"
minSdkVersion 15
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'org.litepal.android:core:1.4.1'
}
第一行应用插件,一般有两种,com.android.application是应用程序模块,com.android.library表示是一个库模块。应用程序是一个程序,库模块是表示你做的想一个插件,等别的应用程序使用。
android闭包,这个闭包中可以配置项目中的各种属性。compileSdkVersion用于指定项目中的编译版本,30是系统生成的。buildToolsVersion用于指定构建工具的版本。在android闭包中又有一个defaultConfig闭包,defaultConfig闭包可以对项目中更多的细节进行配置
applicationId:项目的包名
minSdkVersion:项目最低兼容的安卓版本
targetSdkVersion:表示你已经在改目标版本上做了充分测试
versionCode:指定目标的版本号
versionName:项目的版本名
buildTypes闭包指定生成安装文件的相关配置通常里面有俩子闭包,一个debug一个release,debug:生成测试版安装文件
release:生成正式版安装文件的配置
minifyEnadbled:指定是否对项目代码进行混淆
proguarFiles:指定混淆时使用的规则文件。
dependencies指定当前项目所有依赖关系
三种依赖关系:本地依赖,库依赖,远程依赖。
本地依赖:可以对本地jar包或目录添加依赖关系。
库依赖:对项目中的库依赖添加依赖关系
远程依赖:对jcenter库上的开源项目添加依赖关系
implementation fileTree:本地依赖声明,表示libs目录下所有.jar后缀的文件都添加到项目构建路径当中。
implementation:远程依赖声明,androidx.appcompat:appcompat:1.0.2
其中androidx.appcompat表示域名部分,appcompat组名称用于和同一个公司中不同的库做区分,1.0.2版本号用于和同一个库不同的版本做区分。这句声明加后,Gradle在构建项目时会检查本地的缓存库,如果没有,自动去互联网下载。
库依赖:此处没有写,下篇博客中会使用到LitePal,看看是否会使用到。