最近一直在研究插件化的东西,我看了网上大多都是直接上来就开始讲解原理然后写个demo,这样对于很多没有入门的朋友不是很好的理解,下面我会通过自己的研究过程,一步一步循序渐进的将插件化需要的知识点都梳理一遍及讲解,其实学习插件化的好处并不全因为它是一门热门的技术,插件化涉及的知识点很多,可以让我们对android的理解及境界上都会有一个质的飞跃,在我将所有设计的知识点都大概讲一遍后会用一个demo来实现插件化,里面将设计所有讲过的知识。

插件化其实就是动态加载,动态加载又包括了代码加载和资源加载。

可以干什么:

  • 插件化最早出现是因为65535问题出现的,用于查分多个dex并动态加载dex来防止65535问题

  • 现在很多公司用插件化来做模块的动态加载,这样既能实现web端一样的随时更新,还能减少apk包的体积,其实就是加载一个未安装的apk。

  • 热修复,热修复其实也是动态加载原理

  • 换肤,使用动态的资源加载可以实现换肤功能

  • 还可以通过hook系统的一些类做一些你想做的坏事。

目前比较有名的插件化框架:

  • 任玉刚的:dynamic-load-apk,这个项目使用的是一种代理的方式去实现
    https://github.com/singwhatiwanna/dynamic-load-apk

  • 360的:DroidPlugin,这个项目是通过hook系统类来实现
    https://github.com/Qihoo360/DroidPlugin

目前比较火的热修复框架:

  • 阿里的:andfix,用于对方法的修复,可以立即生效,不支持资源及类替换
    https://github.com/alibaba/AndFix

  • 腾讯的:tinker,除了不支持立即生效,全部支持
    https://github.com/Tencent/tinker

  • 美团的:robust,不开源

如果要使用插件化来作为模块化的话,那么就需要解决两个问题

  • 代码的加载,就是使用ClassLoader加载代码
  • 资源的加载,使用AssetManager的隐藏方法,addAsssetPath方法加入一个资源路径来获取这个资源的Resource资源
  • 还有一个问题就是对四大组件的生命周期管理

准备:

在了解插件化之前首先需要了解及掌握的知识点
一、Binder机制
二、代理模式,
三、反射
四、类加载及dex加载
五、应用启动过程及类加载过程
六、实现插件化完整demo及思路分析
七、动态加载资源及解决资源冲突问题

Binder机制:

其实Binder看你怎么去理解,如果从代码角度的话他是一个类,如果从硬件角度的话他是一个驱动,如果从IPC角度的话他是一种通信机制,是framework层的各种ServiceManager的链接桥梁,
我们知道我们平时使用的系统服务对象其实都是系统的,他们存在的进程和我们的应用并不在一个进程中,但是为什么我们能直接使用呢?其实就是因为Binder的存在,跨进程通信,再说大白话一点就是使用了我们经常说的aidl,Binder很复杂,这里只是为了插件化做铺垫,想深入理解请自行查阅资料。

进程间通信过程

  • 1.首先客户端要链接服务端
  • 2.然后服务端会返回一个客户端的对象(代理对象)
  • 3.然后客户端使用这个代理对象其中的方法时,系统会先调用服务端的方法,然后将运算的结果返回给客户端(要知道其实并不是用了这个对象的方法,而是去服务端里运算,然后在返回给客户端的)

我们通过自己写一个aidl,然后和系统的源码进行对比

//我们自己写的aidl的接口
//IMyAidlInterface.aidl
package com.huanju.chajianhuatest;
import com.huanju.chajianhuatest.aidlmode.TestBean;interface IMyAidlInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);String getS(in TestBean s);TestBean getInfoBean(out TestBean b);
}

系统会帮我们自动创建一个IMyAidlInterface.java的文件,我们去看看

>

