https://www.cnblogs.com/lsgxeva/p/13382844.html
文章目录
-
- gradle编译周期
- gradle文件
- gradle wrapper
- buildconfig
- repositories
- Dependencies
- 区别构建
- 自定义task
- groovy
- impletation里的依赖是怎样引入的
- 建立自己的android库
- volley使用概览
- implementation和api的区别
- com.android和com.mcxiaoke
- 确定应用是否支持64位库
- 编译报错多个第三方库没有64位架构包
- apk包里的dex文件
- node_modules 目录结构
- 第三方库是否支持64位架构的问题
- 怎么判断第三方库/sdk是否支持64位架构
- build的时候把一些包变成dex文件
- 引入第三方库的三个方式
- 引入第三方库
- 远程依赖原理
- as下载的远程依赖包
- pom,aar,jar
- settings.gradle
- build.gradle
- Android studio插件,检查依赖的so是否支持64位(或者其他的abi)
- 64位打包的apk里的so文件特别少
- .so文件
- Native Libs Monitor在as里的使用
- apk打包原理
- 直接/间接
- 联系github作者
- gradle升级instant run
- 强制让所有模块都用相同的支持库版本
- gradle常用操作
- 打包64位
- apk打包原理
- 检查第三方lib合规性
- 混淆打包
是android 的主流编译工具
以前gradle因为编译过程的原因有点慢
与android studio关系紧密
对简单程序基本不需要配置代码,值使用android studio就可以完成编译和运行
对于复杂的多人合作项目会使用一些个性化配置提高开发效率
比如自定义一下编译包名字,对同一产品编译出免费版和付费版apk等
android studio 2.0发布之后,gradle升级为instant run,编译速度逆天
gradle编译周期
gradle里的项目和task,每个项目至少一个project,一个build.gradle就代表一个poject,每个project包含多少个task,task里包含很多action,action代码块里包含一些需要被执行的代码
编译过程关爱到了根据build相关文件聚合所有的project和task,执行task里的action,因为build.gradle里的task很多,所以用依赖逻辑保证执行顺序,几乎所有的task都需要依赖其他的task执行,没有依赖的task首先执行
编译分为三个阶段
初始化阶段:创建project对象,有多个gradle就创建多个project
配置阶段:这个阶段执行所有的编译脚本,同时创建项目的所有task,为执行阶段做准备
执行阶段:在这个阶段gradle根据传入的参数决定如何执行这些task,action的执行代码都在这里
gradle文件
实际上是一个app下面对应一个build.gradle,settings.gradle,然后下面是子app,子app有自己的build.gradle
setting.gradle定义哪些模块加入编译过程,单个模块的app是一般不需要这个文件,此文件在初始化的时候被执行
顶层的build.gradle里的配置用到所有的项目,典型配置里在buildscript里定义android编译工具的类路径仓库里的JCenter是一个maven库
allprojects里定义的属性会被应用到所有module里
apply插件里用了安卓的gradle插件,插件里提供编译打包等task
buildType里定义了编译类型,对调试和发布可以有不同配置
gradle wrapper
为了兼容旧版本产生
包括一些脚本文件和针对不同系统的运行文件,会自动下载对呀版本的运行文件
https://www.cnblogs.com/lsgxeva/p/13382844.html
可以使用gradlew列出所有的task和task的依赖
wrapper是我们使用命令行编译的开始
在as点击build,rebuild,clean的时候都触发了对应的gradle task
四个基本task
assemble可以把所有的buildtype(调试,发布)生成apk包
clean可以移除所有的编译输出文件,比如apk
check可以执行lint监测编译
build同时执行assemble和check命令
buildconfig
可以通过buildconfig.debug判断当前版本是否是debug版本,gradle编写语言是groovy,一种jvm语言,groovy可以生成java字节码类
repositories
可以加入项目链接
如果仓库有密码可以传入用户名和密码
还可以用相对路径配置一下本地仓库,通过配置项目里存在的静态文件夹作为本地仓库
Dependencies
库名称由组名,库名称和版本号组成
为了保证依赖库是最新状态可以使用通配符+,但是会导致每次都要用网络请求查看是否有最新版本导致编译过慢
也可以使用file()添加文件依赖,如果有多个jar包依赖可以放到文件夹里使用filetree引用
配置本地的so库可以
不方便直接引用项目需要使用文件形式引入就把项目打包成aar文件
这样我们在项目下新建aars文件夹之后配置一下仓库,引用的时候
区别构建
在debug和release的时候可能需要配置不同的服务器地址,打包市场渠道包的时候可能要打免费版收费版或内部版外部版程序
这是有buildtype区分
可以创建新的编译类型
gradle默认创建一个新的资源集,可以建立不同的文件夹,里面放上需要的不同资源和代码
针对同一份源码编译不同的程序编译收费和免费版可以使用product flavors
想build type一样也是可以有不同文件夹和配置
复杂情况可能需要多个product的未读进行组合,比如想要颜色和价格两个维度组合,先创建维度,之后是维度细分
buildtype里的优先级最大
可以开启并行编译加快编译
可以开启守护进程,二次编译的时候重用进程
可以使用shrinkresources渠道编译的时候不需要的资源
用shrinkReleaseResources命令可以看懂减少了哪些资源
一些需要动态加载的资源需要向Progard的一样对资源进行keep操作
可以再res/raw/下建立一个keep.xml文件keep资源
对一些特殊文件或文件夹,如国际化的资源文件,屏幕适配资源,如果已经确定了某种型号不需要重新适配可以去掉不适配的资源
自定义task
groovy
在groovy里没有固定类型,变量直接使用def引用
使用单引号只是字符串,双引号里面还可以放变量$变量名
方法也使用def声明,不指定返回值就返回最后一行代码的值
默认所有类和方法都是公共的,所有类的字段是private
通过new得到实例来引用
类里生命的字段都会默认生成对应的settinggetter方法,groovy方法调用时可以没有括号的,也不需要分号结尾,也可以直接调用
可以通过instance.greeting方式拿到字段值,也是通过get方法的
在map,collections
定义一个列表遍历列表使用each
定义一个map,获取map使用get或[]
闭包,匿名内部类,支持类似lamda形式的语法调用
task执行的时候action依次执行
可以在里面写dolast和dofirst方法
关于Task 的依赖有两种,must RunAfter和dependsOn
must必须按顺序加入之后顺序之后,后者是同时执行的
impletation里的依赖是怎样引入的
建立自己的android库
新建的时候选择新建模块–android library–之后在minimum sdk里是api16
之后吧代码传到library里上传github
然后发布代码就可以发布了
volley使用概览
https://developer.android.com/training/volley?hl=zh-cn
是一个可以让应用更轻松更快联网的http库
可以自动网络请求调度,可以有多个并发网络链接
有透明磁盘和具有标准http缓存一致性的内存响应缓存