Rk3588 Android12 AIDL 开发

news2024/9/22 10:03:47

AIDL (Android Interface Definition Language)HIDL (HAL Interface Definition Language) 都是 Android 系统中用于定义接口的工具,但它们有不同的用途和特性。

AIDL (Android Interface Definition Language)

  1. 用途

    • 主要用于应用程序之间的进程间通信 (IPC)。
    • 适用于定义应用程序组件(如 Activity 和 Service)之间的接口。

HIDL (HAL Interface Definition Language)

  1. 用途

    • 主要用于定义硬件抽象层 (HAL) 接口。
    • 适用于访问底层硬件功能,如摄像头、传感器等。

未来趋势

从 Android 13 开始,HIDL 已被弃用,建议使用 AIDL 来实现 HAL 接口⁴。这意味着未来的 Android 版本将更多地依赖 AIDL 来实现硬件抽象层的接口。

本文主要记录自己实现一个AIDL的过程

主要的架构逻辑

1.使能hidl-gen工具

source build/envsetup.sh
lunch rk3588_s-userdebug
make hidl-gen

2.建立自己的AIDL ,test目录 和ITest.hal,ITestWarpper.hal

1.mkdir vendor/rockchip/hardware/interfaces/test
2.mkdir vendor/rockchip/hardware/interfaces/test/1.0

3.新建ITest.hal文件
//vendor/rockchip/hardware/interfaces/test/1.0/ITest.hal
package rockchip.hardware.test@1.0;
import ITestWarpper;

interface ITest
{
        setTestWarpper(ITestWarpper testWarpper);

        GetString()generates (string printString);
};

4.新建ITestWarpper.hal文件 用于数据传递
//vendor/rockchip/hardware/interfaces/test/1.0/ITestWarpper.hal
package rockchip.hardware.test@1.0;
interface ITestWarpper
{
        GetString()generates (string printString);
};

生成编译文件vendor/rockchip/hardware/interfaces/test/1.0/Android.bp  

 do_makefiles_update rockchip.hardware:vendor/rockchip/hardware android.hardware:hardware/interfaces android.hidl:system/libhidl/transport

AIDL 的没有返回值都是VOID ,出参都是 generates (string printString);实现,类似C++的别名功能

生成对应的CPP和头文件

1.hidl-gen -o vendor/rockchip/hardware/test/1.0/defualt -Lc++-impl -rrockchip.hardware:vendor/rockchip/hardware -randroid.hidl:system/libhidl/transport rockchip.hardware  //生成C++ 和 H

2.hidl-gen -o vendor/rockchip/hardware/test/1.0/defualt -Landroidbp-impl -rrockchip.hardware:vendor/rockchip/hardware/ -randroid.hidl:system/libhidl/transport rockchip.hardware  //生成Android.dp

在defult 目录下生成对应的cpp文件和头文件,Android.bp

也可以使用我写的脚本生成对应的文件
./generate-source2.sh vendor/rockchip/hardware/interfaces/ test rockchip.hardware 

#! /bin/bash
# v1.0

if [ -z $1 ]; then
    echo "Please input path "
    exit 1
else
    LOC=$1
fi

if [ -z $2 ]; then
    echo "Please input module name"
    exit 1
else
    MODULE=$2
fi

if [ -z $3 ]; then
    echo "Please input package head"
    exit 1
else
    PACKAGE_HEAD=$3
fi


PACKAGE=$PACKAGE_HEAD.$MODULE@1.0
echo "You package is: $PACKAGE"

hidl-gen -o $LOC/$MODULE/1.0/defualt -Lc++-impl -r$PACKAGE_HEAD:$LOC \
            -randroid.hidl:system/libhidl/transport $PACKAGE
hidl-gen -o $LOC/$MODULE/1.0/defualt -Landroidbp-impl -r$PACKAGE_HEAD:$LOC \
            -randroid.hidl:system/libhidl/transport $PACKAGE

修改Test.cpp Test.h

// FIXME: your file license if you have one

