Android 开发基础
Android 开发基础
App的运行环境
App是在手机上运行的一类应用软件,Android 系统基于Linux内核,但不等同与Linux 系统,是无法直接运行在Linux系统上的 我们可以运用模拟器或者真机进行App的调试与开发,真机需要在开发者模式中打开USB调试,模拟器则是直接运行在电脑上的, 模拟器很占用电脑的内存,并且没有真机的一些功能。
App的开发语言
基于Android 系统的App开发主要有两大技术栈,一个是原生开发,另外一个就是混合开发。 原生开发指的是在移动平台上利用官方提供的编程语言,比如Java Kotlin,开发工具包(SDK),开发环境进行App 开发。 混合开发指的是结合原生技术和H5技术开发的混合应用,也就是将App的页面改成内嵌的网页,无需升级App,只需要覆盖服务器上的网页,即可动态更新App页面。 混合开发本质上是依赖于原生开发的。
其中Java和Kotlin 都属于解释型语言(对于此处有一定争论,实际上新的JVM 中对于部分高频方法会进行‘提前’编译),它们都基于JVM(java virtual machine),这类语言在运行的时候才会将程序翻译成机器语言,故而执行效率偏低, 涉及到图像与音视频处理等复杂预算的场合,依然首选考虑编译型语言C/C++,借助于JNI(java native interface),Java 原生接口, 即native 方法,Java代码可以调用C/C++编写的代码。
XML 全称 Exteensible Markup Language,可扩展标记语言,它并非编程语言,类似于HTML,利用各种标签表达页面元素,以及各个元素的排列组合和层级关系,内部的标签都以‘android:’字样开头,表示这是标准的android属性。
内部还拥有其他语言,比如makefile等。
App连接的数据库
Android 系统没有其他的企业级数据库,比如MySQL,Oracle,它内置的是SQLite数据库,它内嵌到应用进程当中,无需配置连接信息,就可以对其进行增删改查,所以SQLite也被归类为嵌入式数据库。
App的工程结构
App工程分为项目与模块,Module,一般运行某个app,我们运行的是某个Module,以下对目录的结构进行一些解释
app
--manifests App的运行配置文件
--java Java源码
--res 当前模块的资源文件
--drawable 存放图形描述文件与图片文件
--layout 存放App页面的布局文件
--mipmap 存放App的启动图标
--values 存放常量定义文件,例如字符串常量,像素常量,颜色常量,样式风格定义
gradle 主要是工程的编译配置文件
-- build.gralde 改文件分为项目级与模块级,用于描述App工程的编译规则
-- proguard-rules.pro java 代码的混淆规则
-- gralde.properties 改文件配置编译工程的命令行参数
-- setting.gradle 配置编译哪些模块,初始内容为‘include ':app'’ 表示只编译app的模块
-- local.properties 用于描述开发者计算机的环境配置,包括SDK的本地路径、NDK的本地路径
build.gralde 配置文件
project 级别
buildscript {
dependencies {
classpath "com.android.tools.build:gradle:4.2.2"
}
}
plugins {
id 'com.android.application' version '7.1.2' apply false
id 'com.android.library' version '7.1.2' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}
moudle 级别
plugins {
id 'com.android.application'
}
android {
// 指定编译用的SDK版本号。比如31表示使用Android 12编译
compileSdk 31
defaultConfig {
// 指定该模块的应用编号,也就是App的包名
applicationId "com.example.xxxxx"
// 指定App适合运行的最小SDK版本号。比如21表示至少要在Android 5.0上运行
minSdk 21
// 指定目标设备的SDK版本号。表示App最希望在哪个版本的Android上运行
targetSdk 31
// 指定App的应用版本号
versionCode 1
// 指定App的应用版本名称
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
// 指定App编译的依赖信息
dependencies {
// 指定引用jar包的路径
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 指定编译Android的高版本支持库。如AppCompatActivity必须指定编译appcompat库
//appcompat库各版本见 https://mvnrepository.com/artifact/androidx.appcompat/appcompat
implementation 'androidx.appcompat:appcompat:1.4.1'
// 指定单元测试编译用的junit版本号
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
settings.gradle
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
// 以下添加华为的仓库地址,引入HMS需要
maven { url 'https://developer.huawei.com/repo/'}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
// 以下添加华为的仓库地址,引入HMS需要
maven { url 'https://developer.huawei.com/repo/'}
}
}
rootProject.name = "android"
include ':app'
AndroidManifest.xml
以下是一些比较基础的示例
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chapter02">
<application
android:allowBackup="true"
<!-- 是否允许应用备份-->
android:icon="@mipmap/ic_launcher"
<!-- 指定App在手机屏幕上上显示的图标-->
android:label="@string/app_name"
<!-- 指定App在手机屏幕上上显示的名称-->
android:roundIcon="@mipmap/ic_launcher_round"
<!-- 指定App在手机屏幕上上显示的圆角图标-->
android:supportsRtl="true"
<!-- 是否支持阿拉伯语、波斯语这种从右往左的文字排列顺序-->
android:theme="@style/AppTheme">
<!-- App的显示风格-->
<activity android:name=".Main2Activity"></activity>
<!-- activity节点指定了该App拥有的活动页面信息,其中拥有android.intent.action.MAIN的activity说明它是入口页面 -->
<activity android:name=".MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
App的设计规范
App 将看得见的界面设计与看不见的代码逻辑分开,XML用来描绘应用界面,Java代码书写程序逻辑,进而生成App前后端分离的设计规约,有利于提高App集成的灵活性
使用XML的优点:
- 方便查看预览效果
- 一个布局可以被多处代码使用
- 一段代码可以适配多个界面布局,比如手机的横屏和竖屏
注意的地方: res/layout 放置默认的竖屏风格 res/layout-land 放回横屏的xml 文件,值得注意的是它们xml文件需要取一样的名字
XML 文件包含根节点、布局节点、控件节点:
- 每个界面只有一个根节点,可以有多个布局节点,也可以没有
- 根节点需要指定XML内部的命名空间 ‘xmlns:android="http://schemas.android.com/apk/res/android"’
App 新的页面需要三个步骤:创建XML 文件、创建Java 代码、 在AndroidManifest.xml 中注册页面配置