# 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
MyApp
#3F51B5
16dp
...
...
```
### 资源访问
```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
Hello
你好
Hello
```
---
## 权限系统
### 权限类型
#### 1. 普通权限(Normal Permissions)
```xml
```
#### 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
```
#### 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
```
#### Android 10 (API 29) - 分区存储
```java
// 使用 MediaStore 访问文件
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 使用作用域存储
}
```
#### Android 11 (API 30) - 包可见性
```xml
```
---
## 面试常见问题
### 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年*