#include "Test.h"
#include "log/log.h"
#define LOG_TAG "test1.0"
namespace rockchip::hardware::test::implementation {
sp<::rockchip::hardware::test::V1_0::ITestWarpper> mTestWarpper = nullptr;
hidl_string mDeviceId;
// Methods from ::rockchip::hardware::test::V1_0::ITest follow.
Return<void> Test::setTestWarpper(const sp<::rockchip::hardware::test::V1_0::ITestWarpper>& testWarpper) {
    // TODO implement
    mTestWarpper = testWarpper;
    return Void();
}

Test::Test(){
    ALOGD("@%s.",__FUNCTION__);
}
Test::~Test(){
    ALOGD("@%s",__FUNCTION__);
}
V1_0::ITest* HIDL_FETCH_ITest(const char* /* name */) {
    ALOGD("@%s",__FUNCTION__);
    return new Test();
}
// [&](const ::android::hardware::hidl_string &id
Return<void> Test::GetString(GetString_cb _hidl_cb) {
    ALOGD("@%s,mDeviceId:%s",__FUNCTION__,mDeviceId.c_str());
    // TODO implement
    if(mTestWarpper!=nullptr){
        mTestWarpper->GetString([&](const ::android::hardware::hidl_string &id){
            ALOGD("@%s,GetString mDeviceId:%s",__FUNCTION__,id.c_str());
            _hidl_cb(id);
        });

    }
    return Void();
}


// Methods from ::android::hidl::base::V1_0::IBase follow.

//ITest* HIDL_FETCH_ITest(const char* /* name */) {
    //return new Test();
//}
//
}  // namespace rockchip::hardware::test::implementation
// FIXME: your file license if you have one

#pragma once

#include <rockchip/hardware/test/1.0/ITest.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>

namespace rockchip::hardware::test::implementation {

using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;

struct Test : public V1_0::ITest {
    // Methods from ::rockchip::hardware::test::V1_0::ITest follow.
    Return<void> setTestWarpper(const sp<::rockchip::hardware::test::V1_0::ITestWarpper>& testWarpper) override;
    Return<void> GetString(GetString_cb _hidl_cb) override;
    Test();
    ~Test();
    // Methods from ::android::hidl::base::V1_0::IBase follow.

};

// FIXME: most likely delete, this is only for passthrough implementations
extern "C" V1_0::ITest* HIDL_FETCH_ITest(const char* name);

}  // namespace rockchip::hardware::test::implementation

添加一个开机服务 test/1.0/defualt下添加rc 和 xml文件和service.cpp

vendor/rockchip/hardware/interfaces/test/1.0/defualt/rockchip.hardware.test@1.0-service.rc
service test_server /vendor/bin/hw/rockchip.hardware.test@1.0-service
    class hal
    user system
    group system


vendor/rockchip/hardware/interfaces/test/1.0/defualt/rockchip.hardware.test@1.0-service.xml
<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>rockchip.hardware.test</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
        <name>ITest</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>

vendor/rockchip/hardware/interfaces/test/1.0/defualt/service.cpp
#define LOG_TAG "rockchip.hardware.test@1.0-service"

#include <rockchip/hardware/test/1.0/ITest.h>
#include <hidl/LegacySupport.h>
#include <binder/ProcessState.h>

using rockchip::hardware::test::V1_0::ITest;
using android::hardware::defaultPassthroughServiceImplementation;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::sp;

int main() {
    android::ProcessState::initWithDriver("/dev/vndbinder");
    return defaultPassthroughServiceImplementation<ITest>("default", /*maxThreads*/ 6);
}

修改test/1.0/defualt/Android.dp

// FIXME: your file license if you have one
//生成一个AIDL so
cc_library_shared {
    // FIXME: this should only be -impl for a passthrough hal.
    // In most cases, to convert this to a binderized implementation, you should:
    // - change '-impl' to '-service' here and make it a cc_binary instead of a
    //   cc_library_shared.
    // - add a *.rc file for this module.
    // - delete HIDL_FETCH_I* functions.
    // - call configureRpcThreadpool and registerAsService on the instance.
    // You may also want to append '-impl/-service' with a specific identifier like
    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
    name: "rockchip.hardware.test@1.0-impl",
    relative_install_path: "hw",
    // FIXME: this should be 'vendor: true' for modules that will eventually be
    // on AOSP.
    proprietary: true,
    srcs: [
        "Test.cpp",
        "TestWarpper.cpp",
    ],
    shared_libs: [
        "libhidlbase",
        "libutils",
        "liblog",
        "rockchip.hardware.test@1.0",
    ],
}
//生成一个服务进程

