1.开机启动扫描某一路径下的app
在frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java,有如下代码。
// Collected privileged system packages.
final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
scanDirLI(privilegedAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);
// Collect ordinary system packages.
final File systemAppDir = new File(Environment.getRootDirectory(), "app");
scanDirLI(systemAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
// Collect all vendor packages.
File vendorAppDir = new File("/vendor/app");
try {
vendorAppDir = vendorAppDir.getCanonicalFile();
} catch (IOException e) {
// failed to look up canonical path, continue with original one
}
scanDirLI(vendorAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
如果我们要扫描另外的路径,只需在源码中添加自己的路径即可,如
File MyAppDir = new File("/mysystem/app");
scanDirLI(MyAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
File MyPrivAppDir = new File("/mysystem/priv_app");
scanDirLI(MyPrivAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR,
| PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);
在locationIsprivileged方法中,还需添加一下如下代码
static boolean locationIsPrivileged(File path) {
try {
final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
.getCanonicalPath();
final String my_privilegedAppDir = new File("/mysystem/priv-app")
.getCanonicalPath();
return path.getCanonicalPath().startsWith(privilegedAppDir)||path.getCanonicalPath().startsWith(my_privilegedAppDir);
} catch (IOException e) {
Slog.e(TAG, "Unable to access code path " + path);
}
return false;
}
参考
http://www.woaitqs.cc/android/2016/07/28/android-plugin-get-apk-info.html
2.扫描自定义的库路径
打开bionic/linker/linker.cpp文件,看到如下代码,LP64就是64位的机器,看你用的机器是32位的还是64位的,添加自己的路径即可。
static const char* const kDefaultLdPaths[] = {
#if defined(__LP64__)
"/vendor/lib64",
"/system/lib64",
#else
"/vendor/lib",
"/system/lib",
#endif
nullptr
};
3.扫描自定义的硬件抽象库路径
打开hardware/libhardware/hardware.c,有你如下代码,添加自己的路径即可。
#if defined(__LP64__)
#define HAL_LIBRARY_PATH1 "/system/lib64/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib64/hw"
#else
#define HAL_LIBRARY_PATH1 "/system/lib/hw"
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"
#endif
并在下列函数中添加相应的路径。
static int hw_module_exists(char *path, size_t path_len, const char *name,
const char *subname)
{
snprintf(path, path_len, "%s/%s.%s.so",
HAL_LIBRARY_PATH2, name, subname);
if (access(path, R_OK) == 0)
return 0;
snprintf(path, path_len, "%s/%s.%s.so",
HAL_LIBRARY_PATH1, name, subname);
if (access(path, R_OK) == 0)
return 0;
return -ENOENT;
}
4.扫描自定义的固件路径
可见http://blog.csdn.net/mike8825/article/details/51171055?locationNum=2