package com.huanju.chajianhuatest;public interface IMyAidlInterface extends android.os.IInterface {public static abstract class Stub extends android.os.Binder implements com.huanju.chajianhuatest.IMyAidlInterface {private static final java.lang.String DESCRIPTOR = "com.huanju.chajianhuatest.IMyAidlInterface";public Stub() {this.attachInterface(this, DESCRIPTOR);}public static com.huanju.chajianhuatest.IMyAidlInterface asInterface(android.os.IBinder obj) {if ((obj == null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin != null) && (iin instanceof com.huanju.chajianhuatest.IMyAidlInterface))) {return ((com.huanju.chajianhuatest.IMyAidlInterface) iin);}return new com.huanju.chajianhuatest.IMyAidlInterface.Stub.Proxy(obj);}@Overridepublic android.os.IBinder asBinder() {return this;}@Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_basicTypes: {data.enforceInterface(DESCRIPTOR);int _arg0;_arg0 = data.readInt();long _arg1;_arg1 = data.readLong();boolean _arg2;_arg2 = (0 != data.readInt());float _arg3;_arg3 = data.readFloat();double _arg4;_arg4 = data.readDouble();java.lang.String _arg5;_arg5 = data.readString();this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);reply.writeNoException();return true;}case TRANSACTION_getS: {data.enforceInterface(DESCRIPTOR);com.huanju.chajianhuatest.aidlmode.TestBean _arg0;if ((0 != data.readInt())) {_arg0 = com.huanju.chajianhuatest.aidlmode.TestBean.CREATOR.createFromParcel(data);} else {_arg0 = null;}java.lang.String _result = this.getS(_arg0);reply.writeNoException();reply.writeString(_result);return true;}case TRANSACTION_getInfoBean: {data.enforceInterface(DESCRIPTOR);com.huanju.chajianhuatest.aidlmode.TestBean _arg0;_arg0 = new com.huanju.chajianhuatest.aidlmode.TestBean();com.huanju.chajianhuatest.aidlmode.TestBean _result = this.getInfoBean(_arg0);reply.writeNoException();if ((_result != null)) {reply.writeInt(1);_result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);} else {reply.writeInt(0);}if ((_arg0 != null)) {reply.writeInt(1);_arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);} else {reply.writeInt(0);}return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.huanju.chajianhuatest.IMyAidlInterface {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote = remote;}@Overridepublic android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(anInt);_data.writeLong(aLong);_data.writeInt(((aBoolean) ? (1) : (0)));_data.writeFloat(aFloat);_data.writeDouble(aDouble);_data.writeString(aString);mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}@Overridepublic java.lang.String getS(com.huanju.chajianhuatest.aidlmode.TestBean s) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.lang.String _result;try {_data.writeInterfaceToken(DESCRIPTOR);if ((s != null)) {_data.writeInt(1);s.writeToParcel(_data, 0);} else {_data.writeInt(0);}mRemote.transact(Stub.TRANSACTION_getS, _data, _reply, 0);_reply.readException();_result = _reply.readString();} finally {_reply.recycle();_data.recycle();}return _result;}@Overridepublic com.huanju.chajianhuatest.aidlmode.TestBean getInfoBean(com.huanju.chajianhuatest.aidlmode.TestBean b) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();com.huanju.chajianhuatest.aidlmode.TestBean _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getInfoBean, _data, _reply, 0);_reply.readException();if ((0 != _reply.readInt())) {_result = com.huanju.chajianhuatest.aidlmode.TestBean.CREATOR.createFromParcel(_reply);} else {_result = null;}if ((0 != _reply.readInt())) {b.readFromParcel(_reply);}} finally {_reply.recycle();_data.recycle();}return _result;}}static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);static final int TRANSACTION_getS = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);static final int TRANSACTION_getInfoBean = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);}public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException;public java.lang.String getS(com.huanju.chajianhuatest.aidlmode.TestBean s) throws android.os.RemoteException;public com.huanju.chajianhuatest.aidlmode.TestBean getInfoBean(com.huanju.chajianhuatest.aidlmode.TestBean b) throws android.os.RemoteException;
}

看着代码好像很多,但是其实没什么,我们分析一下结构

1.我们根据上面的代码,创建的类继承了IInterface接口

2.内部类Stub继承Binder

3.看asInterface方法,判断如果不是一个进程会返回代理类

4.每个方法都对应一个id,用于在跨进程访问时确定访问的是哪个方法,通过transact方法再调用服务端的onTransact方法

我们再看一下系统的类,就看我们最熟悉的ActivityManager,要知道ActivityManager其实是ActivityManagerService在我们进程中的一个代理包装类,他内部全部使用 ActivityManagerNative.getDefault()去进程操作,那么我么直接看 ActivityManagerNative的部分代码

1.asInterface

    /** {@hide} */