cc_binary {
    name: "rockchip.hardware.test@1.0-service",
    init_rc: ["rockchip.hardware.test@1.0-service.rc"],
    vintf_fragments: ["rockchip.hardware.test@1.0-service.xml"],
    defaults: ["hidl_defaults"],
    proprietary: true,
    relative_install_path: "hw",
        srcs: ["service.cpp",
    ],
    cflags: ["-Werror", "-Wno-unused-parameter"],
    shared_libs: [
        "liblog",
        "libhardware",
        "libhidlbase",
        "libutils",
        "libcutils",
        "rockchip.hardware.test@1.0",
        "libbinder",
        "libhidlmemory",
    ],
}
device 下根据自己的代码加入编译
PRODUCT_PACKAGES += \   
    rockchip.hardware.test@1.0-service \
    rockchip.hardware.test@1.0-impl

到这里我们的AIDL添加结束

二.修改系统te,不然服务跑不起来

添加文件device\rockchip\common\manifests\frameworks\rockchip.hardware.test@1.0-service.xml
<compatibility-matrix version="1.0" type="framework">
    <hal format="hidl" optional="true">
        <name>rockchip.hardware.test</name>
        <version>1.0</version>
        <interface>
            <name>ITest</name>
            <instance>default</instance>
        </interface>
    </hal>
</compatibility-matrix>

添加文件device\rockchip\common\sepolicy\vendor\hal_test.te
type hal_test_default, domain;
type hal_test_default_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(hal_test_default)

allow hal_test_default device:dir { read open};
allow hal_test_default camera_device:chr_file{ read  write open ioctl };
allow hal_test_default vndbinder_device:chr_file { read write open ioctl map};
allow hal_test_default hidl_base_hwservice:hwservice_manager add;
allow hal_test_default hal_test_hwservice:hwservice_manager {add find};
allow system_app hal_test_hwservice:hwservice_manager { find };
binder_call(system_app, hal_test_default)
binder_call(hal_test_default, system_app)
#binder_call(hal_test_default, platform_app)
binder_call(hal_test_default, hwservicemanager)
#binder_call(hal_test_default, hal_camera_default)
# Client
#allow cameraserver hal_test_hwservice:hwservice_manager { find };
#allow hal_camera_default hal_test_hwservice:hwservice_manager { find };
get_prop(hal_test_default, hwservicemanager_prop)


修改device\rockchip\common\sepolicy\vendor\hwservice_contexts
rockchip.hardware.tv.input::ITvInput                   u:object_r:hal_tv_input_hwservice:s0
+ rockchip.hardware.test::ITest                  u:object_r:hal_test_hwservice:s0

修改device\rockchip\common\sepolicy\vendor\hwservice.te
+type hal_test_hwservice, hwservice_manager_type;

三。写一个测试demo

添加cpp和h 生成一个so 

//添加packages/apps/libtest_bridge/data_bridge.h
// #include <jni.h>
#include <functional>
#include <string>
#include <time.h>

void init();
void deinit();

//添加packages/apps/libtest_bridge/data_bridge.cpp
#define APK_VERSION	"V1.3"
#define LOG_TAG "test_bridge"
//#define LOG_NDEBUG 0

#include <utils/Log.h>
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <utils/Log.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <linux/v4l2-subdev.h>

#include "data_bridge.h"

#include <ui/Fence.h>
#include <ui/GraphicBufferMapper.h>
#include <ui/GraphicBuffer.h>
#include <ui/Rect.h>

#include <utils/Singleton.h>

#define VIRTUAL_CAMERA
#define RGA_PROC 


#include <android/hardware_buffer_jni.h>
#include <vndk/hardware_buffer.h>

