以下内容参考自:《第一行代码》 郭霖著
这里对我的第一个项目:HelloWorld 进行分析,相关过程查看之前的专栏文章。
一、切换到Project
二、树状图分析
.gradle
.idea
目录: 别管,自动配置的文件app
目录:代码、资源等内容都在这个文件夹下build
目录:别管,编译时自动生成libs
目录:存放第三方jar包src
目录:源码目录androidTest
目录:自动化测试用的main
目录:工作目录,通常只管这个目录下的文件java
目录:写代码的目录,activitivity.java
文件就在里面res
目录:放资源的目录drawable
放图片layout
放布局values
放字符串mipmap
放应用图标
AndroidManifest.xml
文件:整个项目的配置文件,四大组件都在这注册,添加权限声明等
test
目录:Unit Test测试使用
.gitnore
文件:版本控制使用app.iml
文件:别管,AS自动生成的build.gradle
文件:gradle
脚本构建文件proguard-rules.pro
文件:代码混淆用的,防止app被破解
gradle
目录:包含gradle wrapper
的配置文件.gitgnore
文件:版本控制相关build.gradle
文件:构建gradle
的全局脚本文件gradle.properties
文件:配置gradle
的全局配置文件gradlew
gradlew.bat
文件:执行gradle
命令的文件,bat文件是windows系统用的HelloWorld.iml
文件:别管,AS自动生成的文件local.properties
文件:指定本机Android SDK路径,通常自动生成settings.gradle
文件:指定引入的模块
三、主要文件分析
1、AndroidManifest.xml
其中关键代码:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
表示对MainActivity
这个活动进行注册,没注册不能用。其中
<action android:name="android.intent.action.MAIN" />
和
<category android:name="android.intent.category.LAUNCHER" />
表示这个活动是项目的主活动,也是最先启动的活动。
2、MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
第一行:MainActivity
继承自AppCompatActivity
,扩大了app兼容范围。
第四行:onCreate()
方法是活动创建时执行的方法。
第六行:setContentView()
引入布局文件activity_main.xml
四、引用资源
布局文件通过R.layout.activity_main
来引用,那其他资源如何引用呢?比如HelloWorld
这个字符串,它的资源文件是strings.xml
:
<resources>
<string name="app_name">HelloWorld</string>
</resources>
- 代码中引用:
R.string.app_name
xml
自引用:@string/app_name
同样的,如果是图片资源就将string
替换为drawable
,图标则是mipmap
,布局文件就是layout
五、AS配置文件分析
AS(Android Studio)是用Gradle
构建项目,这种构建工具摒弃了传统的基于XML的繁琐配置。
1、外层build.gradle
文件
这个文件是自动生成的:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
repositories{}
中声明了jcenter()
,这是一个代码托管仓库,声明了这个就能引用jcenter
的开源项目了。还声明了goole()
,这是google自有的仓库。dependencies
中使用classpath
声明了一个Gradle
插件,用来表示这是个Android项目而不是C++或其他项目。
2、内层build.gradle
文件
这个在app
目录下,也是自动生成的:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.helloworld"
minSdkVersion 15
targetSdkVersion 29
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'
}
- 第一行应用了一个插件,一般选两个值:
com.android.application
:表示这是个应用程序模块com.android.library
:表示这是个库模块,只能依附于别的应用程序模块运行
- 第三行
android{}
配置项目构建的属性:compileSdkVersion
指定编译的版本,29代表用Android Q的SQK编译buildToolsVersion
指定构建工具的版本,有最新的AS会提示defaultConfig{}
细节配置applicationId
指定包名minSdkVersion
指定最低兼容版本,15表示Android4.0targetSdkVersion
数字越大会启用一些新功能,比如权限控制等versionCode
项目版本号versionName
项目版本名
buildTypes{}
指定生成安装文件的配置release{}
正式版安装文件的配置minifyEnabled
指定是否代码混淆proguardFiles
指定混淆的规则文件proguard-android-optimize.txt
SDK目录下,项目通用混淆规则proguard-rules.pro
当前项目根目录下,当前项目的特有混淆规则
debug{}
测试版安装文件的配置,通常忽略不写
dependencies{}
:指定当前项目的所有依赖关系- 第一行:
fileTree
:本地依赖 - 第二三行:远程依赖:
androidx.appcompat
域名部分,appcompat
组名,1.0.2是版本名。Gradle
会先检查本地是否已经有此库的缓存,如果没有就会联网下载 - 最后三行用来测试用例,暂时用不到。
- 第一行:
六、其他收获
- App设计讲究逻辑和视图分离,于是通常在布局文件中写界面,然后在活动中引入进来
- 通过AS直接运行项目生成的都是测试版安装文件
- AS项目的三种依赖关系:本地依赖,远程依赖,库依赖
- 调试项目时,先在
onCreate()
方法外输入logt
,然后就可以在其他地方logd
了。