Build AOSP for Pixel 3 XL

AOSP 的构建流程已经比较清晰,大致分为:同步代码、添加对应设备的驱动和内核、构建目标镜像。之前尝试构建 AOSP 来排查一些问题,但 Pixel 3 XL 的官方适配只到 Android 12。最近在 Chromium 开发中需要测试 WebView,因此使用 LineageOS 21 的适配来方便构建。 前提条件 默认已安装 AOSP 构建环境: AOSP 环境准备 Codenames, Tags, and Build Numbers 同步 AOSP 源码 1 2 3 4 mkdir ~/aosp cd ~/aosp repo init --partial-clone -b android-12.0.0_r34 -u https://android.googlesource.com/platform/manifest repo sync -c -j8 获取驱动 在 Codenames, Tags, and Build Numbers 页面搜索 Pixel 3 XL(代号 crosshatch),获取最新 Build ID,示例:SP1A.210812.016.C2 在 Google Drivers 页面下载对应 Build ID 的驱动 1 2 3 4 5 6 7 8 9 mkdir vendor_backup && cd vendor_backup wget https://dl.google.com/dl/android/aosp/google_devices-crosshatch-sp1a.210812.016.c2-a4e274b7.tgz wget https://dl.google.com/dl/android/aosp/qcom-crosshatch-sp1a.210812.016.c2-00a7f1f3.tgz tar xvf qcom-crosshatch-*.tgz tar xvf google_devices-crosshatch-*.tgz ./extract-google_devices-crosshatch.sh ./extract-qcom-crosshatch.sh mv vendor/ ../ 构建并刷机 参考 Building AOSP 文档: ...

2022年8月15日 · 1 分钟 · haoxiqiang

利用自建 Nexus 仓库优化 Android 构建

在 Android 项目的依赖管理中,通常需要配置多个远程仓库,如 jcenter、jitpack、google() 等。一些大型项目(如"最右")甚至依赖超过 10 个仓库。当首次初始化项目、依赖发生变化或网络出现问题时,构建过程的排査会变得相当困难。 很早之前就发现了这个问题,但一直因为懒没有处理。本文记录 Nexus 的搭建与配置过程。 安装并配置 Nexus 前置条件:JDK 8+。 1 2 3 4 5 6 7 8 9 10 11 12 # 下载并解压 Nexus mkdir /app && cd /app wget -O nexus.tar.gz https://download.sonatype.com/nexus/3/latest-unix.tar.gz tar -xvf nexus.tar.gz mv nexus-3* nexus # 创建专用用户 adduser nexus # 修改目录权限 chown -R nexus:nexus /app/nexus chown -R nexus:nexus /app/sonatype-work 配置运行用户: 1 2 3 vi /app/nexus/bin/nexus.rc # 添加以下内容 run_as_user="nexus" 如需修改存储路径等,编辑 JVM 参数: ...

2019年12月31日 · 1 分钟 · haoxiqiang

Android 的 MediaStore

最近在写一个类似微信的相册功能,需要读取照片和视频,支持多文件夹切换,且速度要比微信快。调研后发现基于 MediaStore 的方案最为合适。以前用得不多,特此记录。 ContentResolver 对 GROUP BY 的特殊处理 ContentResolver.query() 没有提供 groupBy 参数(与 SQLiteQueryBuilder.query() 不同),但可以通过在 selection 参数中嵌入 GROUP BY 来实现类似效果。 原理是 ContentResolver 会在编译 SQL 时给 selection 自动加上括号包裹,形成 WHERE ( ... )。利用这一点,可以在 selection 中提前闭合括号,然后追加 GROUP BY 子句。 1 2 3 4 5 6 // 常规写法 — selection 会被包装成 WHERE (mime_type IS NOT NULL) MediaStore.Images.ImageColumns.MIME_TYPE + " IS NOT NULL " // Hack 写法 — 利用闭合括号注入 GROUP BY MediaStore.Images.ImageColumns.MIME_TYPE + " IS NOT NULL " + ") GROUP BY (" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME; 生成的 SQL 变为: ...

2017年3月31日 · 2 分钟 · haoxiqiang

问题整理(二)

第二篇问题整理,主要涉及 WebView 的内存管理和 Cookie 同步,以及一些其他细节。 ...

2016年1月19日 · 2 分钟 · haoxiqiang

使用 RxJava 写一个应用

最近准备写一个知乎日报客户端,主要是练习和验证 RxJava 在实际项目中的价值。RxJava 在国外社区很火热,目前支持的编程语言包括 Java、JavaScript、C#、Scala、Clojure、C++、Python、Ruby、Kotlin、Swift 等。 ...

2016年1月7日 · 1 分钟 · haoxiqiang

Android 开发中遇到的问题整理

读到 Xiaoke’s Blog 上的一些问题整理,发现自己很多也遇到过,抽空整理一下。 ...

2015年12月29日 · 3 分钟 · haoxiqiang

Android Resource Shrinking 资源清理

构建项目时发现 shrinkResources 这个属性,用于删除项目中未使用的资源文件。记录一下使用中的问题和配置方法。 ...

2015年12月23日 · 1 分钟 · haoxiqiang

RecyclerView 实现树形菜单

很早想写这样一个 Demo。以前实现树形菜单使用 TreeViewList(继承 ListView 的封装),或者用 ExpandableListView 实现多级菜单。后来发现根本不需要自定义控件——直接使用 RecyclerView,只需要控制数据源的展平转换即可。 核心思路:以递归方式将嵌套数据结构展平为线性列表,通过 notifyItemRangeInserted / notifyItemRangeRemoved 控制展开和收起。 ...

2015年12月16日 · 3 分钟 · haoxiqiang

如何根据错误日志解决问题 —— Bugly 博客整理

项目中使用腾讯 Bugly 做崩溃监控。同类工具功能相似,选择 Bugly 主要是因为统计界面友好、品牌可靠。以下整理的 Bugly 技术博客文章,包含开发中遇到的 case 和很有启发性的分析思路。 ...

2015年7月29日 · 1 分钟 · haoxiqiang

Volley 自定义中的几个问题

项目中使用 Volley 作为网络库,封装过程中遇到几个常见问题,记录如下。以下内容不兼容 Android 2.3 及以下版本。 ...

2015年6月9日 · 1 分钟 · haoxiqiang