public abstract class ActivityManagerNative extends Binder implements IActivityManager
{/*** Cast a Binder object into an activity manager interface, generating* a proxy if needed.*/static public IActivityManager asInterface(IBinder obj) {if (obj == null) {return null;}IActivityManager in =(IActivityManager)obj.queryLocalInterface(descriptor);if (in != null) {return in;}return new ActivityManagerProxy(obj);}

2.onTransact

@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)throws RemoteException {switch (code) {case START_ACTIVITY_TRANSACTION:{data.enforceInterface(IActivityManager.descriptor);IBinder b = data.readStrongBinder();IApplicationThread app = ApplicationThreadNative.asInterface(b);String callingPackage = data.readString();Intent intent = Intent.CREATOR.createFromParcel(data);String resolvedType = data.readString();IBinder resultTo = data.readStrongBinder();String resultWho = data.readString();int requestCode = data.readInt();int startFlags = data.readInt();ProfilerInfo profilerInfo = data.readInt() != 0? ProfilerInfo.CREATOR.createFromParcel(data) : null;Bundle options = data.readInt() != 0? Bundle.CREATOR.createFromParcel(data) : null;int result = startActivity(app, callingPackage, intent, resolvedType,resultTo, resultWho, requestCode, startFlags, profilerInfo, options);reply.writeNoException();reply.writeInt(result);return true;}

代码太多我们就看这两个就好了,有没有感觉很熟悉,和我们自己写的aidl几乎没有区别,他虽然叫做ActivityManagerNative,其实他就是我们自己写的aidl里的内部类Stub。

下面我们分析一下aidl的运行过程

我们直接看如果是远程的话返回了代理对象,我们看代理对象的方法,这个方法就是aidl结果定义的方法,看他怎么实现的
>

 @Overridepublic com.huanju.chajianhuatest.aidlmode.TestBean getInfoBean(com.huanju.chajianhuatest.aidlmode.TestBean b) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();com.huanju.chajianhuatest.aidlmode.TestBean _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getInfoBean, _data, _reply, 0);_reply.readException();if ((0 != _reply.readInt())) {_result = com.huanju.chajianhuatest.aidlmode.TestBean.CREATOR.createFromParcel(_reply);} else {_result = null;}if ((0 != _reply.readInt())) {b.readFromParcel(_reply);}} finally {_reply.recycle();_data.recycle();}return _result;}}

客户端发起请求

  • 1.首先创建输出类型data
  • 2.创建接受类型reply
  • 3.创建需要的参数
  • 4.将参数写入data中
  • 5.发起远程调用,当前线程挂起调用mRemote.transact()方法,这个方法的实现在Binder中,他会调用服务端的onTransact方法,直到有返回结果
  • 6.从_result中取回返回结果_result

服务端接到请求会走到onTransact方法,这个方法运行在服务端的Binder线程池中,我们再看看怎么实现的

>

  case TRANSACTION_getInfoBean: {data.enforceInterface(DESCRIPTOR);com.huanju.chajianhuatest.aidlmode.TestBean _arg0;_arg0 = new com.huanju.chajianhuatest.aidlmode.TestBean();com.huanju.chajianhuatest.aidlmode.TestBean _result = this.getInfoBean(_arg0);reply.writeNoException();if ((_result != null)) {reply.writeInt(1);_result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);} else {reply.writeInt(0);}if ((_arg0 != null)) {reply.writeInt(1);_arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);} else {reply.writeInt(0);}return true;}
  • 1.通过id确定访问哪个方法
  • 2.然后从目标参数data取出需要的参数
  • 3.然后调用请求的相应方法
  • 4.将返回值写入reply
  • 5.返回true,这里需要说一下,如果返回false,代表客户端访问失败,我们实际当中可根据这个特性来做远程的校检,毕竟我们的远程方法并是不想让任何人都可以访问的。
    ,通过id确定访问哪个方法,然后从目标参数data取出需要的参数,然后调用相应方法,将返回值写入reply,

