安卓

Android基础大纲

大纲-Android基础

幕布笔记:安卓复习

笔记

  • appium运行后会在手机上自行安装了appiumtest这几个东西,会影响app的软键盘弹出

默认创建的Android工程都有什么

.gradle 与 .idea

点击sync后,AS会在每个工程下生成.iml文件,他们与.gradle.idea配合为我们提供了代码提示等常见功能。如果代码飘红而你确认依赖没有问题,可以尝试以下步骤清除AS缓存:

  1. .gradle.idea文件
  2. 命令行执行 ./gradlew clean
  3. 选择 File -> invalidate caches/restart
  4. Sync

gradle/wrapper 与 gradlew gradlew.bat

当我们初次配置Android环境时,需要安装Java,安装AS但不需要安装Gradle,这其中就是 gradle/wrapper 的功劳。

当执行 gradlew 脚本时,可以保证每个项目都用自己期望的 Gradle 版本,奥秘就在 gradlew 的这段代码中:

1
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

gradlew 并没有直接启动 Gradle 二是启动 gradle-wrapper.jar,它会判断如果没有 Gradle 环境,从 gradle-wrapper.properties 中的 distributionUrl 中下载相应环境,并启动 Gradle。

setting.gradle

其提供的include方法,通过这个方法可以指定哪些工程需要参与编译,每个参与编译的工程Gradle会为它创建一个Project对象

根目录 build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
mavenCentral()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}
  1. buildscript代码块

    gradle默认是自顶向下执行,无论buildscript代码块在哪,它都是第一执行

  2. repositories和dependencies

    repositories 表示 dependencies 声明的依赖去哪些仓库找,google、jcenter、mavenCentral 都是第三方 Maven 仓库。同时,也可以通过 maven 方法添加自己的 Maven 仓库。需要注意的是,不应该假设组件一定会从特定仓库拉取,如果 Gradle 请求一个仓库超时,它会自动请求其他仓库。

    dependencies:代表 Gradle 执行需要哪些依赖。比如需要 Android Gradle Plugin 插件为我们打包 apk 包,就需要添加

    1. classpath 'com.android.tools.build:gradle:3.4.0'
  3. allprojects 和 repositories:
    在 allprojects 中的配置会对所有工程生效而里面的 repositories 则表示工程声明的 dependencies 去哪些仓库查找

app build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apply plugin: 'com.android.application'

android{
compileSdkVersion 28
defaultConfig{
applicationId "com.baidu.newproject"
minSdkVersion 19
targetSdkVersion 28
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.runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.baidu.searchbox.services:ubc:10.13.106'
}

当应用这个插件 apply plugin: 'com.android.application'后,它会为我们创建一系列Task,比如 assembleDebug、assembleRelease,执行这些 task 就会得到最终的 APK。
android 代码块是插件为我们提供的 API 允许我们修改 Task 的行为。
dependencies 代码块的内容决定当前 Project 依赖哪些组件,而不同的依赖声明会有不同的结果。

看不到android.jar源码

点开对应的源码看到throw new RuntimeException("Stub!");

解决:

  • 方案一(推荐):看看源码版本是多少,打开AS》Settings》Launguages & Frameworks 》Android SDK,勾选对应版本的源码(比如Android SDK Platform 34
  • 方案二:按教程,下载下来,替换掉对应版本 ${Android Sdk}/platforms/andorid-api/ 下的android.jar,之后sync一下。(如果还看不到 ,那么把src也复制到${Android Sdk}/platforms/andorid-api/ 下)

初识Android

  1. Android历史

    Android之父是谁?

    答案:Andy Rubin(安迪鲁宾)。

  2. 移动操作系统简介

    请写出当前比较流行的几款移动操作系统与其开发语言。

    答案:Windows Mobile / Phone的开发语言是C#和C++、iOS的开发语言是Objective-C、Symbian的开发语言是C++、BlackBerry的开发语言是Java、Android使用Java作为主要的应用开发语言,在需要更改Android的底层功能时,需要使用C或C++。

  3. Android版本更替

    现在最新的Android版本叫什么?

    答案:叫做Jelly Bean(果冻豆),也就是4.2版。

  4. Android系统特性

    Android系统的特性有很多,请说出四个特性。

    答案:显示布局、数据存储、网络、信息、浏览器、编程语言支持、媒体支持、流媒体支持、硬件支持、多点触控、蓝牙、多任务处理、语音功能、无线共享功能、截图功能、跨平台、应用程序安全机制。

  5. Android系统架构

    写出Android系统架构有几层,分别是哪几层。

    答案:有四层。分别是Linux内核、本地库和Java运行时环境、应用程序框架、应用程序。

    Android系统的架构。

    答案:android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

    1.应用程序

      Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

    2.应用程序框架

      开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。

      隐藏在每个应用后面的是一系列的服务和系统, 其中包括;

      * 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。

      * 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据

      * 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。

      * 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。

      * 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

      有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序.

    3.系统运行库

      1)程序库

      Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:

      * 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。

      * 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

      * Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。

      * LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。

      * SGL - 底层的2D图形引擎

      * 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。

      * FreeType -位图(bitmap)和矢量(vector)字体显示。

      * SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

      2)Android 运行库

      Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。

      每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。

      Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

    4.Linux 内核

        Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
    

