523 lines
12 KiB
Markdown
523 lines
12 KiB
Markdown
# Android基础
|
||
|
||
## 目录
|
||
- [Android系统架构](#android系统架构)
|
||
- [应用组件](#应用组件)
|
||
- [应用生命周期](#应用生命周期)
|
||
- [资源管理](#资源管理)
|
||
- [权限系统](#权限系统)
|
||
- [应用签名](#应用签名)
|
||
- [打包流程](#打包流程)
|
||
- [版本适配](#版本适配)
|
||
- [面试常见问题](#面试常见问题)
|
||
|
||
---
|
||
|
||
## Android系统架构
|
||
|
||
### 四层架构
|
||
|
||
```
|
||
┌─────────────────────────────────┐
|
||
│ Applications(应用层) │
|
||
│ (系统应用、第三方应用) │
|
||
└─────────────────────────────────┘
|
||
│
|
||
┌─────────────────────────────────┐
|
||
│ Application Framework(应用框架层)│
|
||
│ (Activity Manager, Content Provider等)│
|
||
└─────────────────────────────────┘
|
||
│
|
||
┌─────────────────────────────────┐
|
||
│ Libraries & Android Runtime │
|
||
│ (系统库、Android运行时) │
|
||
└─────────────────────────────────┘
|
||
│
|
||
┌─────────────────────────────────┐
|
||
│ Linux Kernel(Linux内核) │
|
||
│ (驱动、内存管理、进程管理等) │
|
||
└─────────────────────────────────┘
|
||
```
|
||
|
||
### 各层说明
|
||
|
||
#### 1. 应用层(Applications)
|
||
- 系统应用:电话、短信、浏览器等
|
||
- 第三方应用:用户安装的应用
|
||
|
||
#### 2. 应用框架层(Application Framework)
|
||
- **Activity Manager**:管理 Activity 生命周期
|
||
- **Window Manager**:管理窗口
|
||
- **Content Provider**:数据共享
|
||
- **View System**:UI 组件
|
||
- **Package Manager**:应用管理
|
||
- **Telephony Manager**:电话管理
|
||
- **Resource Manager**:资源管理
|
||
- **Location Manager**:位置管理
|
||
- **Notification Manager**:通知管理
|
||
|
||
#### 3. 系统库和运行时
|
||
- **系统库**:SQLite、WebKit、OpenGL ES 等
|
||
- **Android Runtime**:ART(Android 5.0+)或 Dalvik
|
||
|
||
#### 4. Linux 内核
|
||
- 驱动:显示驱动、音频驱动、相机驱动等
|
||
- 内存管理、进程管理、网络协议栈
|
||
|
||
---
|
||
|
||
## 应用组件
|
||
|
||
### 四大组件
|
||
|
||
#### 1. Activity(活动)
|
||
|
||
```java
|
||
// Activity:用户界面
|
||
public class MainActivity extends AppCompatActivity {
|
||
@Override
|
||
protected void onCreate(Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
setContentView(R.layout.activity_main);
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 2. Service(服务)
|
||
|
||
```java
|
||
// Service:后台服务
|
||
public class MyService extends Service {
|
||
@Override
|
||
public IBinder onBind(Intent intent) {
|
||
return null;
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 3. BroadcastReceiver(广播接收器)
|
||
|
||
```java
|
||
// BroadcastReceiver:接收广播
|
||
public class MyReceiver extends BroadcastReceiver {
|
||
@Override
|
||
public void onReceive(Context context, Intent intent) {
|
||
// 处理广播
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4. ContentProvider(内容提供者)
|
||
|
||
```java
|
||
// ContentProvider:数据共享
|
||
public class MyProvider extends ContentProvider {
|
||
@Override
|
||
public Cursor query(Uri uri, String[] projection, String selection,
|
||
String[] selectionArgs, String sortOrder) {
|
||
// 查询数据
|
||
return null;
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 应用生命周期
|
||
|
||
### Application 生命周期
|
||
|
||
```java
|
||
public class MyApplication extends Application {
|
||
@Override
|
||
public void onCreate() {
|
||
super.onCreate();
|
||
// 应用创建时调用
|
||
}
|
||
|
||
@Override
|
||
public void onTerminate() {
|
||
super.onTerminate();
|
||
// 应用终止时调用(通常不会调用)
|
||
}
|
||
|
||
@Override
|
||
public void onLowMemory() {
|
||
super.onLowMemory();
|
||
// 内存不足时调用
|
||
}
|
||
|
||
@Override
|
||
public void onTrimMemory(int level) {
|
||
super.onTrimMemory(level);
|
||
// 内存紧张时调用
|
||
}
|
||
}
|
||
```
|
||
|
||
### Activity 生命周期
|
||
|
||
```java
|
||
public class MainActivity extends AppCompatActivity {
|
||
@Override
|
||
protected void onCreate(Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
// 创建 Activity
|
||
}
|
||
|
||
@Override
|
||
protected void onStart() {
|
||
super.onStart();
|
||
// Activity 可见但不可交互
|
||
}
|
||
|
||
@Override
|
||
protected void onResume() {
|
||
super.onResume();
|
||
// Activity 可见且可交互
|
||
}
|
||
|
||
@Override
|
||
protected void onPause() {
|
||
super.onPause();
|
||
// Activity 失去焦点
|
||
}
|
||
|
||
@Override
|
||
protected void onStop() {
|
||
super.onStop();
|
||
// Activity 不可见
|
||
}
|
||
|
||
@Override
|
||
protected void onDestroy() {
|
||
super.onDestroy();
|
||
// Activity 被销毁
|
||
}
|
||
|
||
@Override
|
||
protected void onRestart() {
|
||
super.onRestart();
|
||
// Activity 重新启动
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 资源管理
|
||
|
||
### 资源类型
|
||
|
||
```xml
|
||
<!-- 字符串资源 -->
|
||
<string name="app_name">MyApp</string>
|
||
|
||
<!-- 颜色资源 -->
|
||
<color name="primary">#3F51B5</color>
|
||
|
||
<!-- 尺寸资源 -->
|
||
<dimen name="padding">16dp</dimen>
|
||
|
||
<!-- 布局资源 -->
|
||
<layout>...</layout>
|
||
|
||
<!-- 图片资源 -->
|
||
<drawable>...</drawable>
|
||
```
|
||
|
||
### 资源访问
|
||
|
||
```java
|
||
// 代码中访问资源
|
||
String appName = getString(R.string.app_name);
|
||
int color = getColor(R.color.primary);
|
||
float padding = getResources().getDimension(R.dimen.padding);
|
||
|
||
// XML 中访问资源
|
||
android:text="@string/app_name"
|
||
android:background="@color/primary"
|
||
android:padding="@dimen/padding"
|
||
```
|
||
|
||
### 多语言支持
|
||
|
||
```xml
|
||
<!-- values/strings.xml(默认) -->
|
||
<string name="hello">Hello</string>
|
||
|
||
<!-- values-zh/strings.xml(中文) -->
|
||
<string name="hello">你好</string>
|
||
|
||
<!-- values-en/strings.xml(英文) -->
|
||
<string name="hello">Hello</string>
|
||
```
|
||
|
||
---
|
||
|
||
## 权限系统
|
||
|
||
### 权限类型
|
||
|
||
#### 1. 普通权限(Normal Permissions)
|
||
|
||
```xml
|
||
<!-- AndroidManifest.xml -->
|
||
<uses-permission android:name="android.permission.INTERNET" />
|
||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||
```
|
||
|
||
#### 2. 危险权限(Dangerous Permissions)
|
||
|
||
```java
|
||
// Android 6.0+ 需要运行时申请
|
||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
|
||
!= PackageManager.PERMISSION_GRANTED) {
|
||
ActivityCompat.requestPermissions(this,
|
||
new String[]{Manifest.permission.CAMERA},
|
||
REQUEST_CODE);
|
||
}
|
||
|
||
@Override
|
||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||
if (requestCode == REQUEST_CODE) {
|
||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||
// 权限已授予
|
||
} else {
|
||
// 权限被拒绝
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 权限组
|
||
|
||
```java
|
||
// 权限组
|
||
// - CALENDAR:日历权限
|
||
// - CAMERA:相机权限
|
||
// - CONTACTS:联系人权限
|
||
// - LOCATION:位置权限
|
||
// - MICROPHONE:麦克风权限
|
||
// - PHONE:电话权限
|
||
// - SENSORS:传感器权限
|
||
// - SMS:短信权限
|
||
// - STORAGE:存储权限
|
||
```
|
||
|
||
---
|
||
|
||
## 应用签名
|
||
|
||
### 签名作用
|
||
|
||
1. **身份标识**:标识应用开发者
|
||
2. **完整性验证**:确保应用未被篡改
|
||
3. **权限控制**:相同签名的应用可以共享数据
|
||
|
||
### 签名流程
|
||
|
||
```bash
|
||
# 生成密钥库
|
||
keytool -genkey -v -keystore my-release-key.jks
|
||
-keyalg RSA -keysize 2048 -validity 10000
|
||
-alias my-key-alias
|
||
|
||
# 签名 APK
|
||
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
|
||
-keystore my-release-key.jks app-release-unsigned.apk my-key-alias
|
||
|
||
# 验证签名
|
||
jarsigner -verify -verbose -certs app-release-unsigned.apk
|
||
```
|
||
|
||
### Gradle 配置
|
||
|
||
```gradle
|
||
android {
|
||
signingConfigs {
|
||
release {
|
||
storeFile file('my-release-key.jks')
|
||
storePassword 'password'
|
||
keyAlias 'my-key-alias'
|
||
keyPassword 'password'
|
||
}
|
||
}
|
||
|
||
buildTypes {
|
||
release {
|
||
signingConfig signingConfigs.release
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 打包流程
|
||
|
||
### APK 构建流程
|
||
|
||
```
|
||
1. 编译 Java/Kotlin 代码 → .class 文件
|
||
2. 转换为 DEX 文件
|
||
3. 打包资源文件
|
||
4. 生成未签名 APK
|
||
5. 签名 APK
|
||
6. 对齐优化(zipalign)
|
||
7. 生成最终 APK
|
||
```
|
||
|
||
### 构建工具
|
||
|
||
```gradle
|
||
// build.gradle
|
||
android {
|
||
compileSdkVersion 30
|
||
|
||
defaultConfig {
|
||
applicationId "com.example.app"
|
||
minSdkVersion 21
|
||
targetSdkVersion 30
|
||
versionCode 1
|
||
versionName "1.0"
|
||
}
|
||
|
||
buildTypes {
|
||
release {
|
||
minifyEnabled true
|
||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 版本适配
|
||
|
||
### Target SDK 版本
|
||
|
||
```gradle
|
||
android {
|
||
defaultConfig {
|
||
targetSdkVersion 30 // 目标 SDK 版本
|
||
}
|
||
}
|
||
```
|
||
|
||
### 版本适配要点
|
||
|
||
#### Android 6.0 (API 23) - 运行时权限
|
||
|
||
```java
|
||
// 需要运行时申请危险权限
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||
requestPermissions(...);
|
||
}
|
||
```
|
||
|
||
#### Android 7.0 (API 24) - FileProvider
|
||
|
||
```xml
|
||
<!-- AndroidManifest.xml -->
|
||
<provider
|
||
android:name="androidx.core.content.FileProvider"
|
||
android:authorities="${applicationId}.fileprovider"
|
||
android:exported="false"
|
||
android:grantUriPermissions="true">
|
||
<meta-data
|
||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||
android:resource="@xml/file_paths" />
|
||
</provider>
|
||
```
|
||
|
||
#### Android 8.0 (API 26) - 通知渠道
|
||
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||
NotificationChannel channel = new NotificationChannel(
|
||
CHANNEL_ID, "Channel Name", NotificationManager.IMPORTANCE_DEFAULT);
|
||
notificationManager.createNotificationChannel(channel);
|
||
}
|
||
```
|
||
|
||
#### Android 9.0 (API 28) - 网络安全
|
||
|
||
```xml
|
||
<!-- network_security_config.xml -->
|
||
<network-security-config>
|
||
<base-config cleartextTrafficPermitted="true">
|
||
<trust-anchors>
|
||
<certificates src="system" />
|
||
</trust-anchors>
|
||
</base-config>
|
||
</network-security-config>
|
||
```
|
||
|
||
#### Android 10 (API 29) - 分区存储
|
||
|
||
```java
|
||
// 使用 MediaStore 访问文件
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||
// 使用作用域存储
|
||
}
|
||
```
|
||
|
||
#### Android 11 (API 30) - 包可见性
|
||
|
||
```xml
|
||
<!-- AndroidManifest.xml -->
|
||
<queries>
|
||
<package android:name="com.example.package" />
|
||
</queries>
|
||
```
|
||
|
||
---
|
||
|
||
## 面试常见问题
|
||
|
||
### Q1: Android 系统架构?
|
||
|
||
**答案:**
|
||
四层架构:
|
||
1. **应用层**:系统应用和第三方应用
|
||
2. **应用框架层**:Activity Manager、Window Manager 等
|
||
3. **系统库和运行时**:系统库、ART
|
||
4. **Linux 内核**:驱动、内存管理、进程管理
|
||
|
||
### Q2: 四大组件?
|
||
|
||
**答案:**
|
||
1. **Activity**:用户界面
|
||
2. **Service**:后台服务
|
||
3. **BroadcastReceiver**:广播接收器
|
||
4. **ContentProvider**:内容提供者
|
||
|
||
### Q3: Activity 生命周期?
|
||
|
||
**答案:**
|
||
onCreate → onStart → onResume → onPause → onStop → onDestroy
|
||
onRestart(从 onStop 恢复时调用)
|
||
|
||
### Q4: 权限系统?
|
||
|
||
**答案:**
|
||
- **普通权限**:安装时自动授予
|
||
- **危险权限**:Android 6.0+ 需要运行时申请
|
||
- **特殊权限**:需要特殊处理
|
||
|
||
### Q5: 版本适配要点?
|
||
|
||
**答案:**
|
||
- Android 6.0:运行时权限
|
||
- Android 7.0:FileProvider
|
||
- Android 8.0:通知渠道
|
||
- Android 9.0:网络安全
|
||
- Android 10:分区存储
|
||
- Android 11:包可见性
|
||
|
||
---
|
||
|
||
*最后更新:2024年*
|