思考:重复性的代码流程应该导出为模板也方便规范

本文介绍了一种用于游戏反外挂及Android应用加固的通用框架设计思路,通过将流程标准化并模块化,便于快速部署及维护。该方案不仅提高了开发效率,还确保了代码的一致性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

N年前做电脑端的游戏反外挂检测扫描,现在做Android的安全检测,Android手游的反外挂检测,Android应用的加固保护……发现流程上都有相似之处,例如初始化,各个检测项(工作项),收尾,一样的流程,每次都是一个模式,万变不离其宗,心想如果每次都重新搭建一个流程也是无畏的浪费时间,而且试想,如果放开让新人去写会不会按照规范来写?

于是,便开始构思如何把这个模式导出为模板,下次类似的工作直接从模板创建,然后逐个功能添加即可,也正好限制了开发的规范,必须按照某某接口来去实现,方便管理,避免代码变得混乱,一举两得何乐而不为呢?

抽象

  • 对于检测类的项目,首先是初始化特征库,然后是逐个检测点定期执行,最后是反初始化的资源释放。

  • 对于Android移动加固保护,首先是解压缩、反编译,然后是加固SO、加固DEX、如果是游戏类APP则加固游戏,如果是H5类APP则加固H5资源等,最后是资源释放。

每个功能基本上一个独立的技术再负责,大的流程基本上可以不变,技术只需要专注于自己的功能即可。哪个环节的功能出了问题也是对应的负责人去查看,耦合性较低,即使某个环节出了问题,但是大的流程可以使用上次的稳定版本进行开发和调试,影响不大。

设想这样一个工作模式:一件任务安排下来,可能需要多个部门分工协作才能完成,于是把任务划分为不同的子任务,子任务之间可能有相互依赖,也可能没有。对于有相互依赖的任务,设置在不同的步骤里完成,例如子任务3必须在子任务1完成后才能完成,而子任务2和子任务3可以同时并行处理。那么可以把子任务1放在步骤1里;把子任务2和子任务3放在步骤2里。

实现

设计实现了一个类似于工作流的模式:

int main() {
    g_log.EnableLogFile(true);
    CEngine engine;

    //添加准备任务:步骤1执行完后同时执行步骤2
    engine.AddPrePareTask(new MyTask1(), 1);
    engine.AddPrePareTask(new MyTaskUnzip(), 2);
    engine.AddPrePareTask(new MyTaskDecompile(), 2);

    //添加工作任务:全部异步
    engine.AddWorkTask(new MyTaskDealDex());
    engine.AddWorkTask(new MyTaskDealSo());
    engine.AddWorkTask(new MyTaskDealGame());
    engine.AddWorkTask(new MyTaskDealH5());

    //添加收尾任务
    engine.AddCleanTask(new MyTaskDeleteTemps());

    engine.Init();
    engine.Work();
    engine.Release();
    return 0;
}

另一个好处是规范了代码,例如任务代码必须实现如下几个接口:

class ITask {
public:
    virtual string GetName() = 0;

public:
    bool Init() {
        this->OnInit();
    }
    void Work() {
        time_t start, end; time(&start);
        g_log.Log("开始执行: [%s]", this->GetName().c_str());
        this->OnBeforeWork();;
        this->OnWork();
        this->OnAfterWork();;
        time(&end);
        g_log.Log("执行完成: [%s] 耗时: %.2lf s", this->GetName().c_str(), difftime(end, start));
    }
     void Release() {
        this->OnRelease();
    }

public:
    virtual bool OnInit() = 0;
    virtual void OnBeforeWork() = 0;
    virtual void OnWork() = 0;
    virtual void OnAfterWork() = 0;
    virtual void OnRelease() = 0;

private:
    string m_sName;
};

typedef ITask *ITaskPtr;

如果【工作任务】不是循环执行多次的话,其实可以不必添加【准备任务】和【收尾任务】,直接都添加到【工作任务】里去,仅仅只要保证【准备任务】在添加的时候步骤在【工作任务】之前,【收尾任务】的步骤在【工作任务】之后即可。

导出模板

打开VS2017的菜单:项目-导出模板,按照向导导出一个zip模板。下次创建类似的项目时可以直接在向导里选择该模板,然后逐个添加任务即可,也就是只关注于功能本身。

待完善

  • 目前仅仅支持Windows,想打算一并支持Linux,这个需要时间去完成,这里仅仅阐述一个想法。
  • 添加好配置解析,日志输出,路径管理等公共操作类。
  • 添加文档,注释等。

代码参见:bigsinger/FlowCpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

asmcvc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值