aosp环境搭建
更新环境有问题就查看,命令一直在更新,谷歌官网 1234#更新系统环境sudo apt update#安装所需软件sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig 下载源码 创建aosp目录(例aosp11),进入目录下载repo,不需要设置环境变量。参考镜像下载 额外添加-b 可以指定分支 -b可以指定下载路径 在aosp下创建android目录,下载源码,详细步骤查看清华镜像,提供了两种方式 每月更新的初始化包 传统初始化方法,例如使用指定版本android-12.1.0_r27,版本号可以去谷歌官网查看 执行repo sync -c -j4同步代码 编译12345678#加载aosp环境source build/envse...
apk编译时固定R.id
场景热修复生成补丁时,基线apk和修复后apk中资源id固定,可以有效减少补丁大小 创建ids_keep.gradle文件 123456789101112131415161718192021222324252627android.aaptOptions { //归档目录:rootProject/archived String dirName = "archived" File archivedDir = project.rootProject.file(dirName) if (!archivedDir.exists()) { archivedDir.mkdirs() } //保存本次编译产生的ids String time = new Date().format("yyyyMMdd_HHmmss", TimeZone.getTimeZone("GMT+08:00")) File outIdsFile = project.roo...
AAR依赖和module源码动态切换
痛点壳工程通过implementation 'com.alibaba:fastjson:1.2.76'的形式引入aar文件,而aar使用一个单独的业务工程开发,这种形式开发模式常见于组件化的工程中。这样做可以隔离代码,深度解耦,业务复用,节省编译时间。然而有时候我们需要在壳工程中进行aar联调,这时候我们就需要把aar工程的源码引入到壳工程中,在壳工程中做法如下: 在settings.gradle文件中添加如下配置 12include ":moduleName"project(":moduleName").projectDir = file("源码路径") 在app模块通过implementation project(":moduleName")方式引入 调试好后移除上面配置,发布版本。 这样做虽然能达到目的,但不够优雅,存在忘记恢复导致CI不能正确打包的可能性。下面我们进行优雅改造,文中所用的是AGP7.0+,AGP7.0改动挺大,7.0以下的自己修改即可。 步骤2可以使用...
GridLayoutManager均分网格
下面结论都是基于GridLayoutManager方向为竖直,spanCount为列数的情况,但在水平方向类似。 SpanSizeLookup public int getSpanIndex(int position, int spanCount)返回值:position对应item所在列的起始index public abstract int getSpanSize(int position)返回值:position对应item所跨越列的数量(所占spanCount的份额) public int getSpanGroupIndex(int adapterPosition, int spanCount)返回值:position对应item所属组的index, 如果是竖直方向就表示所在的行号 假设一个grid为5列,有一个item在第二行,宽度从第二列开始到最后一列。那么那么这个item宽度占了4列,所以getSpanSize等于4。在第二行,所以getSpanGroupIndex等于1。宽度从第二列开始,所以getSpanIndex等于1。 ItemDecoration在...
Android依赖冲突
前言实际开发过程中不可避免的会使用到一些第三方,而我们引用的第三方可能会和我们使用的其他库产生冲突;或者由于其他原因需要对依赖进行剔除。 依赖冲突的解决方法其实很简单,主要就为以下两个步骤: 依赖分析,找到冲突的依赖。 剔除依赖或者强制使用某个版本的依赖。 依赖分析查看依赖关系需要用到的命令为:gradlew :[module_name]:dependencies 如需分析工程中app这个module的依赖关系行命令则为 :gradlew :app:dependencies --configuration releaseRuntimeClasspath 从下面的关系树可以看到各个依赖之间的关系,以及依赖版本号合并后的最终版本号 12345678910+--- com.android.support:support-core-utils:28.0.0 (*)| | | +--- com.android.support:customview:28.0.0| | | | +--- com.android.support:support-a...
裸aar文件上传
前言虽然标题叫AAR合并,但本文并不是让你将两个AAR文件通过硬核操作方式合并成一个AAR文件,本文主要是通过maven平台来解决这个问题。 解决方案我们需要解决的问题并不是合并两个文件,而是给使用者提供统一的依赖入口,而合并只是解决这个问题一种方法。 如果将aar变成gradle依赖,那就没有这个烦恼了呢。emmm….,这个方案可行性很高啊! 上传maven仓库时,首先会将library打包aar成文件,以及会生成一个pom文件以及其他几个文件,然后将这些文件上传到maven平台上,最终我们可以通过gradle依赖的方式直接引用到这个aar。 现在需要做的就是在正常发布的流程中,用我们需要合并的AAR A文件替换掉library生成的AAR B文件。那么最终在gradle中使用这个依赖时,就相当于直接使用了A文件的代码。 aar变成了gradle依赖,你都解决不了问题,反省一下! 如果不能使用maven等公有平台,点这里https://www.jianshu.com/p/8f7e32015836,不过这个方法我没有验证过。 替换AAR在正常发布library到maven...
ThreadLocal
Don’t forget, a person’s greatest emotional need is to feel appreciated.莫忘记,人类情感上最大的需要是感恩。 在阅读Handler源码时发现了这么一个东西,本想直混在其他博客中一笔带过,但仔细想了下这个东西还是蛮重要的,于是开了这篇博客。 ThreadLocalthreadlocal使用方法很简单 123static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>();sThreadLocal.set()sThreadLocal.get() threadlocal而是一个线程内部的存储类,可以在线程内存储数据,数据存储以后,只有存储的线程可以取到被存储数据,其他线程获取则为缺省值 ,官方解释如下。 12345678/** * This class provides thread-local variables. These variables differ from * their normal counterpa...
apk签名
Never let success get to your head and never let failure get to your heart.不要让成功冲昏了头脑,也不要把失败记在心里。 赶时间看这里我将apksigner签名命令整理成脚本,简化平时的操作。mac平台下shell脚本 1234567#signer命令的路径signer=$"/Users/xxxx/Library/Android/sdk/build-tools/27.0.3/apksigner"ks=$1alias=$2inApk=$3outApk=${inApk%.*}$"_signed.apk"${signer} sign --ks ${ks} --min-sdk-version=21 --ks-key-alias ${alias} --out ${outApk} --in ${inApk} 复制代码保存成shell脚本使用signer.sh...