1. Android简介与环境配置 您所在的位置:网站首页 android操作系统与应用开发书籍哪个好 1. Android简介与环境配置

1. Android简介与环境配置

2024-07-04 06:38| 来源: 网络整理| 查看: 265

1.1 Android简介 1.1.1 Android系统架构

android-stack_2x.png 由上图可知,安卓系统可以分为6部分:

系统APP层:开发者开发的以及系统自带的安卓应用程序都位于这一层Java API框架层:开发安卓应用程序就是使用的这一层的Java API。原始C/C++层:包含一套C/C++库的集合,一般来说安卓应用开发者需要通过Java API开间接调用这些库。其中包括: WebKit:Web浏览器引擎框架。OpenMAX:开放媒体加速层,目的是使用统一的接口,加速处理大量的多媒体资料,最上层是OpenMAX AL(App Layer),该层代表App和多媒体中间层标准接口,使用App和多媒体接口上具有良好的可移植性。Libc:系统C库。Media Framework:媒体框架基于PacketVideo的OpenCORE,这套媒体库支持播放当和录制许多流行的音频和视频格式,以及查看静态图片,比如MP3、JPG等。SGL:底层的2D图形引擎OpenGL ES:基于OpenGL ES API实现的3D系统,该套3D库既可以使用硬件3D加速,也可以使用高度优化的软件3D加速。SQLite:提供使用轻量级关系型数据库的接口。 Android运行时:提供了Android核心库和ART虚拟机,核心库提供了Java语言核心库的绝大部分功能,ART负责运行Android应用程序,Android6新增了运行时权限,使得App可以动态申请权限,Android7则新增了多窗口模式HAL:硬件抽象层,提供对硬件的抽象Linux内核:Linux内核是系统硬件和软件Native层的中间层。 1.1.2 Android已发布的版本

Android系统在2008年发布了1.0,5.0将Dalvik虚拟机替换成了ART虚拟机,6.0加入了运行时权限

安卓版本发布时间版本号Cupcake2009年4月1.5Donut2009年9月1.6Eclair2009年10月2.0-2.1Froyo2010年5月2.2-2.2.3Gingerbread2010年12月2.3-2.3.7Honeycomb2011年2月3.0-3.2.6Ice Cream Sandwich2011年10月4.0-4.0.4Jelly Bean2012年7月4.1-4.3.1KitKat2013年10月4.4-4.4.4Lollipop2014年11月5.0-5.1.1Marshmallow2015年10月6.0-6.0.1Nougat2016年8月7.0-7.1.2Oreo2017年8月8.0-8.1Pie2018年8月9Android 102019年9月10Android 112020年9月11Android 122021年10月12 1.2 使用Gradle自动化构建项目

gradle更新太快了,书上的命令执行不成功,看一看就行了

1.3 配置开发环境 1.2.1 准备工具

学习本书需要安卓基础

需要的工具:

JDK:Java开发工具包,通过JDK可以使用Java语言提供的APIAndroid SDK:Android 开发工具包,通过Android SDK可以使用Android系统提供了APIAndroid Studio:Android应用程序开发的IDE 1.2.2 搭建开发环境

下载AS默认安装即可

1.2.3 创建项目

打开AS之后,点击新建项目 image.png 选择一个空Activity image.png 填写项目配置:

name:项目名Package name:包名Save Location:项目所在目录Language:语言,这里选择JavaMinimun SDK:最小支持的SDK,也就是说,使用的API可能是从这个系统版本才有的,那么在老的系统版本上运行可能会崩溃Use legacy android.support librarys:是否使用老的支持库,目前已经被AndroidX取代

image.png 点击finish就可完成项目的插件

1.2.4 代理的坑

第一个创建项目之后,发现gradle同步失败,报错:

Plugin [id: 'com.android.application', version: '7.4.2', apply: false] was not found

后来google发现是代理的问题,关掉代理即可,但是as设置代理有三个的覅发 第一处 image.png 第二处 在这个文件中把代理相关的设置去掉 image.png 第三处 删除以下文件

C:\Users\admin\.gradle

即可

1.2.5 创建模拟器

