通常我们在Android上检测一个文件是不是APK时会使用下面这种方式:
PackageManager pm = mContext.getPackageManager();
PackageInfo packageInfo = pm.getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES);
if (packageInfo != null) {
// 是 APK 文件
} else {
// 不是 APK 文件
}
但是近日发现,在 Android 5.1 上当 filePath 指向的是 so 文件时,执行完上面那段代码后进程不会释放该so的文件句柄,出现内存泄漏。下面是 filePath 分别为 apk文件和so文件时,执行上面代码后进程持有的文件句柄,可以看到 so 句柄没有释放:
以下是 getPackageArchiveInfo 接口的调用栈(基于Android 5.1):
frameworks/base/core/java/android/content/pm/PackageParser.java parseBaseApk
frameworks/base/core/java/android/content/pm/PackageParser.java loadApkIntoAssetManager
frameworks