#include <condition_variable>


#ifdef RGA_PROC
#include <RockchipRga.h>
#include <im2d_api/im2d.h>
#include "im2d_api/im2d.hpp"
#include "im2d_api/im2d_common.h"
#endif

#define LOGE(msg,...)   ALOGE("%s(%d): " msg ,__FUNCTION__,__LINE__,##__VA_ARGS__)
#define LOGD(msg,...)   ALOGD("%s(%d): " msg ,__FUNCTION__,__LINE__,##__VA_ARGS__)
#define LOGV(msg,...)   ALOGV("%s(%d): " msg ,__FUNCTION__,__LINE__,##__VA_ARGS__)


using namespace std;
using namespace android;
#include <rockchip/hardware/test/1.0/ITest.h>
class FrameWarpperImp :public rockchip::hardware::test::V1_0::ITestWarpper{
    public:
    android::hardware::Return<void> GetString(GetString_cb _hidl_cb) {
    // TODO implement
        ::android::hardware::hidl_string deviceId = "hellow world";
        _hidl_cb(deviceId);
        return android::hardware::Void();
    }

    ~FrameWarpperImp(){
        ALOGD("%s",__FUNCTION__);
    }
    FrameWarpperImp(){
        ALOGD("%s",__FUNCTION__);
    }
};
FrameWarpperImp *frameWarpperImp;
void init()
{
    ::android::hardware::hidl_string testId;
    ALOGD("%s",__FUNCTION__);
    android::sp<rockchip::hardware::test::V1_0::ITest> client = rockchip::hardware::test::V1_0::ITest::getService();
    if(client.get()!= nullptr){        
        if (frameWarpperImp != nullptr)
        {
            client->setTestWarpper(nullptr);
            frameWarpperImp = nullptr;
        }        
        frameWarpperImp = new FrameWarpperImp();
        ALOGD("setFrameDecorator");
        client->setTestWarpper(frameWarpperImp);
        client->GetString([&](const ::android::hardware::hidl_string &id){
            testId = id;
            ALOGD("setFrameDecorator%s",testId.c_str());
        });
    }
}
void deinit(){
    ALOGD("%s",__FUNCTION__);
    android::sp<rockchip::hardware::test::V1_0::ITest> client = rockchip::hardware::test::V1_0::ITest::getService();
    ALOGE("client.get():%p",client.get());
    if(client.get()!= nullptr){
        ALOGD("setFrameDecorator nullptr");
        client->setTestWarpper(nullptr);
        //delete frameWarpperImp ;
        frameWarpperImp = nullptr;
    }
}

packages/apps/libtest_bridge/Android.bp

//生成一个libtest_bridge.so
cc_library_shared {
    name: "libtest_bridge",
    srcs: ["data_bridge.cpp"],
    header_libs: [
        "jni_headers",
    ],
    include_dirs: [
        "hardware/rockchip/librga",
    ],
    shared_libs: [
        "libbase",
        "libandroid",
        "liblog",
        "libutils",
        "libcutils",
        "libnativehelper",
        "libhidlbase",
        "libui",
        "librga",
//rga_proc        "librga",
        "rockchip.hardware.test@1.0",
    ],
    cflags: [
        "-Wall",
        "-Wno-error",
        "-Wextra",
        "-Wno-unused-parameter",
    ],
    sanitize: {
        scs: true,
    },
}
ndk_library {
    name: "libtest_bridge",
    symbol_file: "libtest_bridge.map.txt",
    first_version: "30",
}
prebuilt_etc {
    name: "public.libtest_bridge",
    src: "public.libtest_bridge.txt",
    filename_from_src: true,
}

//生成一个可执行文件test1.0_service
cc_binary {
    name: "test1.0_service",

    proprietary: true,
    relative_install_path: "hw",
        srcs: ["service.cpp",
    ],
    defaults: ["hidl_defaults"],
    vendor: true,
    sdk_version: "current",
    cflags: [
        "-Wall",
        "-Wno-error",
        "-Wextra",
        "-Wno-unused-parameter",
    ],
    shared_libs: [
        "liblog",
        "libtest_bridge",
    ],
}

