# 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年*