点击右上角小手机 image.png 点击Create Device image.png 选择phone->n5x image.png 系统选择安卓8,第一次需要下载一下 image.png 给手机起个名字,点击finish就创建完成 image.png 在Deveice Manager就可以看到各个创建出来的手机 image.png

1.2.6 构建、运行项目

锤子图标构建项目,运行图标运行项目,构建前选一下项目,运行前选一下手机 image.png 成功运行: image.png

1.4 Android常用开发工具的用法 1.4.1 使用Monitor进行调试

monitor用于监视Android设备的允许,位于 \AndroidSDK\tools下,点击monitor.bat即可启动 image.png

1.4.2 ADB的用法

ADB:Android Debug Bridge,也是专门用于调试安卓设备的工具,有很多功能,位于Android SDK安装目录下的platform-tools文件夹下。 ADB的功能如下:

1. 查看当前运行的设备 adb devices 2. 文件拷贝

PC->手机

adb push test.txt /sdcard/test.txt

手机->PC

adb pull /sdcard/test.txt a.txt 3. 启动Android的shell窗口 adb shell 4. 安装、卸载APK程序

安装:

adb install [-r] [-s] -r:重新安装APK包-s:将APK安装到SD卡上

卸载:

adb uninstall [-k] -k:只删除应用程序,保留该程序所用的数据和缓存目录 1.4.3 使用mksdcard管理虚拟SD卡

mksdcard是一个创建虚拟存储卡的工具,位于Android SDK下的emulator目录下,使用如下命令可创建一个虚拟存储卡

mksdcard.exe 64M test.img

如果希望启动模拟器时使用指定的虚拟SD卡,可以使用如下命令:

emulator -avd 模拟器名字 -sdcard test.img 1.5 第一个Android应用

开发Android应用三步骤:

创建一个Android项目或者Android模块在XML布局文件中定义应用程序的用户界面使用Java或者Kotlin代码中编写业务实现

创建一个Android应用程序之后,在\app\src\main\res\layout目录下存在一个xml文件,这个xml文件就是用来定义用户界面的。 image.png 下面添加一个Button到界面上,然后给Button添加一个text,定义一个点击响应方法,其中id就是这个按钮的标识

