安卓导入依赖小结(remote lib、jar、aar、module、so)

前言

在将各种依赖导入之前,先介绍下 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 导入
  1. 把 aar 复制到工程应用 app 下的 libs 目录中

  2. 在 app 的 build.gradle 中添加一个本地仓库,并把 libs 作为仓库地址:

    // aar包添加1/2
    repositories {
        flatDir{
            dirs 'libs'
        }
    }
    
  3. 修改 dependencies,导入 aar。

    dependencies {
    	...
        implementation(name:'xxx-release', ext:'aar')
    }
    
  4. Sync Now 同步一下,稍等一会就好了。

界面导入
  1. File - New - New Module - Import .JAR/.AAR Package(jar包也可以这样导入)

    在这里插入图片描述

  2. 选择 aar 包所在的路径,点完成,校验成功就可以了。

    在这里插入图片描述

  3. Sync Now 同步一下工程与Gradle,不行就顶部 Build - Rebuild project。

AAR / JAR 包导出

都讲到导入了,也说一下导出吧,方法也很简单

  1. 新建库,File——New——New Module——Android Library
  2. 编译或生成工程,Build——Make Module
  3. 获取 jar/aar 包,jar 包在 build\intermediates\bundles\release 目录下的 classes.jar,而 aar 包在 build\outputs\aar\xxx-release.aar。

导入 Mudule

对于 module 的导入其实和导入 aar 包一样,使用图形化很方便,也可以参考下面方法

  1. 打开根目录的 settings.gradle 文件,在里面添加要导入的 module 以及路径,这里只是让模块加入你的工程项目。

    include ':common'
    project(':common').projectDir = new File('../Libproject/common/')
    

    如果是在当前项目目录下的 module,后面路径可以省略。

  2. 在 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 文件,其实这里是针对不同芯片的版本,和芯片关系如下:

  1. armeabi-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
  2. arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。(ps. 现在很多了吧!)
  3. armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
  4. x86: 平板、模拟器用得比较多。
  5. 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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值