android基础零碎小记录

本文档提供了丰富的Android开发实用技巧,包括ADB命令详解、常见布局使用方法、文本与控件排版技巧等,帮助开发者提高工作效率。
开源项目网址:   code.google.com
               www.github.com        
               优快云 github 开源框架

搜索国外技术论文:  image  process  filetype:pdf


--------------------------------------------------------------------------------------------------------
monkey   10000
monkey  -p   com.itheima.phone  10000


adb devices      列出所有的设备

adb start-server     开启adb服务

adb kill-server     关闭adb服务

adb logcat     查看Log

adb shell     挂载到Linux的空间

adb install <应用程序(加扩展名)>      安装应用程序

adb install –s  <模拟器名称> <应用程序(加扩展名)>     安装应用到指定模拟器

adb uninstall <程序包名>

emulator –avd  <模拟器名称>  启动模拟器

adb pull <remote> <local>

adb push <local> <remote>

android create avd –name <模拟器名称> –target <SDK版本号>  创建模拟器

ctrl + F11 横竖屏的切换




------------------------------------------------------------------------------------------------------

五大布局Layout:
     LinearLayout     线性布局
     RelativeLayout     相对布局
     AbsoluteLayout     绝对布局        android:layout_x="120dip"
     TableLayout          表格布局
     FrameLayout          帧布局



-------------------------------------------------------------------------------------------------------

android:layout_toRightOf     在指定控件的右边
android:layout_toLeftOf     在指定控件的左边
android:layout_above          在指定控件的上边
android:layout_below          在指定
控件的下边

android:layout_alignBaseline     跟指定控件水平对齐
android:layout_alignLeft     跟指定控件左对齐
android:layout_alignRight     跟指定控件右对齐
android:layout_alignTop     跟指定控件顶部对齐
android:layout_alignBottom     跟指定控件底部对齐

android:layout_alignParentLeft     是否跟父布局左对齐
android:layout_alignParentTop     是否跟父布局顶部对齐
android:layout_alignParentRight     是否跟父布局右对齐
android:layout_alignParentBottom     是否跟父布局底部对齐






---------------------------------------------------------------------------------------------------------



文字阴影效果:         
                         
                        android:layout_weight =   "1"          //将view宽度设为0个dip,然后设置所占比例
                        android:layout_width = "0dip"
     android:shadowColor = "#000000"        //阴影文字颜色
                            android:shadowDx = "1"
                           android:shadowDy  = "1"
                            android:shadowRadius  = "1"    //阴影文字粗细


控件比例排版:        



TextView控件内内容相对控件居中对齐:      android:gravity   = "center_horizontal"

view相对窗体居中对齐:      android:layout_gravity   = "center_horizontal"


requestWindowFeature(Window.   FEATURE_NO_TITLE );      //隐藏系统标题




  android:lines =   "2"          //只显示两行
  android:ellipsize = "end"   //超出文字以"..."显示



android:layout_alignParentRight   = "true"      //距父窗体对齐
 

android:singleLine = "true"      //单行显示


android:visibility   = "invisible"    //帧不居中:控件不可见


ll_loading .setVisibility(View. VISIBLE );        //在加载数据之前帧布局可见
ll_loading .setVisibility(View. INVISIBLE );     //新闻加载完之后帧布局不可见



context  .getFilesDir();      //得到文件 android零碎小记录 目录         com.itheima.phone/files



adapter .notifyDataSetChanged();              // 刷新界面






得到手机屏幕的宽和高:

  //得到手机屏幕的宽和高
            WindowManager  wm=getWindowManager();
               int   width=wm.getDefaultDisplay().getWidth();
            int   height=wm.getDefaultDisplay().getHeight();



activity自己的ID:    android.R.id. content






   //activity充满屏幕的主题
android:theme =   "@android:style/Theme.Light.NoTitleBar.Fullscreen"







