Framework基础:Android N 公共so库怎么定义呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Framework基础:Android N 公共so库怎么定义呢?相关的知识,希望对你有一定的参考价值。
参考技术A 具体报错的信息如下:大概的意思就是应用nativeloader打不开libhaha_utils.so这个so库了,就崩溃了!!好残忍。libhaha_utils.so这个库是用我用android.mk编译后放在system/lib64下面的。但现在打不开了。
为啥呢?
因为/system/lib64/不在APK查找so库的合法路径啊,合法路径有啥呢?
上面log就有说明啦。下面三个路径都没有找到libhaha_utils.so库,所以就挂了。
ld_library_paths="",
default_library_paths="/system/fake-libs64:/data/app/com.example.haha-1/base.apk!/lib/arm64-v8a", permitted_paths="/data:/mnt/expand:/data/data/com.example.haha
这个apk可是系统权限的哟,就是apk的清单AndroidManifest中有下面一句
android:sharedUserId="android.uid.system"
正常来说,这种高端apk的permitted_paths是包含system/lib64的,从源码可以知道
/ frameworks / base / core / java / android / app / LoadedApk.java
看上面的注释就知道啦,如果是系统apk并且没有升级过的话,so库的搜索路径就会增加一个system/lib64。我去,google搞啥呢,为什么还要限定不能升级。
因为install -r来安装apk就相当于升级,所以刷机时apk可以用,install升级后不能用。
我纯粹是为了调试方便,所以参考google的链接
https://source.android.com/devices/tech/config/namespaces_libraries
在这个源码里面用到这个txt文件
/ system / core / libnativeloader / native_loader.cpp
在LibraryNamespaces类的Initialize()会读取这个文件,将so库设置为公共so库,所谓公共so库,就是这个so库谁都能用啦。
这个方法时什么时候调用的呢?大概过下流程罗。
首先在创建一个虚拟机的时候,初始化NativeLoader,这个NativeLoader,顾名思义,就是用来装载so库的。
/ art / runtime / java_vm_ext.cc
然后进入native_loader,进行初始化
/ system / core / libnativeloader / native_loader.cpp
初始化是调用LibraryNamespaces类的Initialize完成公共so库的赋值,哈哈哈,搞定!!
总结:
1.Android N 不能直接调用系统的一些私有库了,公用的库都定义在public.libraries.txt里面。
2.系统应用刚刷机是能够调用system/lib64下的库,但通过install升级该应用时,应用打开会挂。因为升级后permitted_paths就不再包含system/lib64了。所以我们可以将apk要用到的库名称写到public.libraries.txt中去解决快速调试问题。
以上是关于Framework基础:Android N 公共so库怎么定义呢?的主要内容,如果未能解决你的问题,请参考以下文章