这里的消息响应函数写的是字符串,可见IDE会通过反射去调用这个clickHandler方法,那这个方法又在哪个类中呢? 每个xml即用户界面都对应一个Activity类,这个类就负责这个界面的消息响应,比如刚刚创建的项目,就只有一个activity_main.xml和一个MainActivity类,这两者就是相对应的,所以需要在MainActivity编写按钮的响应方法clickHandler [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n5CbInqO-1681241138979)(https://cdn.nlark.com/yuque/0/2023/png/35508227/1681220994702-a2651a69-d0bf-49ec-affc-e2edd14b2148.png#averageHue=%23f9f8f7&clientId=u43465e45-6ba4-4&from=paste&height=629&id=u1f7c189b&name=image.png&originHeight=943&originWidth=2064&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=152679&status=done&style=none&taskId=u0ba3850d-28c1-4d4d-aa34-5d6cfadd202&title=&width=1376)] 在clickHandler方法中,传入了一个View对象,这个对象应该就是Button类的对象,View类应该是Button类的父类,所以这里可以直接将View类转成TextView类或者Button类,然后设置文本,也可以调用findViewById方法通过资源ID来获取Button对象。

public void clickHandler(View source){ //TextView tv = findViewById(R.id.button); //tv.setText("Hello Android-" + new java.util.Date()); Button btn = (Button)source; btn.setText("Hello Android-" + new java.util.Date()); }

TextView类是Button类的父类,所以用TextView来设置和Button来设置都可以

1.6 Android项目结构分析

如果只是单纯的开发Android应用程序,只需要编写xml定义界面,编写Activity类编写业务代码即可,但是项目中其他的这么多文件是用来干什么的呢?我们来分析一下。

1.6.1 Android项目结构分析

整个项目结构如下: image.png 其中关键的是app文件夹,代表了一个app模块,这也是我们刚刚创建的安卓项目的唯一的一个模块,我们了解这个文件夹里面的内容即可,而其他的文件和目录则是gradle和idea的一些全局配置。

来看app模块的结构 image.png

build:存放项目的构建结果libs:存放依赖的第三方库src:源码build.gradle:项目构建文件

可见这是一个Gradle项目,下面是build.gradle的解释

plugins { // 应用com.android.application插件,该插件提供了构建Android应用程序所需的任务和默认配置 id 'com.android.application' } //构建Android应用程序时的配置和选项 android { // 应用程序的命名空间 namespace 'com.example.hello' // 应用程序编译所需的SDK版本 compileSdk 33 defaultConfig { // 应用程序包名 applicationId "com.example.hello" // 应用程序的最小SDK版本 minSdk 26 // 应用程序的目标SDK版本 targetSdk 33 // 应用程序版本号 versionCode 1 // 应用程序版本名称 versionName "1.0" // 测试运行器 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { // 是否启用混淆 minifyEnabled false // 混淆规则 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { // 源代码兼容性版本 sourceCompatibility JavaVersion.VERSION_1_8 // 目标代码兼容性版本 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // 应用程序依赖项,可以替换成国内的仓库 implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }

src是源码文件加,其下有三个文件夹:

main:主源代码test:测试代码androidTest:安卓测试代码

我们需要关注的是main目录:

java:源代码目录res:资源目录AndroidManifest.xml:系统清单文件,用于可知Android用于的名称、图标、访问权限等整体属性,Android应用的四大组件都需要在该文件中配置。 1.6.2 R文件

以前是R.java文件,现在被替换成了R.txt和R.jar,在R.txt中有所有的资源ID字符串和ID值的对应关系 image.png 比如我们刚刚创建的Button,id给的是button_test,id值就是0x7f080063,所以这个ID其实被编译成了R类的子类int类的一个静态常量,所以在Java代码中访问是 R.id.button_test,在编译时就会被替换成0x7f080063

1.6.3 RES目录说明

res目录下存储了app的所有资源,包括图片、字符串、颜色、尺寸等。不同的资源放在不同的文件夹内,方便让AAPT工具来扫描,生成对应的R.txt文件和R.jar文件。 以字符串为例,字符串资源存放在string.xml中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkGFulDC-1681241138980)(https://cdn.nlark.com/yuque/0/2023/png/35508227/1681224981971-32e3401d-10c7-47f4-959c-e2394a4d8e8d.png#averageHue=%23f9f8f7&clientId=u43465e45-6ba4-4&from=paste&height=623&id=u5c2918b5&name=image.png&originHeight=934&originWidth=2044&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=89706&status=done&style=none&taskId=u27a4bb8b-2fa0-43d8-bbfa-0c9781cebe1&title=&width=1362.6666666666667)] 文件中定义了一个字符串常量,名字是app_name,值是"Hello",定义好之后,就可以在Java代码,XML文件中使用这个字符串资源。

1. 在Java代码中使用资源

AAPT工具为每一种资源创建了一个内部类,这些内部类都在R类中,所以访问上述的字符串资源可以通过R.String.app_name来访问

btn.setText(String.format("%x: %s", R.string.app_name, new java.util.Date())); 2. 在XML文件中使用资源

在xml中使用资源的格式:

@内部类名/资源名

比如在Button资源的定义中,使用字符串

android:text="@string/app_name"

分配资源标识符:

android:id="@+id/button_test"

要引用这个id标识符,也是通过下面这种方式访问

@id/button_test 1.6.4 清单文件AndroidManifest.xml

清单文件通常包含以下内容:

应用程序的包名,作为app的唯一标识应用程序包含的组件,如Activity、Service、BroadcastRecevier、ContentProvider应用程序兼容的最低版本应用程序所需的权限声明其他程序访该程序所需的权限声明

下面是刚刚创建的Android程序的manifest文件:

我们来逐行解释一下: 第一行是xml文件的声明,使用的xml版本是1.0,编码是utf8

然后是定义了一个根元素manifest,同时指定了两个命名空间android和tools,其中android命名空间是用来指定Android操作系统使用的属性或者元素,比如android:icon="@mipmap/ic_launcher"指定了应用程序的图标,这个图标会被系统所用来展示app,而tools用来指定在构建app是用到的属性或者元素,比如 tools:targetApi="31"指定了静态分析工具所使用的目标API版本。

接下来定义了一个application元素,这代表一个应用程序,里面包含一些应用程序级别的属性和配置,包括:

android:allowBackup:允许自动备份应用程序数据android:dataExtractionRules:数据提取规则,用于测试android:fullBackupContent:指定应用程序完整备份内容的xml文件android:icon:应用程序图标android:label:应用程序标题android:supportsRtl:支持从右到左的语言android:theme**:**应用程序的主题tools:targetApi:指定静态分析工具的目标API版本

最后,定义了一个activity元素,代表一个Activity组件,其中包含了Activity的名称.MainActivity,是否允许被调用android:exported 在activity中,定义了一个intent-filter元素,这个元素的内容指定了此activity能够处理的Intent种类。 在intent-filter元素中,action标签用于声明能够处理的Intent操作类型,category用于声明能够处理的Intent的种类。 MAIN表示这个组件是应用程序的入口点,LAUNCHER表示这个组件可以被应用程序的启动器调用,总而言之就是这个Activiy是app启动的第一个Activity

1.6.5 应用程序权限说明

app需要一些权限才能使用系统的功能,所以需要在manifest文件中声明自己所需要的权限。 在元素内添加子元素即可声明权限,比如

在Android6之前,权限声明是,并且在安装APP时需要用户同意申请的全部权限。 在Android6以后,Android系统加入了动态权限申请机制,声明权限变成了,除了这个声明,还需要写代码动态申请权限,上面的声明只是告诉系统需要使用这些权限,但并不会在安装时提示用户授权,在运行时执行到申请权限的代码时才会提示,所以,在高版本系统中,申请权限需要两个动作:1. 在清单文件中加上权限声明;2. 写代码动态申请权限。

系统中常用的权限如下:

权限关键字说明android.permission.CAMERA允许应用访问摄像头进行拍照和视频录制android.permission.RECORD_AUDIO允许应用录制音频android.permission.READ_CONTACTS允许应用读取用户的联系人信息android.permission.WRITE_CONTACTS允许应用修改或删除用户的联系人信息android.permission.CALL_PHONE允许应用拨打电话android.permission.READ_PHONE_STATE允许应用读取设备的电话状态android.permission.READ_SMS允许应用读取短信android.permission.SEND_SMS允许应用发送短信android.permission.READ_CALENDAR允许应用读取用户的日历信息android.permission.WRITE_CALENDAR允许应用修改或删除用户的日历信息android.permission.ACCESS_FINE_LOCATION允许应用访问设备的精准位置信息android.permission.ACCESS_COARSE_LOCATION允许应用访问设备的大概位置信息android.permission.WRITE_EXTERNAL_STORAGE允许应用写入外部存储(例如SD卡)android.permission.READ_EXTERNAL_STORAGE允许应用读取外部存储(例如SD卡)android.permission.INTERNET允许应用访问网络 1.7 基本组件介绍

安卓App通常由一个或者多个基本组件组成,最重要的就是四大组件:

Activity:活动Service:服务BroadcastReciver:广播接收者ContentProvider:内容提供者 1.7.1 Activity和View

Activity是安卓系统中负责与用户进行交互的组件,但它本身不显示内容,要显示内容需要借助View类,通过setContentView来显示View类。

View组件是所有UI控件、容器控件的基类,View组件就是安卓App中用户实实在在能看到的部分,但是VIew组件需要放到容器中或者通过Acticity显示出来。

实际上,Activity就是窗口的容器,其包含一个getWindow方法来获取Window对象,这个方法返回一个Windows对象,那么一个Activity对应一个Window对象?如果不调用setContentView来显示View,则该Activity显示一个空窗口。

Activity包含一个setTheme方法来设置窗口风格。

一个安卓App可以包含多个Activity,多个Activity形成Activity栈,当前活动的Activity位于栈顶。

1.7.2 Service

Service也是一个单独的Android组件,通常位于后台运行,没有界面,拥有自己独立的声明周期,通常用于为其他组件提供后台服务,或者监控其他组件的运行状态。

1.7.3 BroadcastReceiver

BroadRecevier是广播接收者,用于监听安卓App中其他组件的消息,其他组件可以通过sendBroadcast来触发注册了BroadRecevier的onReceive方法。 注册广播接收者有两种方式:

写代码,通过Context.registerRecevier来注册在AndroidManifest.xml中使用注册 1.7.4 ContentProvider

ContentProvider是内容提供者,通常用于跨进程共享数据,一个应用通过ContentProvider提供数据,另一个通过ContentResolver来访问数据。

1.7.5 Intent和IntentFilter

Intent不是组件,但是是安卓应用程序内不同组件之间通信的载体,当App运行时需要连接不同组件时,就需要借助Intent来实现。 比如:

启动一个Activity启动一个Service触发一个BroadcastReceiver

都需要借助Intent,Intent封装了目标组件的信息。

Intent分类:

显示Intent:明确要启动的组件的类名隐式Intent:指定启动的组件的条件,不指定类名

系统如何判断组件是否满足隐式Intent要求呢?这就是通过IntentFilter来实现了,组件可以通过IntentFilter来声明自己所满足的条件。

1.8 手动签名

签名的作用:

确定发布者的身份确保应用的完整性

在使用AS调试程序的时候,会打一个调试签名,这样签名的App不能直接发布。

1.8.1 使用AndroidStudio对Android应用签名

build->Generate Signed Bundle/APK [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CxikCVeM-1681241138980)(https://cdn.nlark.com/yuque/0/2023/png/35508227/1681239572706-54927b48-88d6-45cd-8cf4-57023fb67fae.png#averageHue=%23f1f0ed&clientId=u43465e45-6ba4-4&from=paste&height=379&id=u8c64f1d6&name=image.png&originHeight=569&originWidth=1089&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=80183&status=done&style=none&taskId=u9aaf7ee2-2e93-488e-aeab-bb65f25d170&title=&width=726)] 选择APK,不要选AAB image.png 第一次用是没有key的,需要创建一个新的 image.png 填写一个表格,点击ok,就能创建成功 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cxquL7dD-1681241138981)(https://cdn.nlark.com/yuque/0/2023/png/35508227/1681239877441-df6c2c0f-4d08-42bf-99d8-f968bb3c364b.png#averageHue=%23f2f1f1&clientId=u43465e45-6ba4-4&from=paste&height=531&id=ua6466b0e&name=image.png&originHeight=796&originWidth=765&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=46789&status=done&style=none&taskId=u2173918b-ab00-41aa-9146-3b58301bcf7&title=&width=510)] 填写一下密钥的信息,点击next [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5KWLn1vz-1681241138981)(https://cdn.nlark.com/yuque/0/2023/png/35508227/1681239947587-d4075782-196a-4380-83b8-8b51aaaf3c27.png#averageHue=%23f1f0f0&clientId=u43465e45-6ba4-4&from=paste&height=405&id=u1bbf0333&name=image.png&originHeight=608&originWidth=774&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=37276&status=done&style=none&taskId=ufa7ef805-a211-48bc-a31d-33d0450b407&title=&width=516)] 选release,点击Create,就会开始签名 image.png 稍等也会,就会签名成功,然后会在右小角弹窗,点击locate就能定位到签名好的APK位置,在\app\release下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02DwhOoV-1681241138981)(https://cdn.nlark.com/yuque/0/2023/png/35508227/1681240024861-c8396db3-7769-4f1d-a34d-570e07999bac.png#averageHue=%23eae8e7&clientId=u43465e45-6ba4-4&from=paste&height=137&id=u493588c2&name=image.png&originHeight=206&originWidth=523&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=13427&status=done&style=none&taskId=u81167185-1d6a-42bb-9fe4-7ba23c9025d&title=&width=348.6666666666667)]

通过adb可以将apk安装到安卓手机上去

adb.exe install .\app-debug.apk 1.8.2 使用Android 9的命令对APK签名

步骤:

创建Key Store,命令:keytool -genkeypair -alias st0ne -keyalg RSA -validity 400 -keystore st0ne.jks,输入命令之后需要输入密码,以及信息 -genkeypair:创建密钥对-alias:密钥的别名-keyalg:加密算法-validity:有效期-keystore:路径 使用apksigner对apk进行签名,apksigner.bat位于Android SDK的build-tools下,命令:apksigner sign --ks st0ne.jks --ks-key-alias st0ne --out signed.apk app-debug.apk验证签名,apksigner verify -v .\signed.apk使用adb进行安装


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有