<think>我们正在讨论Android系统的开机流程,特别是从开机到执行开机扫描(媒体扫描和应用扫描)的流程及其作用。根据用户提供的引用和问题,我们需要整合相关信息。 用户问题:Android系统从开机到执行开机扫描的流程及其作用,包括开机流程、开机扫描阶段、作用和原理。 根据引用内容,我们可以提取以下关键点: 1. 引用[3]提到了Android开机流程从u-boot到Idle,其中init进程会解析init.rc文件,声明服务(如zygote)并执行一些初始化操作(如mkdir, chmod, chown, setprop等)。 2. 引用[2]和[4]提到了开机应用扫描,但内容较为零碎,主要涉及面试题和资料收集。 3. 引用[5]详细描述了APK安装过程中的扫描步骤,包括扫描不同目录(如data/app, data/app-private)并解析安装包信息,最后通过installd进行安装。 4. 引用[1]则提到了媒体扫描,即扫描sdcard上的媒体文件并存入数据库,以便应用快速读取。 因此,我们可以将开机扫描分为两个主要部分:媒体扫描和应用扫描。 下面我们按照用户要求,分步骤详细解析Android系统从开机到执行开机扫描的流程: ### 一、Android开机流程概览 Android系统开机流程大致分为以下几个阶段: 1. **Bootloader阶段**:系统上电,执行Bootloader(如u-boot),加载内核。 2. **内核启动阶段**:初始化硬件,加载驱动,挂载根文件系统,启动init进程。 3. **init进程阶段**:init进程是Android用户空间的第一个进程,它解析init.rc配置文件,启动关键服务(如zygote)。 4. **Zygote启动**:Zygote进程负责孵化应用进程,它会预加载类和资源,然后启动SystemServer进程。 5. **SystemServer启动**:SystemServer是Android系统的核心,它启动各种系统服务(如ActivityManagerService, PackageManagerService等)。 6. **Launcher启动**:当系统服务准备就绪后,会启动Launcher,此时用户可以看到桌面。 ### 二、开机扫描流程 在SystemServer启动过程中,会启动两个关键服务,它们分别负责应用扫描和媒体扫描: 1. **PackageManagerService(应用扫描)**:负责扫描系统预装应用和用户安装的APK,解析其AndroidManifest.xml,并将应用信息存入数据库。 2. **MediaScannerService(媒体扫描)**:负责扫描存储设备(如SD卡)上的媒体文件(图片、音频、视频等),提取元数据并存入媒体数据库。 #### 1. 应用扫描流程及原理 **作用**:在系统启动时,系统需要知道设备上安装了哪些应用,这些应用有哪些组件(Activity、Service等)以及权限等信息,以便后续启动应用和管理。 **流程**: 1. **SystemServer启动PackageManagerService**: - 在SystemServer的`startBootstrapServices()`方法中启动PackageManagerService。 2. **扫描应用目录**: - PackageManagerService会扫描多个目录,包括: - 系统预装应用目录:`/system/app`, `/system/priv-app`, `/vendor/app`等。 - 用户安装应用目录:`/data/app`(普通应用),`/data/app-private`(受DRM保护的应用)等。 - 扫描模式:根据系统启动阶段,扫描模式可能为`SCAN_BOOTING`(开机扫描)或`SCAN_FIRST_BOOT`(首次开机)。 3. **解析APK文件**: - 使用`PackageParser`解析APK的`AndroidManifest.xml`文件,获取包名、版本号、权限、四大组件等信息。 4. **生成应用信息并写入数据库**: - 将解析得到的信息封装为`Package`对象,并存入内存中的数据结构(如`mPackages`)。 - 同时,将应用信息写入数据库(`/data/system/packages.xml`和`packages.list`),以便下次启动时快速读取。 5. **优化Dex文件**: - 在首次扫描或应用更新后,会触发Dex优化(由`Installer`服务调用`dexopt`),生成ODEX文件,提高应用启动速度。 引用[5]中提到的`scanDirLI()`和`scanPackageLI()`方法正是PackageManagerService中用于扫描和解析APK的核心方法[^5]。 #### 2. 媒体扫描流程及原理 **作用**:在设备启动或存储设备挂载时,扫描外部存储(如SD卡)中的媒体文件,将文件信息(如歌曲名、歌手、时长等)存入媒体数据库,以便媒体应用(如音乐播放器、相册)快速访问。 **流程**: 1. **触发媒体扫描**: - 在系统启动完成(`BOOT_COMPLETED`广播)或存储设备挂载(`MEDIA_MOUNTED`广播)时,系统会发送广播触发媒体扫描。 2. **启动MediaScannerService**: - 该服务接收扫描请求,并启动一个工作线程执行扫描任务。 3. **遍历文件系统**: - 从指定根目录(如`/sdcard`)开始递归遍历所有文件。 4. **解析媒体文件**: - 对于每个媒体文件(通过文件后缀名识别),调用相应的解析器(如`MediaExtractor`)提取元数据(metadata)。 - 例如,MP3文件会解析ID3标签,获取歌曲名、歌手、专辑等信息。 5. **更新媒体数据库**: - 将解析得到的媒体文件信息插入或更新到媒体数据库(`MediaStore`)中。数据库包括: - `Images.Media`:图片 - `Audio.Media`:音频 - `Video.Media`:视频 - `Files`:其他文件 6. **通知应用更新**: - 扫描完成后,发送广播(如`ACTION_MEDIA_SCANNER_FINISHED`)通知其他应用媒体数据库已更新。 引用[1]提到,媒体扫描后,应用通过`MediaProvider`(提供ContentProvider接口)访问媒体数据库,无需每次遍历文件系统[^1]。 ### 三、开机扫描的时序关系 1. **系统启动阶段**: - init进程启动后,会启动`servicemanager`(Binder服务管家)、`zygote`和`system_server`。 - system_server启动后,会启动PackageManagerService进行应用扫描。 2. **媒体扫描的触发**: - 应用扫描完成后,系统服务基本就绪,系统会发送`BOOT_COMPLETED`广播,触发媒体扫描服务(MediaScannerService)进行媒体扫描。 因此,应用扫描发生在系统服务启动过程中,而媒体扫描发生在系统启动完成后(即用户看到桌面后)。 ### 四、流程图 ```mermaid graph TD A[Bootloader] --> B[Kernel] B --> C[Init Process] C --> D[Zygote] D --> E[SystemServer] E --> F[启动PackageManagerService] F --> G[扫描系统应用目录] F --> H[扫描用户应用目录] G --> I[解析APK文件] H --> I I --> J[写入应用数据库] J --> K[优化Dex] K --> L[发送BOOT_COMPLETED广播] L --> M[启动MediaScannerService] M --> N[扫描媒体文件] N --> O[更新媒体数据库] ``` ### 五、关键代码路径 - **PackageManagerService**:`frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java` - **MediaScannerService**:`frameworks/base/media/java/android/media/MediaScannerService.java` - **媒体数据库**:由`MediaProvider`应用管理,位于`packages/providers/MediaProvider` 通过以上流程,Android系统在开机时完成了应用和媒体的扫描,为系统的正常运行提供了基础数据支持。 §§相关问题§§ 1. 如何优化Android开机扫描速度? 2. 媒体扫描的元数据提取原理是什么? 3. PackageManagerService如何管理应用权限? 4. 系统启动过程中如何避免重复扫描已安装应用?</think>### Android系统开机到扫描执行流程详解 #### 一、Android开机核心流程 ```mermaid graph TD A[Bootloader] --> B[Linux Kernel] B --> C[Init Process] C --> D[Zygote] D --> E[SystemServer] E --> F[核心服务启动] F --> G[开机扫描] ``` 1. **Bootloader阶段** - 硬件初始化,加载引导程序 - 加载Linux内核到内存 - 传递启动参数(如`init=/init`) 2. **Linux内核启动** - 初始化进程调度、内存管理 - 挂载根文件系统 - 启动第一个用户空间进程:**init**(PID=1)[^3] 3. **Init进程阶段** - 解析`init.rc`配置文件 - 关键操作: ```bash # 创建关键目录 mkdir /system /data /dev # 启动核心服务 start zygote start servicemanager ``` - 启动**Zygote**进程(Java虚拟机孵化器) 4. **Zygote启动** - 预加载核心Java类库(约3500个类) - 启动JIT编译器 - 孵化**SystemServer**进程 5. **SystemServer启动** - 启动Android核心服务: ```java // 启动顺序 startBootstrapServices(); // ActivityManager, PowerManager startCoreServices(); // BatteryService, UsageStats startOtherServices(); // PackageManager, MediaScanner ``` - 触发开机广播:`BOOT_COMPLETED` #### 二、开机扫描阶段 ```mermaid sequenceDiagram SystemServer->>PackageManagerService: 扫描应用APK PackageManagerService->>MediaScanner: 触发媒体扫描 MediaScanner->>MediaProvider: 更新数据库 ``` ##### 1. 应用扫描(PackageManagerService) **作用**:建立应用索引,管理四大组件 **流程**: 1. 扫描系统目录: ```java scanDirLI(new File("/system/app"), ...); // 系统预装应用 scanDirLI(new File("/vendor/app"), ...); // 厂商定制应用 ``` 2. 扫描用户目录: ```java scanDirLI(new File("/data/app"), ...); // 用户安装应用 scanDirLI(new File("/data/app-private"), ...); // DRM保护应用[^5] ``` 3. 解析APK: - 读取`AndroidManifest.xml` - 提取权限、Activity、Service等信息 4. 写入数据库: - `/data/system/packages.xml` - `/data/system/packages.list` **原理**: - 使用`PackageParser`解析APK结构 - 通过`Installer`服务调用`dexopt`优化DEX文件 - 广播`ACTION_PACKAGE_ADDED`通知系统 ##### 2. 媒体扫描(MediaScannerService) **作用**:建立媒体文件索引 **触发条件**: - 开机完成(接收`BOOT_COMPLETED`广播) - SD卡挂载(接收`MEDIA_MOUNTED`广播) **流程**: 1. 递归扫描存储设备: ```java processDirectory("/sdcard", ...); // 遍历所有文件 ``` 2. 文件类型识别: - 音频:MP3, WAV, FLAC - 图片:JPEG, PNG, GIF - 视频:MP4, AVI, MKV 3. 元数据提取: ```java MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(filePath); String title = mmr.extractMetadata(METADATA_KEY_TITLE); ``` 4. 更新媒体数据库: - `content://media/external/images/media` - `content://media/external/audio/media` **原理**: - 使用`MediaExtractor`解析媒体元数据 - 通过`ContentResolver`操作`MediaStore`数据库 - 发送`MEDIA_SCANNER_FINISHED`广播通知应用[^1] #### 三、关键机制解析 1. **DEX优化机制** - 首次扫描生成`/data/dalvik-cache` - 使用`dex2oat`生成OAT文件 - 优化公式: $$ T_{opt} = k \times N_{methods} + C $$ 其中$N_{methods}$为方法数,$k$为优化系数 2. **数据库设计** | 表名 | 字段 | 作用 | |---|---|---| | packages | packageName, versionCode | 应用基本信息 | | activities | name, package | 可启动组件 | | audio_meta | title, artist, duration | 音频元数据 | 3. **权限控制** - 媒体扫描需声明权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ``` - 应用扫描需系统签名 #### 四、性能优化策略 1. **增量扫描** - 记录文件`last_modified`时间戳 - 仅扫描变更文件: $$ \Delta F = \{ f | mtime(f) > T_{last\_scan} \} $$ 2. **并发处理** ```java ExecutorService pool = Executors.newFixedThreadPool(4); pool.submit(new ScanTask(subDir)); ``` 3. **索引缓存** - 使用LRU缓存最近访问记录 - 缓存大小公式: $$ C_{size} = \frac{M_{total}}{10} \text{(Android默认策略)} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值