HarmonyOS 第三方插件的最佳实践引用场景咨询

如图所示为项目目录结构,product为主项目,feature中为不同业务的har,正常的公共方法都是从common中一层层往上传递。

那如果我现在需要添加一个第三方插件dayjs,在feature_account业务中需要使用,在feature_calendar中也需要使用。

方案一:这个时候,我的第三方依赖如果两个业务模块都进行安装的话,har的包大小其实是比引用一份更大(整个是对的吧??)那业务模块不断新增的话,一个插件就要多非常多的内存,感觉不大对

方案二:把dayjs的方法放进sdk中,直接在sdk装包,把所有的方法和属性都export出去,可以解决统一使用的问题。

问题1:sdk有多个插件导出,可能会出现多个插件的方法命名重复;

问题2: 将某个插件的所有方法再export出去,也比较麻烦。请问有没有什么其他方式?

HarmonyOS 第三方插件的最佳实践引用场景咨询 -鸿蒙开发者社区

HarmonyOS
2024-08-23 22:50:54
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
鱼弦CTO
1

在项目中引入第三方插件时,尤其是在多模块的架构中,确实需要考虑引入方式对包大小以及维护性的影响。你提到的两种方案各有优缺点,但都存在一些问题。我们可以结合这些问题来探索最佳实践。

### 项目目录结构示例

假设项目目录结构如下:

project
│
├── product
│   └── ...
├── common
│   └── ...
├── feature_account
│   └── ...
├── feature_calendar
│   └── ...
├── sdk
│   └── ...
└── build.gradle

### 方案一:每个模块单独安装依赖

这种方法虽然直观,但会导致重复依赖的问题,增加整体包大小。这个问题在大型项目中尤为突出,可能不可取。

### 方案二:将插件集成到 SDK 中

这种方法可以解决重复依赖的问题,但如你所说,可能会导致命名冲突和管理不便的问题。

### 方案三:使用统一依赖管理和依赖注入

这是一种较为灵活和高效的方法,可以解决上述问题。

#### 1. 在主项目 ​​build.gradle​​ 中统一管理依赖

你可以在项目的顶层 ​​build.gradle​​ 中统一管理第三方依赖。这确保了所有模块使用相同版本的依赖,避免了重复引用。

// Top-level build.gradle file
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.2"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files.
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

// Define common dependencies
ext {
    dayjsVersion = '1.10.7'
}

subprojects {
    apply plugin: 'java-library'

    dependencies {
        implementation "io.dayjs:dayjs:$dayjsVersion"
    }
}

#### 2. 使用依赖注入(DI)

通过依赖注入框架(如 Dagger 或其他轻量级 DI 框架),将第三方库的实例注入到需要的地方。这不仅能减小耦合,还能方便管理依赖。

##### 示例代码:

  • 创建一个 ServiceLocator 类
public class ServiceLocator {
    private static volatile DayjsHelper dayjsHelper;

    private ServiceLocator() {}

    public static DayjsHelper getDayjsHelper() {
        if (dayjsHelper == null) {
            synchronized (ServiceLocator.class) {
                if (dayjsHelper == null) {
                    dayjsHelper = new DayjsHelper();
                }
            }
        }
        return dayjsHelper;
    }
}
  • DayjsHelper 类包装 dayjs 的功能
public class DayjsHelper {
    // 初始化 dayjs 或者任何配置
    public DayjsHelper() {
        // 初始化 dayjs
    }

    // 包装 dayjs 方法
    public String format(Date date) {
        // 调用 dayjs 的相关方法
        return "formattedDate";
    }

    // 更多 dayjs 的方法...
}
  • 在需要使用 dayjs 的地方通过 ServiceLocator 获取实例
public class FeatureAccount {
    public void someMethod() {
        DayjsHelper dayjsHelper = ServiceLocator.getDayjsHelper();
        String formattedDate = dayjsHelper.format(new Date());
        // 使用 formattedDate ...
    }
}

public class FeatureCalendar {
    public void anotherMethod() {
        DayjsHelper dayjsHelper = ServiceLocator.getDayjsHelper();
        String formattedDate = dayjsHelper.format(new Date());
        // 使用 formattedDate ...
    }
}

### 优点

  1. 减少包大小:通过统一管理依赖,避免了重复引用,减少了最终生成的 HAP 包大小。
  2. 易于维护:版本升级、依赖更换只需在一个地方进行修改。
  3. 避免命名冲突:通过 DI 或 ServiceLocator 等模式,将依赖管理与业务逻辑分离,减少了命名冲突的风险。
  4. 高可扩展性:如果需要添加新的第三方库,只需更新 DI 配置或 ServiceLocator 即可,不需要修改每个业务模块。

### 结论

通过在主项目中统一管理依赖,并结合依赖注入或 ServiceLocator 模式,可以有效解决多模块使用第三方依赖时的包大小、维护性和命名冲突问题。这是一种推荐的最佳实践,能够保持代码整洁和项目的高可维护性。

分享
微博
QQ
微信
回复
2024-08-26 17:53:22
zxjiu

product(hap)->feature(har)–>sdk(har), 这种情况下所有har最终都会合并到hap中的abc文件,会去重,一份代码。

简单测试方法:1 feature引用sdk, 其它feature不应用打包,再所有feature引用打包,看包大小变化。

分享
微博
QQ
微信
回复
2024-08-23 22:52:24
相关问题
HarmonyOS如何移植第三方MCU?
8778浏览 • 1回复 待解决
ArkTS API 9 Stage 如何引用第三方字体?
2963浏览 • 1回复 待解决
HarmonyOS支持第三方列表
924浏览 • 1回复 待解决
如何引入自己第三方”库
94浏览 • 1回复 待解决
第三方怎么装鸿蒙系统?
1988浏览 • 1回复 待解决
开发第三方SDK如何编译?
13112浏览 • 2回复 待解决
引用第三方组件代码时
5407浏览 • 1回复 待解决
HarmonyOS 第三方应用安装和卸载广播
129浏览 • 0回复 待解决
HarmonyOS第三方sdk bugly平替方案
60浏览 • 1回复 待解决
是否支持使用第三方webview内核
704浏览 • 1回复 待解决
第三方js库迁移有懂吗?
1919浏览 • 1回复 待解决
通过ohpm install 第三方npm包,报错
901浏览 • 1回复 待解决
第三方应用如何拿到蓝牙mac地址
150浏览 • 1回复 待解决
Text控件使用第三方文档
511浏览 • 1回复 待解决
OHPM包管理怎么安装第三方
3942浏览 • 1回复 待解决
鸿蒙有哪些支持第三方UI框架吗?
3240浏览 • 1回复 待解决
react-native 第三方库使用npm更新
884浏览 • 1回复 待解决
ArkTS不支持使用第三方js库?
3586浏览 • 1回复 待解决