前言
在将各种依赖导入之前,先介绍下 Project Structure 这个窗口,可以帮我们快速修改依赖。
可以在顶部小控件打开,也可以按 Ctrl + Alt + Shift + S 快捷键打开。
Gradle 抓取
这个也就一般方法了,在 app(module)的 gradle 文件中以 implementation 导入:
dependencies {
...
implementation 'com.github.bumptech.glide:glide:4.8.0'
}
这里说明一下导入的几种方式,前三个较常用。
implementation
只在内部使用模块,对再上层的模块不提供访问,相当于自我封装,能够提高编译速度。比如 A implementation B,B implementation C,那么 A 就不能访问 C 的内容。
api
可以将内容向外传递,比如 A implementation B,B api C,那么 A 也可以访问 C 的内容。
compileOnly
只在编译时有效,不会参与打包,比如可以确定其他模块引入了 C,自己则模块就可以用 compileOnly 导入 C。不导入C 在自己模块使用 C 的类会报错,因为引用不到,但是打包的时候,所有 jar 包、aar 包都会放在一起,使用 compileOnly 让编译的时候用自己模块的先用着,打包的时候用别人的。
runtimeOnly
只在生成apk的时候参与打包,编译时不会参与,很少用。
testImplementation
只在单元测试代码的编译以及最终打包测试apk时有效。
debugImplementation
只在debug模式的编译和最终的debug apk打包时有效。
releaseImplementation
仅仅针对Release 模式的编译和最终的Release apk打包。
导入 Jar 包
将 jar 包放入 Project -> app 文件夹下的 libs 文件夹(如果没有手动建一个),可以将 AS 切换到 Project 目录形式,找到对应 jar 包右键使用 “Add as library…”导入。
实际上将 jar 包放入 libs 文件夹就可以了,因为我们 app 的 gradle 文件里面有下面这句话:
dependencies {
//已经将libs目录下的所有jar导入了
api fileTree(include: ['*.jar'], dir: 'libs')
...
}
我们直接重新同步一下项目就可以。
导入 AAR 包
通过 gradle 导入
-
把 aar 复制到工程应用 app 下的 libs 目录中
-
在 app 的 build.gradle 中添加一个本地仓库,并把 libs 作为仓库地址:
// aar包添加1/2 repositories { flatDir{ dirs 'libs' } }
-
修改 dependencies,导入 aar。
dependencies { ... implementation(name:'xxx-release', ext:'aar') }
-
Sync Now 同步一下,稍等一会就好了。
界面导入
-
File - New - New Module - Import .JAR/.AAR Package(jar包也可以这样导入)
-
选择 aar 包所在的路径,点完成,校验成功就可以了。
-
Sync Now 同步一下工程与Gradle,不行就顶部 Build - Rebuild project。
AAR / JAR 包导出
都讲到导入了,也说一下导出吧,方法也很简单
- 新建库,File——New——New Module——Android Library
- 编译或生成工程,Build——Make Module
- 获取 jar/aar 包,jar 包在 build\intermediates\bundles\release 目录下的 classes.jar,而 aar 包在 build\outputs\aar\xxx-release.aar。
导入 Mudule
对于 module 的导入其实和导入 aar 包一样,使用图形化很方便,也可以参考下面方法
-
打开根目录的 settings.gradle 文件,在里面添加要导入的 module 以及路径,这里只是让模块加入你的工程项目。
include ':common' project(':common').projectDir = new File('../Libproject/common/')
如果是在当前项目目录下的 module,后面路径可以省略。
-
在 app 的 gradle 文件的 dependences 中加上引入模块代码,这样才能正确使用到库里面的类,可以参考前面的 gradle 导入。
api project(':common') implementation project(':common')
导入 so 文件
这里有两种办法,一个是放在 app/src/main/jniLibs 下,第二个是 libs 目录下,还是推荐第一个,libs 目录还是尽量放 jar / aar 包吧。
自建 jniLibs 目录
这里其实可以用 AS 图形话生成的,直接在对于 module 里右键 new - Folder - JNI Folder 就可以,然后把 so 库连带目录复制进去(目录后面会讲)。
也可以自行建立 app/src/main/jniLibs 目录,效果是一样的。
放在 libs 目录
这里将 so 库连带目录复制 app 目录下的 libs 里,然后在 app 的 gradle 文件中导入就行:
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
写好代码同步一下就行了。(ps. 貌似这样的方法会出莫名其妙错误)
关于 so 文件的说明
so 库一般是 NDK编译出来的动态链接库。这里很多 sdk 会给到很多目录的 so 文件,其实这里是针对不同芯片的版本,和芯片关系如下:
- armeabi-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
- arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。(ps. 现在很多了吧!)
- armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
- x86: 平板、模拟器用得比较多。
- x86_64: 64位的平板。
ABI 适配流程
对于一个cpu是arm64-v8a架构的手机,它运行app时,进入jnilibs去读取库文件时,先看有没有arm64-v8a文件夹,如果没有该文件夹,去找armeabi-v7a文件夹,如果没有,再去找armeabi文件夹,如果连这个文件夹也没有,就抛出异常;
如果有arm64-v8a文件夹,那么就去找特定名称的.so文件,注意:如果没有找到想要的.so文件,不会再往下(armeabi-v7a文件夹)找了,而是直接抛出异常。
解决办法就是在 app 的 gradle 中指定目录(如果引入的 module 内有 so 文件,需要在最终的 app 模块中配置),只在给定的目录中查找,这样就不会出问题。
android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a'
}
}
}
结语
上面这些大部分来自网络,小部分来自日常经验,本意是整理好自己也好查看的,如果对读者有帮助的话,希望能够一键三连,点赞、评论、收藏,这都是博主持续创作下去的动力!
end