Android 开发基础

qiang.zhang大约 6 分钟

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的优点:

  1. 方便查看预览效果
  2. 一个布局可以被多处代码使用
  3. 一段代码可以适配多个界面布局,比如手机的横屏和竖屏

注意的地方: res/layout 放置默认的竖屏风格 res/layout-land 放回横屏的xml 文件,值得注意的是它们xml文件需要取一样的名字

XML 文件包含根节点、布局节点、控件节点:

  1. 每个界面只有一个根节点,可以有多个布局节点,也可以没有
  2. 根节点需要指定XML内部的命名空间 ‘xmlns:android="http://schemas.android.com/apk/res/androidopen in new window"’

App 新的页面需要三个步骤:创建XML 文件、创建Java 代码、 在AndroidManifest.xml 中注册页面配置

Loading...