由于一直做的是系统rom开发,对于jar包,aar包,aidl,aidl打成aar包这些东西之前一直没有比较明晰的实践,以及哪些场合下需要这些方法,这些方法有哪些优劣以及局限性。
抽时间每种方式都在Android Studio上详尽的实践了一遍,有以下收获。为了方便大家理解,最好根据我这边上传的源码就自己实践一遍。demos都是基于Android Studio 3.2版本做的。
demos下载地址:https://download.csdn.net/download/mis_wenwen/10723995
1.Jar的玩法
Jar包使用的范围:java的api实现的各种功能(如果涉及到android 的一些api,比如context类啊,toast类啊,这些就需要用到aar)
两个project
JarGenerate以及UseJar
1.新建项目JarGenerate
2.新建Module---jarLib,选择类型Java Library
3.jarLib里面有新建的Tools.java类,写一个Sum的方法。
4.生成jar包,这里要注意下,rebuild project是不会生成jar包。点界面邮编的Gradle,点开jarLib,Tasks-build-build.然后生成jar包在jarLib----build----libs----jarLib.jar
5.新建项目UseJar
6.导入并引用jar包,有几种方法
<1>把JarGenerate生成的jar包拷贝到UserJar---app---libs目录下,注意这里只是把jar包拷贝过来了,还没有引用到。
File---Project Structure---Dependencies点+号,选择Jar Dependency,选择刚那个jar包就行了。
<2>把JarGenerate生成的jar包拷贝到UserJar---app---libs目录下,注意这里只是把jar包拷贝过来了,还没有引用到。
build.gradle的dependencies {}里面直接加上implementation files('libs/jarLib.jar') ,如果gradle的版本比较低的话implementation要改成compile。
<3>新建一个Module,选择Import .Jar/.AAR Package,选好路径导入jar包,然后再去File---Project Structure---Dependencies点+号,选择Moduel Dependency。
导入并引用jar包的话推荐第一种方式。
8.调用下Tools类的api验证下就ok了。这时IDE可以识别出了。
jar包的玩法,google也有个老外写的比较详细,图片版的:
http://dominoc925.blogspot.com/2015/09/how-to-create-and-use-jar-archive-using.html
2.Aar的玩法
Aar包使用的范围:aar的范围比jar范围广,如果涉及到android 的一些api,比如context类啊,toast类啊,这些就需要用到aar
两个project
AarGenerate以及UseAar
1.新建项目AarGenerate
2.新建Module---AarLib,选择类型Android Library
3. AarLib里面自己右键新建一个ToastTool.java类,写一个showToast的方法。
4.生成aar包,这里要注意下,rebuild project是不会生成aar包。点界面邮编的Gradle,点开AarLib,Tasks-build-build.然后生成Aar包在AarLib----build----outputs---aar----AarLib-release.aar
5.新建项目UseAar
6.导入并引用aar包,有几种方法,这里和导入以及引用jar包有点类似,
但是jar包的第一种方式用不了,因为+号那没有Aar Dependency选项。
<1>把AarGenerate生成的aar包拷贝到UserAar---app---libs目录下,注意这里只是把aar包拷贝过来了,还没有引用到。
build.gradle的修改如下,如果gradle的版本比较低的话implementation要改成compile。
dependencies {
implementation(name:'mylibrary-release',ext:'aar')
….
}
repositories {
flatDir {
dirs 'libs'
}
}
<2>新建一个Module,选择Import .Jar/.AAR Package,选好路径导入aar包,然后再去File---Project Structure---Dependencies点+号,选择Moduel Dependency。
导入并引用aar包的方式推荐第二种。
提到aidl,就说明有跨进程的引用的场景。对于我们做rom的来说,比如客户第三方apk,我们做个系统apk,有足够的权限去搞事情。那么客户通过我们的apk去做一些事情,就需要跨进程了。
当然,全部用广播来是可行的。如果功能比较多,考虑到接口统一点,用aidl。当然,用广播其实相比于aidl是有局限性的,如果第三方apk想要做一件只有系统apk才能做的事情,ok,你可以用第三方apk发广播给我们的apk,但是如果第三方apk同时需要做完这件事再返回一点数据,那广播就比较绕了,你还得在我们的apk里面发个广播出来给第三方apk。而aidl的话可以直接返回数据。
客户想通过aidl来调用我们的apk的相关api有两种玩法,一个是给他们我们的aidl文件,一个是我们把aidl打成jar包,给到他们。一般是第二种做法。两种都来实践一下。
3.aidl的玩法
两个project
AidlServer以及AidlClient
1.新建项目AidlServer
2.File---New---AIDL---AIDL File,aidl文件修改好后,build下project。然后发现在app---build---generated---source---aidl---debug---com.potter.aidlserver下生成了IMyAidlInterface.java
3.创建一个MyService,继承于Service,并且把这个servcie注册在AndroidManifest.xml
4.新建项目AidlClient
5.把AidlServer的app---src---main---aidl这个目录拷贝到AidlClient的app---src---main
6.AidlClient这个project build一下,然后在app---build---generated---source---aidl---debug---com.potter.aidlserver下生成了IMyAidlInterface.java
7.在AidlClient的代码里面bindService配合ServiceConnection拿到ImyAidlInterface的实例去调用api就ok了。
4.aidl打包到aar的玩法(推荐)
两个project
AidlAarServer以及AidlAarClient
1.新建项目AidlAarServer
2.File---New---AIDL---AIDL File,aidl文件修改好后,build下project。然后发现在app---build---generated---source---aidl---debug---com.potter.aidlaarserver下生成了IMyAidlInterface.java
3.创建一个MyService,继承于Service,并且把这个servcie注册在AndroidManifest.xml
4.新建Module---AidlAar,选择类型Android Library,这里要注意一点,我开始以为要把包名填写的和AidlJarServer的包名要一致,其实不一致也行。
5.把AidlJarServer的app---src---main---aidl这个目录拷贝到AidlAar的src---main下,build一下,然后发现在AidlAar---build---generated---source---aidl---debug---com.potter.aidlserver下生成了IMyAidlInterface.java。同时生成Aar包在AarLib----build----outputs---aar----aidlaar-release.aar
6.新建项目AidlAarClient
7. 新建一个Module,选择Import .Jar/.AAR Package,选好路径导入aar包(aidlaar-release.aar
),然后再去File---Project Structure---Dependencies点+号,选择Moduel Dependency。
8. 在AidlAarClient的代码里面bindService配合ServiceConnection拿到ImyAidlInterface的实例去调用api就ok了。
5.aidl打包到aar的玩法并封装Manager类(推荐)
提供了demo仅供参考,因为单纯aidl打成aar,第三方apk导入后还要自己去bindService之类的操作,我们可以封装起来,客户那边直接通过Manager类去调用我们提供的api就可以了。(这种感觉就有点像如android 系统里面的AudioManager,PackageManager的用法,例如AudioManager各种暴露的方法也都是通过aidl去调用的AudioManagerService的对应方法)