添加文件packages\apps\libtest_bridge\libtest_bridge.map.txt
LIBDATA_BRIDGE {
  global:
    init;
  local:
    *;
};

添加文件packages\apps\libtest_bridge\public.libtest_bridge.txt
libtest_bridge.so nopreload

添加文件packages\apps\libtest_bridge\service.cpp
#define LOG_TAG "rockchip.hardware.test@1.0-service"
#include "data_bridge.h"


int main() {
    init();
}

编译完成后将系统的test1.0_service 推到 data/loal/tmp

执行./test1.0_service 

09-05 07:08:06.633  2892  2892 D data_bridge: init
09-05 07:08:06.634  2892  2892 D data_bridge: FrameWarpperImp
09-05 07:08:06.634  2892  2892 D data_bridge: setFrameDecorator
09-05 07:08:06.635   454   454 D test1.0 : @GetString,mDeviceId:
09-05 07:08:06.635   454   454 D test1.0 : @operator(),GetString mDeviceId:
09-05 07:08:06.636  2892  2892 D data_bridge: setFrameDecoratorhellow world

本文章只做自己学习记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的智能物流仓库管理系统-源代码-论文

&#x1f4a5;&#x1f4a5;源码和论文下载&#x1f4a5;&#x1f4a5;&#xff1a;基于SpringBoot的智能物流仓库管理系统-源代码-论文-数据库 1. 系统介绍 物流快递仓库管理是一项非常繁琐复杂的工作&#xff0c;每天要处理大量的单据数据&#xff0c;包括入库、出库、退库、…

Web:攻防世界unseping

目录 一、初见 二、解题步骤 一、初见 刚拿到这个题目&#xff0c;可以发现是一串PHP代码&#xff0c;关注到unserialize(base64_decode($ctf))函数&#xff0c;就知道是考php反序列化。 审计PHP类ease&#xff1a; __construct($method, $args) &#xff1a;构造器需要传入两…

k8s中的层级结构,及节点组件的作用

可以从三个层面来看待k8s集群 第一个层 是client主机 为什么要有client主机 不是在控制节点上管理计算节点吗 是的 但是&#xff0c;当有多个k8s集群需要管理的时候 一般不会每管理一个集群&#xff0c;就登录到那个集群的控制节点上 这样来来回回切换登录 client主机…

电路分析 ---- 加法器

1 同相加法器 分析过程 虚短&#xff1a; u u − R G R G R F u O u_{}u_{-}\cfrac{R_{G}}{R_{G}R_{F}}u_{O} u​u−​RG​RF​RG​​uO​ i 1 u I 1 − u R 1 i_{1}\cfrac{u_{I1}-u_{}}{R_{1}} i1​R1​uI1​−u​​&#xff1b; i 2 u I 2 − u R 2 i_{2}\cfrac{u_{…

同时播放多个视频

介绍一款小众的视频播放器&#xff0c;之前有小伙伴找那种可以同时播放多个视频的软件&#xff0c;“恒硕加播放”可以做到这一点&#xff0c;功能不是太多&#xff0c;但是日常播放是足够了。 同时播放多个视频控制多个视频跳到指定进度同时暂停/播放/停止/静音/倍速浏览系统…

金属3D打印与压铸模具的融合:创新引领制造新纪元

步入工业4.0的新纪元&#xff0c;3D打印技术犹如一股强劲的东风&#xff0c;为制造业的转型升级插上了智慧的翅膀。作为铸造领域的核心&#xff0c;压铸模具在工业领域扮演着不可或缺的角色&#xff0c;其重要性不言而喻。然而&#xff0c;面对日益多样化的压铸件需求&#xff…

力扣最热一百题——和为K的子数组

目录 题目链接&#xff1a;560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;暴力枚举 Java写法&#xff1a; C写法&#xff1a; 解法二&#xff1a;前缀和哈希表 计算子数组和 如何优化问题 代码解…

混合部署 | 在RK3568上同时部署RT-Thread和Linux系统-迅为电子

