添加额外的路径到Android系统中

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值