diff --git a/services/BUILD.gn b/services/BUILD.gn index 2519186f18a5c035ae48300dfbabf858284024f4..0acbcc1a909d943f48a553460c545da84cc1a32e 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -24,11 +24,21 @@ ohos_shared_library("driver_extension_manager") { "${ext_mgr_path}/services/native/driver_extension_manager/include", "${ext_mgr_path}/interfaces/innerkits/", "${ext_mgr_path}/services/zidl/include/", + "${ext_mgr_path}/services/native/driver_extension_manager/include/drivers_pkg_manager", + "${ext_mgr_path}/services/native/driver_extension_manager/include/device_manager", ] configs = [ "${utils_path}:utils_config" ] + deps = [ + ":drivers_pkg_manager", + "${ext_mgr_path}/services/native/driver_extension_manager/src/bus_extension:bus_extension", + "${ext_mgr_path}/services/native/driver_extension_manager/src/device_manager:bus_extension_core", + ] external_deps = [ "ability_runtime:ability_manager", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", "c_utils:utils", + "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", "safwk:system_ability_fwk", "samgr:samgr_proxy", diff --git a/services/native/driver_extension_manager/include/device_manager/etx_device_mgr.h b/services/native/driver_extension_manager/include/device_manager/etx_device_mgr.h index f7cc5c87d7717089fd368e2165f74126ab0f89b9..c40fad5a6586134cde18d3808215d97654a16dbf 100644 --- a/services/native/driver_extension_manager/include/device_manager/etx_device_mgr.h +++ b/services/native/driver_extension_manager/include/device_manager/etx_device_mgr.h @@ -38,13 +38,15 @@ private: }; class ExtDeviceManager final { - DECLARE_SINGLE_INSTANCE(ExtDeviceManager); + DECLARE_SINGLE_INSTANCE_BASE(ExtDeviceManager); public: + ~ExtDeviceManager() = default; int32_t Init(); int32_t RegisterDevice(std::shared_ptr devInfo); void UnRegisterDevice(const std::shared_ptr devInfo); private: + ExtDeviceManager() = default; std::unordered_map>> deviceMap_; std::mutex deviceMapMutex_; }; diff --git a/services/native/driver_extension_manager/include/drivers_pkg_manager/driver_pkg_manager.h b/services/native/driver_extension_manager/include/drivers_pkg_manager/driver_pkg_manager.h index 6af3075f356282adf47c5ebc56523659053045ca..1267d30526cfcc8dbec616b21be6b3b3271f0cca 100644 --- a/services/native/driver_extension_manager/include/drivers_pkg_manager/driver_pkg_manager.h +++ b/services/native/driver_extension_manager/include/drivers_pkg_manager/driver_pkg_manager.h @@ -16,13 +16,13 @@ #ifndef DRIVER_PKG_MANAGER_H #define DRIVER_PKG_MANAGER_H -#include #include +#include #include "bundle_monitor.h" - -#include "ibus_extension.h" #include "drv_bundle_state_callback.h" +#include "ibus_extension.h" +#include "single_instance.h" namespace OHOS { namespace ExternalDeviceManager { using namespace std; @@ -41,12 +41,10 @@ struct BundleInfoNames { }; class DriverPkgManager { -public: - DriverPkgManager(); - ~DriverPkgManager(); + DECLARE_SINGLE_INSTANCE_BASE(DriverPkgManager); +public: void PrintTest(); - /** * @brief Called at first before Monitor DriverExtension Package. * @param bundleName Indicates the bundle name of the application. @@ -54,11 +52,10 @@ public: * @return Returns true if the function is successfully called; returns false otherwise. */ int32_t Init(); - shared_ptr QueryMatchDriver(shared_ptr devInfo); - int32_t RegisterOnBundleUpdate(PCALLBACKFUN pFun); int32_t UnRegisterOnBundleUpdate(); + ~DriverPkgManager(); private: shared_ptr bundleMonitor_ = nullptr; sptr bundleStateCallback_ = nullptr; @@ -66,7 +63,8 @@ private: int32_t RegisterCallback(const sptr &callback); int32_t UnRegisterCallback(); + DriverPkgManager(); }; -} // namespace -} +} // namespace ExternalDeviceManager +} // namespace OHOS #endif // DRIVER_PKG_MANAGER_H \ No newline at end of file diff --git a/services/native/driver_extension_manager/src/device_manager/etx_device_mgr.cpp b/services/native/driver_extension_manager/src/device_manager/etx_device_mgr.cpp index 72da2bc19fa146537b49179c2ebbd4d8649d6ded..4cb137ed61cc0e54c6010100fb03effe795f226a 100644 --- a/services/native/driver_extension_manager/src/device_manager/etx_device_mgr.cpp +++ b/services/native/driver_extension_manager/src/device_manager/etx_device_mgr.cpp @@ -13,19 +13,54 @@ * limitations under the License. */ -#include "etx_device_mgr.h" +#include +#include + #include "cinttypes" #include "edm_errors.h" #include "hilog_wrapper.h" #include "ibus_extension.h" +#include "etx_device_mgr.h" + +#ifdef __aarch64__ +static constexpr const char *BUS_EXTENSION_SO_PATH = "/system/lib64"; +#else +static constexpr const char *BUS_EXTENSION_SO_PATH = "/system/lib"; +#endif +static constexpr const char *HDI_SO_SUFFIX = ".z.so"; +static constexpr const char *HDI_SO_PREFIX = "lib"; +static constexpr const char *USB_BUS_EXTENSION = "bus_extension"; namespace OHOS { namespace ExternalDeviceManager { IMPLEMENT_SINGLE_INSTANCE(BusExtensionCore); IMPLEMENT_SINGLE_INSTANCE(ExtDeviceManager); +static void LoadLib() +{ + for (BusType i = BUS_TYPE_USB; i < BUS_TYPE_MAX; i = (BusType)(i + 1)) { + std::ostringstream libPath; + libPath << BUS_EXTENSION_SO_PATH << "/" << HDI_SO_PREFIX; + switch (i) { + case BUS_TYPE_USB: + libPath << USB_BUS_EXTENSION; + break; + default: + EDM_LOGE(MODULE_DEV_MGR, "invalid bus type"); + continue; + } + libPath << HDI_SO_SUFFIX; + void *handler = dlopen(libPath.str().c_str(), RTLD_LAZY); + if (handler == nullptr) { + EDM_LOGE(MODULE_DEV_MGR, "failed to dlopen %{public}s, %{public}s", libPath.str().c_str(), dlerror()); + continue; + } + } +} + int32_t BusExtensionCore::Init() { + LoadLib(); int ret = EDM_OK; for (auto &iter : busExtensions_) { std::shared_ptr callback = diff --git a/services/native/driver_extension_manager/src/driver_etx_mgr.cpp b/services/native/driver_extension_manager/src/driver_etx_mgr.cpp index ac409b70143ff11888d4365ef3dfbf5af20d4ea9..4ee52447ba65652b043d9b6b6d6ea2a737d98265 100644 --- a/services/native/driver_extension_manager/src/driver_etx_mgr.cpp +++ b/services/native/driver_extension_manager/src/driver_etx_mgr.cpp @@ -14,7 +14,10 @@ */ #include "driver_ext_mgr.h" - +#include "driver_pkg_manager.h" +#include "edm_errors.h" +#include "etx_device_mgr.h" +#include "hilog_wrapper.h" #include "iservice_registry.h" #include "system_ability_definition.h" @@ -26,9 +29,21 @@ const bool G_REGISTER_RESULT = DriverExtMgr::DriverExtMgr() : SystemAbility(HDF_EXTERNAL_DEVICE_MANAGER_SA_ID, true) {} DriverExtMgr::~DriverExtMgr() {} -void DriverExtMgr::OnStart() {} +void DriverExtMgr::OnStart() +{ + EDM_LOGI(MODULE_DEV_MGR, "hdf_ext_devmgr OnStart"); + DriverPkgManager::GetInstance().Init(); + ExtDeviceManager::GetInstance().Init(); + BusExtensionCore::GetInstance().Init(); +} -void DriverExtMgr::OnStop() {} +void DriverExtMgr::OnStop() +{ + EDM_LOGI(MODULE_DEV_MGR, "hdf_ext_devmgr OnStop"); + delete &(DriverPkgManager::GetInstance()); + delete &(ExtDeviceManager::GetInstance()); + delete &(BusExtensionCore::GetInstance()); +} int DriverExtMgr::Dump(int fd, const std::vector &args) { diff --git a/services/native/driver_extension_manager/src/drivers_pkg_manager/driver_pkg_manager.cpp b/services/native/driver_extension_manager/src/drivers_pkg_manager/driver_pkg_manager.cpp index 21dc77a6f3e7cd2137f7058f75d374df972fbdd5..c4ee0b46d607e262c96db5fcbb752c25415a6c31 100644 --- a/services/native/driver_extension_manager/src/drivers_pkg_manager/driver_pkg_manager.cpp +++ b/services/native/driver_extension_manager/src/drivers_pkg_manager/driver_pkg_manager.cpp @@ -13,17 +13,17 @@ * limitations under the License. */ -#include "driver_pkg_manager.h" -#include "usb_bus_extension.h" - -#include #include +#include -#include "common_event_subscribe_info.h" -#include "common_event_support.h" +#include "hdf_log.h" +#include "hilog_wrapper.h" #include "matching_skills.h" +#include "usb_bus_extension.h" +#include "common_event_support.h" +#include "common_event_subscribe_info.h" +#include "driver_pkg_manager.h" -#include "hdf_log.h" namespace OHOS { namespace ExternalDeviceManager { using namespace std; @@ -32,6 +32,8 @@ using namespace OHOS::AAFwk; using namespace OHOS::AppExecFwk; using namespace OHOS::ExternalDeviceManager; +IMPLEMENT_SINGLE_INSTANCE(DriverPkgManager); + DriverPkgManager::DriverPkgManager() { cout << "DriverPkgManager" << endl; @@ -116,10 +118,8 @@ shared_ptr DriverPkgManager::QueryMatchDriver(shared_ptrMatchDriver(val, *devInfo)) { string bundleName = key; - ret->bundleName = - bundleName.substr(0, bundleName.find_first_of(bundleStateCallback_->GetStiching())); - ret->abilityName = - bundleName.substr(bundleName.find_last_of(bundleStateCallback_->GetStiching()) + 1); + ret->bundleName = bundleName.substr(0, bundleName.find_first_of(bundleStateCallback_->GetStiching())); + ret->abilityName = bundleName.substr(bundleName.find_last_of(bundleStateCallback_->GetStiching()) + 1); return ret; } } @@ -201,5 +201,5 @@ int32_t DriverPkgManager::UnRegisterOnBundleUpdate() bundleStateCallback_->m_pFun = nullptr; return EDM_OK; } -} -} \ No newline at end of file +} // namespace ExternalDeviceManager +} // namespace OHOS \ No newline at end of file diff --git a/test/moduletest/bus_extension_core_mt/bus_extension_core_mt.cpp b/test/moduletest/bus_extension_core_mt/bus_extension_core_mt.cpp index 49c527e5e48ca7b1b3e0d3e8397dd61e0caa7c53..1c2e5918be1153126850d26822828c8cecdfa0a7 100644 --- a/test/moduletest/bus_extension_core_mt/bus_extension_core_mt.cpp +++ b/test/moduletest/bus_extension_core_mt/bus_extension_core_mt.cpp @@ -22,6 +22,9 @@ #include "etx_device_mgr.h" #undef private +constexpr const char *START_TEXT = "Begin to loop and listen usb event:\n\ +enter q to exit.\n\ +enter p to print all usb device."; using namespace OHOS::ExternalDeviceManager; using namespace std; static void PrintAllDevice() @@ -46,6 +49,7 @@ int main(int argc, char **argv) cout << "dlopen libbus_extension.z.so failed" << endl; return -1; } + cout << START_TEXT << endl; BusExtensionCore &core = BusExtensionCore::GetInstance(); size_t size = core.busExtensions_.size(); cout << "busExtensions_.size: " << size << endl; diff --git a/test/unittest/bus_extension_test/src/usb_subscriber_test.cpp b/test/unittest/bus_extension_test/src/usb_subscriber_test.cpp index 037737a91ec59e8ded053b9196644dcbb6a17418..ef6855219f36b7ef56a58490b99f6dbc7fdf5962 100644 --- a/test/unittest/bus_extension_test/src/usb_subscriber_test.cpp +++ b/test/unittest/bus_extension_test/src/usb_subscriber_test.cpp @@ -42,7 +42,6 @@ public: void TearDown() override { cout << "UsbSubscriberTest TearDown" << endl; - delete mockUsb; mockUsb = nullptr; } diff --git a/test/unittest/drivers_pkg_manager_test/src/driver_pkg_manager_test.cpp b/test/unittest/drivers_pkg_manager_test/src/driver_pkg_manager_test.cpp index cb4ca1f09154ce61b93d7ecd870bb498b2265695..39742d3c3de4e9dbb8b55f48acc908731e7f79be 100644 --- a/test/unittest/drivers_pkg_manager_test/src/driver_pkg_manager_test.cpp +++ b/test/unittest/drivers_pkg_manager_test/src/driver_pkg_manager_test.cpp @@ -129,44 +129,34 @@ HWTEST_F(DriverPkgManagerTest, DrvExt_QueryMatch_Null_ID_Test, TestSize.Level1) class DriverPkgManagerPtrTest : public testing::Test { public: - DriverPkgManager *drvPkgMgrInstance = nullptr; - void SetUp() override - { - drvPkgMgrInstance = new DriverPkgManager(); - cout << "DriverPkgManagerPtrTest SetUp" << endl; - } - void TearDown() override - { - if (drvPkgMgrInstance != nullptr) { - delete drvPkgMgrInstance; - drvPkgMgrInstance = nullptr; - } - cout << "DriverPkgManagerPtrTest TearDown" << endl; - } + void SetUp() override {} + void TearDown() override {} }; +HWTEST_F(DriverPkgManagerPtrTest, DrvExt_QueryMatch_Before_Init_Test, TestSize.Level1) +{ + DriverPkgManager &drvPkgMgrInstance = DriverPkgManager::GetInstance(); + std::shared_ptr devInfo = std::make_shared(0); + std::shared_ptr bundle = drvPkgMgrInstance.QueryMatchDriver(devInfo); + EXPECT_EQ(nullptr, bundle); + cout << "DrvExt_QueryMatch_Before_Init_Test" << endl; +} + HWTEST_F(DriverPkgManagerPtrTest, DrvExt_New_Test, TestSize.Level1) { - int32_t ret = drvPkgMgrInstance->Init(); + DriverPkgManager &drvPkgMgrInstance = DriverPkgManager::GetInstance(); + bool ret = drvPkgMgrInstance.Init(); if (ret != 0) { EXPECT_EQ(0, ret); return; } - EXPECT_NE(nullptr, drvPkgMgrInstance); + EXPECT_NE(nullptr, &drvPkgMgrInstance); cout << "DrvExt_New_Test" << endl; } -HWTEST_F(DriverPkgManagerPtrTest, DrvExt_QueryMatch_Before_Init_Test, TestSize.Level1) -{ - std::shared_ptr devInfo = std::make_shared( - 0); - std::shared_ptr bundle = drvPkgMgrInstance->QueryMatchDriver(devInfo); - EXPECT_EQ(nullptr, bundle); - cout << "DrvExt_QueryMatch_Before_Init_Test" << endl; -} - HWTEST_F(DriverPkgManagerPtrTest, DrvExt_Delete_Test, TestSize.Level1) { + auto drvPkgMgrInstance = &(DriverPkgManager::GetInstance()); if (drvPkgMgrInstance != nullptr) { delete drvPkgMgrInstance; drvPkgMgrInstance = nullptr; diff --git a/utils/include/ext_object.h b/utils/include/ext_object.h index cb10f007e154c0dc9582ce0fe0d8e47e31182b62..0279458b23dd7428548179a841a9959c3e57a7ba 100644 --- a/utils/include/ext_object.h +++ b/utils/include/ext_object.h @@ -25,6 +25,7 @@ namespace ExternalDeviceManager { enum BusType : uint32_t { BUS_TYPE_INVALID = 0, BUS_TYPE_USB = 1, + BUS_TYPE_MAX, BUS_TYPE_TEST, }; class IBusExtension; @@ -108,13 +109,15 @@ private: }; class BusExtensionCore { - DECLARE_SINGLE_INSTANCE(BusExtensionCore); + DECLARE_SINGLE_INSTANCE_BASE(BusExtensionCore); public: + ~BusExtensionCore() = default; int32_t Init(); int32_t Register(BusType busType, std::shared_ptr busExtension); private: + BusExtensionCore() = default; std::unordered_map> busExtensions_; const uint32_t MAX_BUS_EXTENSIONS = 100; }; diff --git a/utils/include/single_instance.h b/utils/include/single_instance.h index dc6036f66af38349638c63fa83fe7faf53501a09..3ce4ee203fe346df5096880b458e57b9af59fba3 100644 --- a/utils/include/single_instance.h +++ b/utils/include/single_instance.h @@ -35,6 +35,7 @@ private: \ className() = default; \ ~className() = default; +// please remeber release instance #define IMPLEMENT_SINGLE_INSTANCE(className) \ className &className::GetInstance() \ { \