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