尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Android通用Hook框架设计与实现:端侧注入与规则下发
做Android开发的同学看到“基于PHP、asp.net、java、Springboot、SSM、vue3的基于Android平台的通用Hook框架设计与实现”这个标题第一反应多半是“这到底是个啥组合”。说实话我第一次拿到这个项目清单的时候也愣了一下Hook框架是跑在Android端的跟PHP、ASP.NET有啥关系Spring Boot和SSM又能干什么Vue3又在哪里插一脚把话说开这个标题真正想表达的是一个Android端的通用Hook框架配套一整套服务端管理平台用来做规则下发、数据回传、可视化展示。简单说就是“手机端可插拔的运行时代理”加上“后台统一管控”。这里的PHP、ASP.NET、Java、Spring Boot、SSM是一种“技术栈并列”的写法核心承载者其实有三个角色——Android端、可对接的统一接口层、以及Vue3做的前端管理界面。把这层皮剥开这个项目的本质就是一条完整的“端侧Hook 服务端管理”链路。这篇文章我会顺着这个真实定位往下拆。从总体架构设计聊到具体的类怎么编、规则怎么配置和下发再到实测中我踩过的坑。如果你正准备做课程设计、毕业设计或者公司内部要搞一套端侧运行时注入的公共能力这篇应该能省你不少时间。1. 先把这个项目的定位聊透1.1 标题里的技术栈到底谁说了算先别急着列代码我先把标题这套“大杂烩”拆清楚。很多人拿到这种项目名会疑惑一个Android Hook框架跟PHP有什么关系跟ASP.NET又有什么关系其实这类标题常见于高校课程设计或者综合性实训项目它的潜台词是“前端有人做、后端有人做、移动端有人做”最后合成一套完整系统。于是标题上把所有技术栈都写上去了但实际工程落地的时候它们是有分工的。真正的核心只有一个——Android端Hook框架。它才是项目的中枢承担类的拦截、方法监听、行为改写、事件上报这些脏活累活。而Java、Spring Boot、SSM构成的是服务端那一层负责管理设备、下发Hook规则、接收终端回传的数据。PHP和ASP.NET在这个项目里通常意味着历史遗留系统或异构接口要么是你要对接的老系统要么是整套方案需要兼容多端后端服务的现实需求。Vue3则是后台管理界面的主力给运营人员一个可视化操作台能配规则、能看数据、能管理设备。这个分工想明白了后面才不会跑偏。你不可能用PHP去写Android Hook逻辑也不该在Spring Boot里写死一条一条的方法拦截配置。正确的姿态是手机端做好运行时能力服务端管好配置和数据前端管好交互。也就是说Hook是主菜服务端是配菜Vue3是摆盘。1.2 一个通用Hook框架要解决的三个问题聊“通用”之前得先定义不通用是什么样的。你大概率见过那种写死的Hook项目——只在某个特定App里拦截某个特定方法改一两个字换个包就崩换个方法就找不到。这种代码只能算“一次性脚本”谈不上框架。通用Hook框架要解决的第一件事是拦截点的抽象。不能把目标类名、目标方法名、参数类型写死在代码里而应该让它们成为可配置的数据。第二件事是事件处理的可插拔不能每加一种业务需求就重新写一版Hook逻辑应该让业务方只关注“我关心哪个类我要对方法做什么”底层拦截这些脏活统一搞定。第三件事是数据回传链路Hook到东西之后怎么办本地存还是走网络、数据格式怎么约定、规则更新怎么同步这决定了框架是个“玩具”还是一个“工程”。这个项目把Android端和服务端串起来本质上就是奔着第三条路去的。把规则存在服务端把Hook结果上报到服务端再用Vue3展示和分析这套闭环下来才算把“通用”两个字做实了。2. 通用Hook框架的整体架构设计2.1 三层架构注入层、拦截层、管理层Android端的通用Hook框架我习惯分成三层来看注入层、拦截层、管理层。这个分法可能和你在部分文档里看到的不太一样但我觉得它最能暴露问题。注入层负责把我们的代码“塞”进目标进程。常见的路子有几条Xposed框架、Frida、Native hook比如PLT hook、运行时编译插桩ASM以及基于UnAgent之类实现的轻量级动态代理。每一路都有它的适用场景也有它绕不开的坑。Xposed系列是传统的Java层Hook主流但现在的Android版本对Zygote进程保护越来越狠开机注入的方式在模拟器和刷机环境下才顺手。Frida绑定动态注入灵活度很高但要带个agent跑。轻量级动态代理则是纯应用内自洽不需要root环境适合自己的App或者插件化项目。拦截层是框架的中枢它要解决“Hook规则对应到哪个目标、拦截到之后干什么”的问题。这里需要有一个统一的拦截器管理器里面挂着一系列“方法匹配器方法处理器”。匹配器负责判断当前执行的这个类和方法是不是我们关心的处理器则负责真正执行业务逻辑。匹配靠的是配置驱动不能写死在代码里。管理层管的是规则装配和生命周期。它负责从本地缓存或远端服务器读取配置把配置解析成可执行的拦截规则注入到拦截层里同时还要把Hook捕获到的数据做本地封装、持久化、再通过上报通道推给服务端。管理层的设计决定了框架的灵活性——规则能不能热更新上线的时候要不要重新装包全靠这一层。这个三层架构和传统后端的三层架构意思不太一样不用搞混。后端的Controller-Service-DAO那套讲究的是请求链路和数据访问的分层而这里的注入-拦截-管理讲究的是运行时能力的递进先能进去再会拦截最后可管理。2.2 事件模型与统一抽象设计一个通用框架最怕的就是业务逻辑耦合进底层。比如有一天产品说“我想Hook一下某个SDK的初始化方法统计一下它启动耗时”你的框架如果只针对于某一个类写了一个专门的Hook类那第二天他再提一个需求你就得再写一个Hook类第三天又提一个类越来越多框架就淹没在业务代码里了。解决方法是引入统一事件模型。我建议抽象一个HookEvent里面携带目标类名、目标方法名、方法参数数组、方法调用的时间戳、进程信息、附加的自定义字段。所有Hook拦截的结果都统一封装成这个结构不关心业务层面的数据结构长什么样。然后用一个EventBus或者自定义的EventDispatcher把这些事件分发出去业务方只要监听自己感兴趣的事件类型就拿到了完整的数据。同时方法匹配不能靠硬编码字符串去contains应该做成表达式匹配。比如规则里写class cn.x.x.InitHelpermethod init参数类型 [java.lang.String, int]拦截层解析这条规则时生成对应的匹配器。可配置化的匹配逻辑才是框架脱离开代码写死命运的起点。这里我还想多说一句通用性的反面是效率。框架的抽象层越多性能损耗就越大。所以设计时要做权衡能走配置解决的不要走代码新增能走轻量匹配的不要走重量级反射。后面我会讲参数该怎么取舍。2.3 规则引擎让Hook行为可配置化规则引擎是整个框架的大脑。我设计的规则配置包括四部分scope作用域、target目标、action动作、priority优先级。scope可以理解成一个进程或包名列表target指类的全限定名和方法签名action包括“返回前置值”“修改参数值”“记录调用栈”“直接跳过原方法”“执行附加代码”这几种常见动作priority决定冲突规则谁来执行。这套规则的表现形式初期可以直接JSON。比如{ hookId: 10001, packageName: com.example.demo, className: com.example.demo.NetManager, methodName: request, paramTypes: [java.lang.String], action: addLog, priority: 1, enabled: true }服务端和客户端都认这个JSON结构客户端解析成HookRule对象灌入拦截器管理器。这样每次调规则服务端改一下配置客户端拉取更新就完成了行为切换根本不用重新打包APK。如果你要做毕业设计这个“规则动态下发”的设计点非常值得写进论文或答辩PPT里因为它直观地体现了“通用性”。但规则引擎一定要前置校验。字段缺失、类名格式错误、方法参数类型写错这些在服务端就要拦住不然下发到客户端只会让拦截器在运行时抛异常。这个坑我踩过不止一次建议服务端做一套JSON Schema校验同时客户端也做一层downgrade逻辑——解析不了就忽略这条规则不影响框架主流程。3. 多后端技术栈的职责划分与接口衔接3.1 Spring Boot 管理端的设计思路整套系统里Spring Boot管理的职责是“规则中心数据接收器”。规则中心要维护一份最新的Hook规则表提供规则的增删改查接口同时对外暴露一个版本号或时间戳让客户端可以增量拉取。数据接收器则负责接收客户端上报的HookEvent落库或转发。我建议模块分两块hook-rule-service和hook-data-service。前者管配置只暴露极简的REST接口获取最新全量规则、按增量版本获取规则、规则健康检查。后者管数据提供一个/api/hook/events的POST端点接收一批封装好的HookEvent做基础清洗之后写入数据库。为什么管理端要逼着自己保持极简因为端侧网络环境复杂弱网频繁断点续传和幂等设计比业务繁不繁重重要得多。接口设计得越复杂端侧的适配成本就越高最后必然导致规则拉不下来、数据传不上去这种基础问题。端侧的接口调用我强烈建议keep it simple能一个请求搞定的不要拆成三四个。3.2 SSM、PHP、ASP.NET 在整套体系里的真实位置这个项目标题里同时挂着SSM、PHP、ASP.NET很多同学会以为它们必须都在代码里“体现一遍”于是强行造轮子。这里我要说句掏心窝的话这些技术栈不应该出现在一套工程里硬凑而应该作为“异构系统兼容”的设计点存在。你可以把SSM视为内部老系统的代表——比如公司内部已有一套旧的管理后台用SSM写的新框架要对接它就要提供一个适配层。PHP和ASP.NET同理属于外部第三方接口的典型代表。在设计通用框架的服务端时你真正要做的不是把这三门语言全部写一遍而是把规则接口设计成语言无关的通过统一的RESTful API或消息队列来解耦异构系统。如果你在做课程设计答辩这个点可以包装成一个很好的问题“为什么标题里出现了这么多后端技术”回答是这个系统在设计时考虑了多后端环境的兼容性不绑定某一种语言实现的服务端任何技术栈的后端都可以通过标准HTTP接口与Android端通信。这样解释既合理又能表现你的架构视野。3.3 Vue3 管理界面与数据可视化管理后台用Vue3配合Element Plus、ECharts这套组合开发效率很高。真正要注意的是页面怎么设计才贴合业务场景。规则管理页面最好分成“配置列表”“规则编辑器”“发布状态”三个区域。规则编辑器里把JSON落成表单让运营人员不用看懂JSON也能编辑规则。发布状态展示每条规则在多少台设备上生效、多少台设备上报了执行反馈这样运营人员能直观感知自己的配置是否起作用了。设备管理页面用ECharts展示活跃设备趋势、Hook触发次数Top10、异常回调率这几个核心指标比堆一堆原始日志有用得多。既然是“通用Hook框架”它的价值恰恰体现在管理端对海量终端行为的统一观察上而不是手工去一台一台连手机抓日志。Vue3这个环节的对接很简单调用Spring Boot的REST接口页面展示数据、提交配置。跨域问题别忘了在服务端配好CORS开发环境用Vite的proxy转发别把跨域confusion留到部署那一刻。4. 核心实现从零搭建一个可运行的Hook框架4.1 工程准备与环境说明动手前先明确底层方案。我选的是轻量级自注入方案不依赖root适合在自家应用或插件化容器里做行为采集和逻辑增强。如果你要写Xposed模块流程要换成在Android Studio里建一个Xposed模块工程然后处理xposed_init配置文件这里先讲不依赖root的路径因为大部分读者的日常开发设备都不方便刷机。工具链上我用的是Android Studio最新的稳定版本编译器跟SDK尽量用官方推荐版本、Gradle 8.x、JDK 17、minSdk 21、targetSdk 33实测各版本表现稳定覆盖了绝大多数存量机型。包名建议用com.demo.hookframework别跟目标业务包名混在一起后面处理ClassLoader隔离时省很多事。为什么要强调工程基础因为Hook框架本身就是个“敏感”的技术活如果工程项目本身配置混乱后面排查问题的时候根本分不清是框架逻辑错了还是编译环境导致的意外。我建议你把工程名、包名、SDK版本在动手前都确定好编译器警告清零之后再写核心代码。4.2 核心类设计与代码实践先定义一个规则模型public class HookRule { private String hookId; private String packageName; private String className; private String methodName; private String[] paramTypes; private String action; private int priority; private boolean enabled; private MapString, String extraParams; }然后定义统一的拦截器接口public interface MethodInterceptor { boolean shouldHandle(HookRule rule, String className, String methodName, Object[] args); Object onIntercept(Object target, Method method, Object[] args, HookRule rule) throws Throwable; void onError(HookRule rule, Throwable throwable); }shouldHandle负责规则匹配onIntercept是业务逻辑执行点onError做兜底。这三个方法把规则匹配、业务执行、异常处理完全拆开新加业务的时候只需要新写一个MethodInterceptor实现类再挂到拦截器管理器上。管理器是这个框架的心脏public class HookManager { private static volatile HookManager instance; private final MapString, MethodInterceptor interceptorMap new ConcurrentHashMap(); private final ListHookRule appliedRules new CopyOnWriteArrayList(); private HookManager() {} public static HookManager getInstance() { if (instance null) { synchronized (HookManager.class) { if (instance null) { instance new HookManager(); } } } return instance; } public void registerInterceptor(String actionName, MethodInterceptor interceptor) { interceptorMap.put(actionName, interceptor); } public void applyRule(HookRule rule) { if (!rule.isEnabled()) return; appliedRules.add(rule); // 核心解析规则为目标的类和方法建立代理对象 try { Class? targetClass Class.forName(rule.getClassName()); // 这里可以用动态代理或字节码插桩方式生成代理类 DynamicProxyFactory.createProxy(targetClass, rule); } catch (ClassNotFoundException e) { // 类加载失败要记录但不影响主流程 ErrorReporter.report(e); } } public ListHookRule getAppliedRules() { return appliedRules; } }这里重点解释一下DynamicProxyFactory。它做的事情是为targetClass生成一个代理类把原生方法调用重定向到我们注册的拦截器上。实现上最直接的是利用JDK的动态代理但它只适用于接口类型如果你要代理的是具体类的具体方法就需要用到ASM生成字节码或者依赖运行时方法替换。这个项目里我用的是一个折中方案第一步用反射放方法访问权限第二步用动态代理挂接接口方法第三步再对非接口方法做兜底处理整套操作封装在工厂内对上层透明。核心调用链路走通之后业务方想统计某个类的网络请求耗时就很简单HookManager.getInstance().registerInterceptor(addLog, (rule, clazz, method, args) - { long start System.currentTimeMillis(); Object result method.invoke(target, args); long cost System.currentTimeMillis() - start; Log.i(HookFramework, rule.getHookId() cost cost ms); return result; });注意这里面method.invoke(target, args)的异常处理一定要捕获InvocationTargetException并解开它包装的真实异常否则排查问题的时候你会对着一堆包装异常发懵。4.3 规则加载与远程下发联动光有本地规则还不够通用框架必须支持远程下发。客户端的规则同步流程我建议走“本地缓存优先 版本拉取兜底 远程强制刷新”三步。初始化时先加载assets目录里的默认规则保证首次启动也有基础能力然后请求/api/hook/rule/latest?timestampxxx服务端返回增量规则集客户端做merge合并而不是整体覆盖避免把本地正在生效的规则误删。merge的时候要处理规则删除服务端标记deleted、规则变更version字段递增、规则停用enabledfalse三种情况。代码上很好实现public class RuleSyncManager { private final OkHttpClient client new OkHttpClient(); private final String serverBaseUrl http://your-server:8080; public void syncRules() { long lastSyncTime SharePrefs.getLastSyncTime(); Request request new Request.Builder() .url(serverBaseUrl /api/hook/rule/latest?timestamp lastSyncTime) .build(); try (Response response client.newCall(request).execute()) { if (!response.isSuccessful()) return; ListHookRule remoteRules parseRules(response.body().string()); applyRemoteRules(remoteRules); SharePrefs.saveLastSyncTime(System.currentTimeMillis()); } catch (IOException e) { // 弱网失败不阻塞主流程 } } }每次取增量服务端要准备两个字段lastTimestamp和ruleList。客户端拿lastTimestamp跟本地比对判断是否需要处理ruleList里每一条规则都带版本号客户端发现版本号没变就直接跳过。这套机制能大幅减少弱网环境下的无效请求。4.4 管理端API与配置中心实现Spring Boot这边代码量其实不大。一个HookRuleController里面挂三个接口核心代码用简单的内存存储示意真实项目请替换成数据库缓存RestController RequestMapping(/api/hook/rule) public class HookRuleController { private final ConcurrentHashMapString, HookRule ruleStorage new ConcurrentHashMap(); GetMapping(/latest) public ResultListHookRule getLatestRules(RequestParam long timestamp) { ListHookRule changedRules ruleStorage.values().stream() .filter(r - r.getUpdateTime() timestamp) .collect(Collectors.toList()); return Result.success(changedRules); } PostMapping(/save) public ResultBoolean saveRule(RequestBody HookRule rule) { rule.setUpdateTime(System.currentTimeMillis()); ruleStorage.put(rule.getHookId(), rule); return Result.success(true); } PostMapping(/disable) public ResultBoolean disableRule(RequestBody DisableRequest request) { HookRule rule ruleStorage.get(request.getRuleId()); if (rule ! null) { rule.setEnabled(false); rule.setUpdateTime(System.currentTimeMillis()); } return Result.success(true); } }这里有一个非常容易忽略的细节规则修改时一定要把updateTime戳更新到位。客户端增量拉取完全依赖这个时间戳你要是忘了刷新它客户端就永远不会收到变更。我用过不少项目里的接口一半的同步bug都出在这里。Vue3端对接就一句话的事页面表单提交到/api/hook/rule/save列表页请求/api/hook/rule/latest显示最新规则设备页调用数据统计接口展示图表。如果Vue3项目是用Vite搭的本地调试时记得在vite.config.js里配一下proxy把/api开头的请求转发到Spring Boot服务端口否则浏览器跨域能让你烦一下午。5. 实测过程与避坑实录5.1 高频问题与排查思路一个HarmonyOS跑了$N$个小时的牌面下我按频率从高到低整理一下实测中遇到的问题。最常见的崩溃是NoSuchMethodError。反射调用时类里有方法名相同的方法但参数类型和规则里写的不完全一致。排查思路很简单抓一条calling stack看具体的Method对象是在哪一步解析失败的。我建议在DynamicProxyFactory里把目标类的方法全量打印到日志里比对一次就能发现是参数类型写错了还是方法级泛型擦除导致匹配失败。其次是ClassNotFound。目标SDK的低版本和高版本之间类路径变动了上个版本是com.xx.core.InitHelper下个版本改名成了com.xx.core.Initializer规则完全失配。这类问题我的对策是配置多个兼容类路径一条规则可以带一个classPathCandidates数组依次尝试加载谁成功就用谁。再次是线程调度问题。Hook逻辑在接收线程里直接执行了耗时操作结果拖慢了业务链路导致UI卡顿。通用框架里一定要区分“同步拦截”和“异步上报”。同步拦截只做轻量判断和记录数据上报这些重活切到后台线程池。数据上报的重复问题上也值得单说。同一事件可能被Hook多次触发上报到服务端会产生大量脏数据。我在HookEvent里加了一个eventHash字段用目标类名方法名参数摘要时间窗口计算客户端本地维护一个去重队列服务端也做幂等校验两边夹击才能把重复率压下去。最后总被问到的还有功能不生效。90%的情况都是规则里的enabled没设成true或者服务端时间戳没刷新。先把接口返回的原始JSON打出来看一眼比自己瞎猜快得多。5.2 参数调优与实践心得规则同步的时间间隔太短了浪费流量和电量太长了规则变更不实时。我调下来觉得业务上能忍受的极限是60秒轮询一次激烈变更场景用WebSocket或推送通道做准实时通知。如果走轮询服务端要配合做空响应优化没有任何更新的情况下返回301状态码或者极简JSON减少网络开销。HookManager线程池的线程数手机端不建议开大核心线程数2~4就够了。事件上报的缓冲队列用有界队列比如容量5000满了就丢弃最老的数据防止内存增长失控。框架是为业务服务的业务跑挂了框架还在那儿疯狂往内存里塞事件是本末倒置。观察日志我用的是写文件按天切割的方案文件大小按5MB滚动。手机上日志文件不能无脑增长否则用几天就能吃掉几个G的存储。轮转策略一定要在一开始就设计好。5.3 一条资深开发者的经验忠告最后说点这几次实践下来最深的感受。Hook框架是个“水很深”的项目表面上写几个类能跑就行实际上要认真对待的是工程化问题规则怎么管理、异常怎么兜底、数据怎么统计、链路怎么追踪这些远比“怎么把一个方法拦下来”更值钱。我见过太多人一上来就钻进代码细节里结果整个项目除了演示demo是好的一接真实业务就稀碎。我的建议是先把规则下发链路调通再把数据上报链路调通最后才一格一格地填充具体的业务拦截逻辑。链路通了框架的骨架就立住了后面你加多少业务Hook都只是“新增一个Interceptor并注册”这么简单的事。如果你准备拿这个课题做毕业设计也可以考虑继续扩展把HTTP请求换成加密通信、把规则发布做成审批流、把上报数据接进大屏或BI系统。这些延伸的点每一个都能单独成章也能让你的项目在众多相似题目里更亮眼。但不管怎么扩展先把Android端这套运行时能力做成一个稳定的“可插拔底座”这永远是整个项目的地基。
RELATED

相关推荐

FLAC隧道支护模拟实战:锚杆锚索喷混钢拱架参数与FISH代码解析

FLAC隧道支护模拟实战:锚杆锚索喷混钢拱架参数与FISH代码解析

地铁隧道初支方案里的“锚杆锚索喷浆钢拱架”四件套,算不算最优解?说实话,在FLAC里把这四类支护结构建出来、调通、算跑,很多工程师能做得七七八八,但真正能把每一条FISH代码背后的力学逻辑讲清楚的人并不多。我前前后…

📅 2026/10/12 8:52:58
用pandas高效比对两张Excel表格:从数据清洗到差异报告

用pandas高效比对两张Excel表格:从数据清洗到差异报告

1. 为什么“比对两张Excel”这件事值得认真对待1.1 从一次真实的数据核对需求说起上个月,某公司的运营A同学找到我,说他们部门每周都要做一次“数据核对”:总部发来一份商品价格表,分部也有一份自己维护的价格表,两张表…

📅 2026/10/12 8:52:58
AVL树平衡机制与四种旋转的C++实现详解

AVL树平衡机制与四种旋转的C++实现详解

如果你写过二叉搜索树,八成遇到过这样的尴尬事:往树里按顺序插入1、2、3、4、5,一棵理想的"折半查找"结构就变成了一条链表,查找复杂度从O(log n)直接跌到O(n)。解决这个问题的经典方案之一,就是AVL树——最…

📅 2026/10/12 8:52:58
MORE NEWS

更多资讯

📰

大模型落地、具身智能与端侧AI:科技产业趋势全景观察

长假里科技圈其实没打烊。我习惯每天早晚各刷一遍行业消息,把值得展开说的东西单独挑出来写一写。今天这份科技爆文日报,想聊五个方向:大模型从卷参数转向卷应用落地,具身智能集中放料、机器人赛道进入手眼配合的深水区&#xff0…

📰

Qt多线程选型:QThread与QtConcurrent的区别、坑点与最佳实践

做 Qt 开发绕不开多线程,但只要涉及线程,十个人里八个都踩过坑。界面卡死、数据错乱、信号丢失、崩溃退出……很多问题的根源不是业务逻辑,而是没有系统理解 QThread 和 QtConcurrent 这两个工具的定位和用法。我这两年帮别人排查过不少类似问…

📰

哈希算法在系统安全中的关键作用:从密码存储到完整性校验

你有没有遇到过这样的情况:下载一个软件安装包时,官网页面会贴出一串长长的十六进制字符,比如e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855。大多数人都把这串字符当成可有可无的“官网装饰”,但你有没有想…

📰

Java函数复写深度解析:从语法规则到Android实战避坑

1. 从一次编译报错说起:为什么函数复写值得单独拎出来讲刚接触Java4Android那会儿,我写了一个继承自父类的子类,想当然地给某个方法换了个参数类型,以为这就是"复写"。结果运行起来,程序走的还是父类的逻辑&…

📰

JSP+MySQL构建BBS论坛:核心架构与完整开发实战

简介:基于JSP与MySQL构建的BBS论坛项目源码包,面向正在学习Java Web开发的学生与开发者,完整演示了论坛系统的核心业务流程:用户注册登录、板块管理、主题发帖、回复互动、关键词搜索以及后台权限控制等。包内共493个文件&#xf…

📰

深度学习实践三部曲:Keras回调、自编码器异常检测与TensorFlow Serving部署

1. 为什么持续啃 DLology:一个翻译项目背后的技术筛选逻辑1.1 DLology 这个博客,到底强在哪先交代一下背景。我一直在做的这个 DLology 博客中文翻译系列,已经推进到第四期了。很多朋友问我,深度学习资料那么多,为什么…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