??? 一、Android插件化开发之(一)实现 ????二、Android插件化开发之(二)打包 ????三、Android插件化开发之(三)第三方库动态加载 ?
注:转载请标明出处。
????在项目开发中,很多时候我们都需要兼容各款设备或者对接各种SDK,这时每当打包都得打各个厂家的包,有些SDK比较大的还会导致打出来的apk文件过大,方法数量过多而超65k问题,如果将第三方的SDK和库对接做成插件,这会是一种很友好的解决方式,通过服务器下发插件,然后再加载,可以解决很多硬件兼容,厂家SDK兼容的问题,不单省了很多各种打包的问题,也可以解决apk过大,方法超65k的问题等,接上面的内容,这里就简单的说一下第三方库插件化的实现方式。
一、根据Android插件化开发之(二)打包中的方法得到dex文件,这里我们需要将dex和so库文件放到一个我们宿主App有权限访问到的路径下,一般来说这个路径影响不大,只要能访问到就行,但比较靠谱的说,建议放到外存储中的/Android/data/xx.xx.xx(包名)/files/路径下。
二、根据 Android插件化开发之(一)实现 中的方式得到ClassLoader类的实例,但这里面还需要做的一步是,将so库拷贝到系统目录下App有权限访问的地方,如:/data/data/packageName/files/; 具体的看代码:
fun loadDex(context: Context, path:String){
this.context = context
if (TextUtils.isEmpty(path)){
return
}
var dir = File("${path}lib/")
try {
var fileList = dir.listFiles()
fileList.forEach {
if (it.name.endsWith(".so")){
FileUtils.copy(it.absolutePath,"/data/data/${context.packageName}/files/")
}
}
var dexPath = "${path}classes2.dex"
var dex = context.getDir("dex", Context.MODE_PRIVATE)
loader = DexClassLoader(dexPath, dex.absoluteFile.absolutePath, "/data/data/${context.packageName}/files/", context.classLoader)
}catch (e:Exception){
e.printStackTrace()
}
}
注意:重点说三遍,请看这里!请看这里!请看这里!DexClassLoader类的构造第三个参数一定要填上so库拷贝到的那个目录地址,不然访问不到,会报各种找不到so库的错误。
三、插件做一个公共的封装,实现一个共同的对外接口,这个接口也是宿主操作各款硬件、各个厂家SDK功能的接口,在Android插件化开发之(一)实现中有说到怎么获得这个接口的实例,有了接口的实例,你就可以开心的做自己想做的事情了。
到这Android的插件化开发就简单的介绍完了,有实例的完全可以自己去实现一个属于自己的插件化开发框架了!!!
|