我想知道函数getPackageInfo
的实现(因为我想知道它们所指的包存储在哪里),所以我去了this看源代码,但只是在那里找到了一个抽象的方法。
public abstract PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException;
该方法的实施在哪里?
答案 0 :(得分:2)
getPackageInfo方法的实现在com.android.server.pm.PackageManagerService
@Override
public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
// reader
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if (DEBUG_PACKAGE_INFO)
Log.v(TAG, "getPackageInfo " + packageName + ": " + p);
if (p != null) {
return generatePackageInfo(p, flags);
}
if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {
return generatePackageInfoFromSettingsLPw(packageName, flags, userId);
}
}
return null;
}
你可以查看here
答案 1 :(得分:-1)
如果您只查看PackageManager
的文档,您会看到它有一个名为MockPackageManager
的直接子类。这是一个具体的类,因此它必须包含方法getPackageInfo
的实现。但如果你仔细观察,它会说类中的所有方法都抛出UnsupportedOperationException
!
在文档中,它告诉您自己实现这些行为,不是吗?那就做吧!这是抽象方法的重点,允许人们进行自定义实现!
但为什么你的代码有效?
我想最可能的解释是代码中的getPackageManager
方法返回一个扩展PackageManager
或MockPackageManager
的匿名类,并在那里提供实现。您可以通过控制+在Windows上的Android Studio中单击方法名称来查看getPackageManager
的来源。在OS X上应该是命令+单击。