res目录

res目录

Android 系统架构(5 层)

安卓/安卓系统5层架构

编译型语言、解释型语言

编译型语言将源代码一次性编译成计算机可识别的二进制文件,然后计算机直接执行,如 C 和 C++都属于编译型语言。

解释型语言,有一个解释器,在程序运行时,解释器会一行行读取源代码,然后实时将这些代码解释成计算机可识别的二进制数据后再执行,故通常效率会差一些,像 Python 和 JavaScript 都是解释型语言。

Java先编译成特殊的 class 文件(不是计算机可识别的二进制文件),此 class 只有在 Java 虚拟机(Android 中叫 ART,一种移动优化版的虚拟机)才能识别,而这个虚拟机就是担当解释器的角色,它会在程序运行时将编译后的 class 解释成计算机可识别的二进制数据后再执行,因此,准确来讲,Java 属于解释型语言。

Kotlin 工作原理:Kotlin 就是编译成 class 文件,Java 虚拟机不关心 class 是 Java 编译来的还是 Kotlin 编译来的,只要符合规格的 class 文件即可识别。

Dalvik 和 ART

ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

Serializable/Parcelable

  • Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接 在内存中读写
  • Serializable 会使用反射,序列化和反序列化过程需要大量 I/O 操作, Parcelable 自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多

手机按下电源

Linux内核启动–》Init进程(第一个用户级进程)–》加载配置脚本(启动关键服务)

Init进程定义:它是Linux内核启动的第一个用户级进程。Init进程主要任务为启动Android关键服务,守护关键服务进程,确保不被杀死。