RT-Thread 是一个高安全性、实时性的操作系统&#xff0c;广泛应用于任务关键领域&#xff0c;例如电力、轨道交通、车载系统、工业控制和新能源等。它的加入让 RK3568 能够在保证系统实时性和安全性的同时&#xff0c;灵活处理复杂的任务场景。 在一般情况下&#xff0c;iTOP-…

AI聊天应用不能上架?Google play对AI类型应用的规则要求是什么?

随着生成式AI模型的广泛应用&#xff0c;很多开发者都有在开发AI应用或将其整合到应用中。我们知道&#xff0c;谷歌是非常注重应用生态的&#xff0c;去年开始就推出了一些针对生成式AI应用的政策&#xff0c;对AI应用的内容质量和合规性问题提出了一些要求。 几天前&#xff…

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并导出数据集. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename : Test.hdict” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev 但发现很慢&#xff0c;没有mlp…

STM32快速复习(九)RTC时钟模块

文章目录 前言一、RTC是什么&#xff1f;RTC的工作原理&#xff1f;二、库函数以及示例1.标准库函数2.示例代码 总结 前言 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xf…

ARM----时钟

时钟频率可以是由晶振提供的,我们需要高频率,但是外部接高的晶振会不稳定,所有使用PLL(锁相环)来放大频率。接下来就让我们学习用外部晶振提供的频率来配置时钟频率。 一.时钟源的选择 在这里我们选择外部晶振作为时钟源,通过查看芯片手册和原理图来看我们的时钟源。 这是…

2024高教社杯全国大学生数学建模竞赛C题解析 | 思路 代码 论文

C题 农作物种植策略 完整论文模型的建立与求解数据清洗问题一的建模与求解问题二的建模与求解问题三的建模与求解 代码第一问 完整论文 本题是一个运筹优化问题。 对于第一问&#xff0c;题目要求在假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于2023年保…

信号的捕捉处理

文章目录 4 信号的捕捉处理4.1 内核如何实现信号的捕捉4.2 sigaction4.2.1 使用这个函数对2号信号进行捕捉4.2.2 pending位图什么时候由1变04.2.3 不允许信号重复发送 5. 其他5.1 可重入函数5.2 volatile5.3 SIGCHLD信号5.4 信号生命周期 4 信号的捕捉处理 4.1 内核如何实现信…

鸿蒙(API 12 Beta6版)图形加速【Vulkan平台】超帧功能开发

业务流程 基于Vulkan图形API平台&#xff0c;集成超帧内插模式的主要业务流程如下&#xff1a; 用户进入超帧适用的游戏场景。游戏应用调用[HMS_FG_CreateContext_VK]接口创建超帧上下文实例。游戏应用调用接口配置超帧实例属性。包括调用[HMS_FG_SetAlgorithmMode_VK]&#x…

第T11周:使用TensorFlow进行优化器对比实验

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、导入数据1、导入数据2、检查数据3、配置数据集4、数据可视化 三、…

淘宝和微信支付“好”上了,打翻了支付宝的“醋坛子”?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 最近&#xff0c;淘宝将全面接入微信支付的消息&#xff0c;在整个互联网圈里炸开了锅。 虽说阿里系平台与腾讯之间“拆墙”的消息&#xff0c;早就不算是啥新鲜事了。而且进一步互联互通&#xff0c;无论是对广大用户&…

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 43. 1 &#xff5e; n 整数中 1 …

(postman)接口测试进阶实战

1.内置和自定义的动态参数 内置的动态参数有哪些&#xff1f; ---{{$}}--是内置动态参数的标志 //自定义的动态参数 此处date.now()的作用就相当于上面的timestamp 2.业务闭环及文件接口测试 返回的url地址可以在网页中查询得到。 3. 常规断言&#xff0c;动态参数断言&#xf…

Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

目录 1、冯诺伊曼体系结构 问题一&#xff1a;为什么在体系结构中存在存储器&#xff08;内存&#xff09;&#xff1f; 存储单元总结&#xff1a; 问题二&#xff1a;为什么程序在运行的时候&#xff0c;必须把程序先加载到内存&#xff1f; 问题三&#xff1a;请解释&am…