美文网首页Android7.0Android知识
Android7 对动态库访问的限制

Android7 对动态库访问的限制

作者: NiceDream | 来源:发表于2017-05-24 09:37 被阅读153次

    从 Android 7.0 开始,系统将阻止应用动态链接非公开 NDK 库,这种库可能会导致您的应用崩溃。此行为变更旨在为跨平台更新和不同设备提供统一的应用体验。即使您的代码可能不会链接私有库,但您的应用中的第三方静态库可能会这么做。因此,所有开发者都应进行相应检查,确保他们的应用不会在运行 Android 7.0 的设备上崩溃。如果您的应用使用原生代码,则只能使用公开 NDK API。

    动态库加载最终会调用这个函数,在这里会判断是否允许加载该动态库,最终就是logcat中显示的异常信息;

    bionic\linker\linker.cpp

    static bool load_library(android_namespace_t* ns,
                             LoadTask* task,
                             LoadTaskList* load_tasks,
                             int rtld_flags,
                             const std::string& realpath)
    ...
      if (!ns->is_accessible(realpath)) {
        // TODO(dimitry): workaround for http://b/26394120 - the grey-list
        const soinfo* needed_by = task->is_dt_needed() ? task->get_needed_by() : nullptr;
        if (is_greylisted(name, needed_by)) {
          // print warning only if needed by non-system library
          if (needed_by == nullptr || !is_system_library(needed_by->get_realpath())) {
            const soinfo* needed_or_dlopened_by = task->get_needed_by();
            const char* sopath = needed_or_dlopened_by == nullptr ? "(unknown)" :
                                                          needed_or_dlopened_by->get_realpath();
            DL_WARN("library \"%s\" (\"%s\") needed or dlopened by \"%s\" is not accessible for the namespace \"%s\""
                    " - the access is temporarily granted as a workaround for http://b/26394120, note that the access"
                    " will be removed in future releases of Android.",
                    name, realpath.c_str(), sopath, ns->get_name());
            add_dlwarning(sopath, "unauthorized access to",  name);
          }
        } else {
          // do not load libraries if they are not accessible for the specified namespace.
          const char* needed_or_dlopened_by = task->get_needed_by() == nullptr ?
                                              "(unknown)" :
                                              task->get_needed_by()->get_realpath();
    
          DL_ERR("library \"%s\" needed or dlopened by \"%s\" is not accessible for the namespace \"%s\"",
                 name, needed_or_dlopened_by, ns->get_name());
    
          PRINT("library \"%s\" (\"%s\") needed or dlopened by \"%s\" is not accessible for the"
                " namespace: [name=\"%s\", ld_library_paths=\"%s\", default_library_paths=\"%s\","
                " permitted_paths=\"%s\"]",
                name, realpath.c_str(),
                needed_or_dlopened_by,
                ns->get_name(),
                android::base::Join(ns->get_ld_library_paths(), ':').c_str(),
                android::base::Join(ns->get_default_library_paths(), ':').c_str(),
                android::base::Join(ns->get_permitted_paths(), ':').c_str());
          return false;
        }
      }
    ...
    }
    

    相关文章

      网友评论

        本文标题:Android7 对动态库访问的限制

        本文链接:https://www.haomeiwen.com/subject/vxpnxxtx.html