Init与Andorid关系:当Linux内核启动之后通过启动用户级程序init来完成引导Android Framework的建立。因此,init总是第一个进程(它的进程号总是1

Zygote孵化出app进程,若zygote进程被杀掉那么手机会重启

1
2
adb shell
ls //列出所有进程,可以看到init进程

Context

Context本身是一个抽象类,是对一系列系统服务接口的封装,包括:内部资源、包、类加载、I/O操作、权限、主线程、IPC和组件启动等操作的管理。ContextImpl, Activity, Service, Application这些都是Context的直接或间接子类, 关系如下:
安卓/context类图

ContextWrapper是代理Context的实现,简单地将其所有调用委托给另一个Context(mBase)。

Application、Activity、Service通过attach() 调用父类ContextWrapper的attachBaseContext(), 从而设置父类成员变量mBase为ContextImpl对象;, ontextWrapper的核心工作都是交给mBase(即ContextImpl)来完成.

Builder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class User{
private final String mFirstName;//必选
private final String mLastName;//必选
private final int mAge;//可选
private String mPhoneNo;//可选

private User(UserBuilder builder){
mFirstName = builder.firstName;
mLastName = builder.lastName;
mAge = builder.age;
mPhoneNo = builder.phoneNo;
}

public String getFirstName(){
return mFirstName;
}
public String getLastName(){
return mLastName;
}
public int getAge(){
return mAge;
}
public String getPhone(){
return mPhoneNo;
}

public static class UserBuilder{
private final String firstName;
private final String lastName;
private int age;
private String phoneNo;

public UserBuilder(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public UserBuilder age(int age){
this.age= age;
return this;
}
public UserBuilder phone(String phone){
this.phone = phone;
return this;
}
public User build(){
return new User(this);
}
}
}
1
2
3
4
5
6
7
8
//调用
public User getUser(){
return new
User.USerBuilder("jack", "Wilson")
.age(30)
.phone("13122345678")
.build();
}

变种Builder 模式的自动化生成。在 AS 的 plugin 中搜索”InnerBuilder“安装。在 User 类中右键打开 Generate 菜单,选择 Builder 按钮,会自动生成 User 的 Builder 静态内部类(不过长得不大一样)

注解

android-apt 是在 Android Studio 中使用注解处理器的一个辅助插件。

只在编译期间引入注解处理器所在函数库作为依赖,不会打包到最终生成的 APK 中。

为注解处理器生成的源代码设置好正确的路径,以便 Android Studio 能够正常找到。

DialogmentFragment详细生命周期

DialogmentFragment详细的生命周期为:

  1. onAttach(Activity): 当Activity与Fragment发生关联时调用(已废弃,但是还是调用了)
  2. onAttach(Context):当Activity与Fragment发生关联时调用
  3. onCreate(Bundle):初始化Fragment。可通过参数savedInstanceState获取之前保存的值
  4. onCreateDialog(Bundle):重写以生成自己的对话框,通常用于显示AlertDialog,而不是常规对话框;执行此操作时,不需要实现OnCreateView),因为AlertDialog会处理自己的内容。
  5. onCreateView( LayoutInflater, ViewGroup, Bundle):让Fragment实例化View。
  6. onViewCreated(View, Bundle):紧随onCreateView调用,表示view已初始化完成。
  7. onActivityCreated(Bundle):执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。
  8. onStart():执行该方法时,Fragment由不可见变为可见状态。
  9. onResume():执行该方法时,Fragment处于活动状态,用户可与之交互。
  10. onCancel(DialogInterface):取消对话框时将调用此方法。onCancel会调用onDismiss
  11. onDismiss(DialogInterface):关闭对话框时将调用此方法。
  12. onPause():执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。
  13. onStop():执行该方法时,Fragment完全不可见。
  14. onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。通常在ViewPager+Fragment的方式下会调用此方法。
  15. onDestroy():销毁Fragment。通常按Back键退出或者Fragment被回收时调用此方法。
  16. onDetach():解除与Activity的绑定。在onDestroy方法之后调用。

链接

国内Android大佬github统计

https://github.com/getActivity/AndroidGithubBoss

Android 笔记及面试题

AndroidInterview-Q-A

https://github.com/JackyAndroid/AndroidInterview-Q-A

CharonChui/AndroidNote

https://github.com/CharonChui/AndroidNote

linsir6/AndroidNote

https://github.com/linsir6/AndroidNote

Awesome-Android-Interview

https://github.com/JsonChao/Awesome-Android-Interview

Android-Daily-Interview

https://github.com/Moosphan/Android-Daily-Interview

AndroidOfferKiller

https://github.com/Blankj/AndroidOfferKiller

Android_QA

https://github.com/Omooo/Android_QA

AndroidBookmark

https://github.com/mikaelzero/AndroidBookmark