好了,到这里Binder的通信过程就完了,其实我们看到了只要我们理解了我们自己写的aidl的流程及原理,那么系统层的通信也是这样的。下一篇我们继续说代理模式及反射。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 微信公众号开发C#系列-1、微信公众平台注册

    微信公众号简介 微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以。 我们所说的微信公众号开发主要指的是公众号的账号类型,公众号的账号类型分为订阅号、服务号、企业微信、小程序四种。关于他们之间的具体区别,官方是这样解释…...

    2024/4/20 17:34:58
  2. tabhost ActivityGroup

    android tabhost位于底部http://www.2cto.com/kf/201109/103995.html 关于Tab与TabHost,如何设置其为垂直方向http://www.eoeandroid.com/thread-48264-1-1.htmlAndroid入门第十五篇之ActivityGroup + GridView 实现Tab分页标签 .http://blog.csdn.net/hellogv/article/detail…...

    2024/4/17 4:03:07
  3. ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)

    博文已迁移至我的博客园:https://www.cnblogs.com/sixuwuxian/p/12512275.html...

    2024/4/17 4:03:43
  4. 虎扑社区论坛数据爬虫分析报告

    原文:http://tecdat.cn/?p=4115以下是摘自虎扑的官方介绍:虎扑是为年轻男性服务的专业网站,涵盖篮球、足球、F1、NFL等赛事的原创新闻专栏视频报道,拥有大型的生活/影视/电竞/汽车/数码网上交流社区,聊体育谈兴趣尽在虎扑。二、数据说明使用的数据来源:2018/1/1~1/19 两…...

    2024/4/20 17:22:24
  5. 高效能人士的第三个习惯——要事第一

    右脑负责领导,左脑负责管理。 通过第二个习惯,我们树立了人生的使命,明确了人生的目标。第三个习惯则是具体的实现方法:要事第一。即本习惯是关于计划、做事的顺序的。要事是指对实现人生目标更有帮助的事情。 通过四象限法,将事情分为“重要紧急”、“重要不紧急”、“不…...

    2024/4/17 4:03:25
  6. MATLAB生成exe脱离matlab运行可执行程序

    如何将MATLAB程序编译成独立可执行的程序?如何将编译好的独立可执行程序发布在没有安装MATLAB的电脑上?下面将一步步实现:一、生成独立可执行的程序(exe文件)步骤1、安装编译器。可有多种选择,matlab自带了一个LCC,推荐使用VC++6.0,我基于VS2010实现。 2、设置编译器。…...

    2024/3/31 21:15:20
  7. IPC binder 机制历史

    前一段时间在研究和学习android的IPC binder通信机制,开始以为是Google研发的一个新的高效的IPC机制,后来通过研究发现,binder机制在android平台实现之前由Palm OS系统实现并贡献给我了开源社区。具体内容详见http://ask.chiusir.net/viewtopic.php?p=2629 。 里面有这么一…...

    2024/4/17 4:03:01
  8. Android入门第十五篇之ActivityGroup + GridView 实现Tab分页标签

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabActivity的组合,其实最常用的不是它们,而是由GridView与ActivityGroup的组合。每当用户在GridView选中一项…...

    2024/4/17 4:03:13
  9. 《高效能人士的七个习惯》读后

    1. 读罢此书的第一感觉:作者Stephen Covey是个勇敢而务实的人。他的勇敢之处在于他敢于承认、面对思维定势并打破之,务实之处在于他总结的自我管理方法是可行的、有说服力的。 2. 这不是一部励志的书,也不是一部成功学的书,因为它的题目不是“成功人士的七个习惯”。成功这…...

    2024/4/17 4:02:49
  10. GitHub仓库爬虫开发记录

    因为要做一个Demo,数据源GitHub上所有Star过20的项目。但是呢,GitHub唉!拥有千万数量级别仓库的大型基佬交友社区唉!符合条件的就有33万条记录唉!所以就想把这次开发经历记录一下。想做到的最终目标是10个爬虫并发爬取项目; 爬虫的代码就不发了,网上一搜一大把,使用pyt…...

    2024/4/17 4:03:13
  11. 微信公众号开发整理(三)--图片消息回复之【获取access_token】

    1.要实现图片消息的回复,我们需要获取access_token,具体原因不累赘叙述,参考官网资料2.为了方便我们后面调用相关方法,我们采用httpClient来实现,先完成2个工具方法,doGet及doPost方法,这里新建一个类WenXinUntil,由上图可以看出访问get方法需要传递grant_type、appid、…...

    2024/4/17 4:04:13
  12. [程序员的业余生活]一周读完《高效能人士的七个习惯》Day1:这是不是一碗鸡汤?...

    提出问题今天突然想聊聊最近对职场的一些感悟。这段时间,小端一直在思考一个问题:作为一个程序员,怎么才能成为团队的核心?还记得刚入职场那几年,小端一直觉得,技术过硬,经验丰富,敢打敢拼,就是答案。并且也一直践行着这个认知,不断的学习新技术,巩固老知识。可是多…...

    2024/4/17 4:04:07
  13. LabVIEW与Matlab交互

    为了实现在LabVIEW中控制、获取USB webcam的图像,在网上查找了一下相关资料。NI公司说由于数据传输格式的问题,LabVIEW无法对USB webcam提供直接支持,并指出要用USB webcam可以下载一些免费的可以访问USB webcam的dll,再由LabVIEW调用dll的函数,以此来实现对USB webcam的支…...

    2024/4/17 4:04:25
  14. activitygroup嵌套activitygroup时dialog显示问题

    在activity里显示对话框,基本代码如下:AlertDialog.Builder builder = new AlertDialog.Builder(self);builder.setMessage(msg).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dial…...

    2024/4/4 22:22:14
  15. 如何用Matlab把excel表格中的数据导入Matlab中并绘制出图?

    如何用Matlab把excel表格中的数据导入Matlab中并绘制出图?1.将excel中的数据导入Matlab中,点击“导入数据”2.弹出“Import”窗口,在窗口工具栏左侧导入选项中选择“Matrix(矩阵)”,然后点击工具栏右侧的“勾”,导入数据。3.关闭“Import”窗口,回到MATLAB主程序,在Wo…...

    2024/4/17 4:05:07
  16. 微信公众号开发总结

    本次微信公众号的开发是,依托AA公众号的一个配置入口,然后做一个BB的功能开发,其中涉及到跨项目的用户信息认证,支付,移动端的适配,https协议升级等问题跨域cookie认证背景:辅导服务号的前端域名:https://testfudao-wechat.AAA.com 好分数服务号前端域名:https://hfs-…...

    2024/4/17 8:34:08
  17. 初识Android进程间通信Binder机制

    先大概描述下Android中S/C架构的基本面貌 由于采用linux内核,所以用户空间中得进程地址空间都是独立的,如果用户空间进程AB之间想进行通信,可以先将用户空间进程A要发送信息发送到内核,由于内核中得地址空间对于每个进程都是一样的,所以用户空间进程B可以读取内核收到的信息…...

    2024/4/17 4:03:43
  18. 高效能人士的7个习惯读书笔记

    第一章 认识自己 针对我们是怎么样的一种人而认清自己.有人总是以为能够日天日地无所不能,有人总是觉得自己一无是处悲天悯人,有人觉得自己资质平庸平凡一生,这些人的根源就是在于不能够认清自己;我自己一开始在没有读这本书之前我觉得我能知晓很多道理,可是偏偏做不到,其实我相…...

    2024/4/20 2:51:09
  19. 2019最新零基础21天搞定Python分布式爬虫(分布式网络爬虫入门进阶项目实战)

    课程简介:适用人群1、有Python基础,想学习爬虫的。2、想系统学习网络爬虫的。3、想学习分布式爬虫的。课程概述本课程完全从零基础出发,只要你有一点Python基础就可以听懂本课程!课程从基础到高级,让你21天破茧成蝶成为高级爬虫工程师!下载地址:百度网盘课程目录:第一部…...

    2024/4/20 1:55:52
  20. 听说你Binder机制学的不错,来面试下这几个问题(一)

    https://www.jianshu.com/p/adaa1a39a274 有图有真相...

    2024/4/17 4:03:55

最新文章

  1. 【NC16619】传球游戏

    题目 传球游戏 动态规划 思路 这道题主要考察对状态转移的理解。说实话,动态规划问题只要想到了就简单,想不到就很难,除了像背包问题那一类有固定套路的题以外,其实大部分的动态规划问题都没什么所谓的公式。还是得多练&#xf…...

    2024/4/26 12:17:08
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?

    问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null,那么typeof nullValue "?" const u …...

    2024/4/25 5:18:48
  4. 如何转行成为产品经理?

    转行NPDP也是很合适的一条发展路径,之后从事新产品开发相关工作~ 一、什么是NPDP? NPDP 是产品经理国际资格认证,美国产品开发与管理协会(PDMA)发起的,是目前国际公认的唯一的新产品开发专业认证&#xff…...

    2024/4/22 16:14:13
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/25 13:39:44
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57