当前位置: 首页 > news >正文

怎么做兼职类网站吗深圳网站建设培训哪家好

怎么做兼职类网站吗,深圳网站建设培训哪家好,个人做网站有什么坏处,建设环保网站查询系统1 概述 最近正好在做关机充电这个,就详细看看吧。还是本着保密的原则,项目里的代码也不能直接用,这里就用的Github的。https://github.com/aosp-mirror 具体位置是:https://github.com/aosp-mirror/platform_system_core/tree/mai…

1 概述

最近正好在做关机充电这个,就详细看看吧。还是本着保密的原则,项目里的代码也不能直接用,这里就用的Github的。https://github.com/aosp-mirror

具体位置是:https://github.com/aosp-mirror/platform_system_core/tree/main/healthd

核心代码压缩包只有3M,比起AOSP整包的极度臃肿真是对比强烈。 

2 代码框架

首先还是看BP,编译的产物是charger,但是在新版AOSP中服务却不是这个名字。新的是android.hardware.health-service.qti,此外后面带一个--charger的参数。

cc_binary {name: "charger",defaults: ["charger_defaults"],recovery_available: true,srcs: ["charger.cpp","charger_utils.cpp",],shared_libs: ["android.hardware.health@2.0","android.hardware.health@2.1",],target: {recovery: {// No UI and libsuspend for recovery charger.cflags: ["-DCHARGER_FORCE_NO_UI=1",],exclude_shared_libs: ["libpng",],exclude_static_libs: ["libhealthd_draw","libhealthd_charger","libhealthd_charger_ui","libminui","libsuspend",],}}
}

 模块里面有个测试程序,可以看看整个模块的用法。

int main(int /*argc*/, char** /*argv*/) {const char* dumpFile = "/data/local/tmp/dump.txt";auto config = std::make_unique<healthd_config>();InitHealthdConfig(config.get());healthd_board_init(config.get());sp<IHealth> passthrough = new TestHealth(std::move(config));std::thread bgThread([=] {android::ChargerHidl charger(passthrough);charger.StartLoop();});// wait for healthd_init to finishif (!getUpdateNotifier().waitFor(1000 /* wait ms */, true /* updated */)) {LOG_THIS("Time out.");exit(1);}passthrough->debug(createHidlHandle(dumpFile), {} /* options */);std::string content = openToString(dumpFile);int status = expectContains(content, {"status: 4","health: 6","present: 1","level: 47","voltage: 45","temp: 987","current now: 99000","current avg: 98000","charge counter: 600","current now: 99","cycle count: 77","Full charge: 3515547"});if (status == 0) {LOG_THIS("Test success.");} else {LOG_THIS("Actual dump:\n%s", content.c_str());}exit(status);  // force bgThread to exit
}

可以看到,就是

android::ChargerHidl charger(passthrough);

charger.StartLoop();

在Android的HIDL(HAL Interface Definition Language)框架中,StartLoop是一个用于启动HIDL服务端线程循环的方法。它允许HIDL服务端在一个独立的线程中运行,以便可以接收和处理来自客户端的请求。具体来说,StartLoop方法会创建一个线程池,并在这个线程池中运行,使得服务端可以异步处理多个客户端请求

3 重点流程

整个其实是一个提供Hidl接口的服务。提供的接口如下:

AIDL implementationHIDL implementation
Health::getChargeCounterUahHealth::getChargeCounter
Health::getCurrentNowMicroampsHealth::getCurrentNow
Health::getCurrentAverageMicroampsHealth::getCurrentAverage
Health::getCapacityHealth::getCapacity
Health::getChargeStatusHealth::getChargeStatus
Health::getEnergyCounterNwhHealth::getEnergyCounter
Health::getDiskStatsHealth::getDiskStats
Health::getStorageInfoHealth::getStorageInfo
Health::BinderEventBinderHealth::BinderEvent
Health::dumpHealth::debug
Health::ShouldKeepScreenOnHealth::shouldKeepScreenOn
Health::UpdateHealthInfoHealth::UpdateHealthInfo

类的定义如下:

namespace android {// An implementation of Charger backed by HIDL implementation. Uses HIDL health
// HAL's HalHealthLoop.
class ChargerHidl : public ::android::ChargerConfigurationInterface,public ::android::hardware::health::V2_1::implementation::HalHealthLoop {using HalHealthLoop = ::android::hardware::health::V2_1::implementation::HalHealthLoop;using HealthInfo_2_1 = android::hardware::health::V2_1::HealthInfo;public:explicit ChargerHidl(const sp<android::hardware::health::V2_1::IHealth>& service);std::optional<bool> ChargerShouldKeepScreenOn() override;bool ChargerIsOnline() override { return HalHealthLoop::charger_online(); }void ChargerInitConfig(healthd_config* config) override { return HalHealthLoop::Init(config); }int ChargerRegisterEvent(int fd, BoundFunction func, EventWakeup wakeup) override {return HalHealthLoop::RegisterEvent(fd, func, wakeup);}bool ChargerEnableSuspend() override;// HealthLoop overridesvoid Heartbeat() override { charger_->OnHeartbeat(); }int PrepareToWait() override { return charger_->OnPrepareToWait(); }void Init(struct healthd_config* config) override { charger_->OnInit(config); }// HalHealthLoop overridesvoid OnHealthInfoChanged(const HealthInfo_2_1& health_info) override;private:sp<android::hardware::health::V2_1::IHealth> service_;std::unique_ptr<Charger> charger_;
};

这里面有个私有变量是std::unique_ptr<Charger> charger_;,在init的时候会同时初始化charger类。ChargerHidl类很多实现还是直接调用的Charger类方法。主要的定义还是在Charger类中。

这部分主要的功能也是在Charger::OnInit里面启动的。这里有一个epoll。之前写过这部分,可以参考:小试epoll-CSDN博客

不过charger好像不是epoll,里面有一个Charger::OnHeartbeat(),在每次的心跳中处理状态和事件。包括插拔充电器和按下电源键。

大概就是这些吧,只是粗略的过了一遍,看的也不是太仔细。。。

4 题外话

对了, 从代码中可以看出,对于C++的高级应用还是很熟的。这点挺厉害的。

template <typename T>
class Atomic {public:Atomic(T&& init) : mValue(std::move(init)) {}void set(T&& newVal) {{std::lock_guard<std::mutex> lock(mMutex);mValue = std::move(newVal);}mChanged.notify_all();}bool waitFor(long ms, const T& expectVal) {std::unique_lock<std::mutex> lock(mMutex);return mChanged.wait_for(lock, std::chrono::milliseconds(ms),[this, &expectVal] { return mValue == expectVal; });}private:std::mutex mMutex;std::condition_variable mChanged;T mValue;
};Atomic<bool>& getUpdateNotifier() {static Atomic<bool> val(false);return val;
}

5 参考

https://source.android.com/docs/core/perf/health?hl=zh-cn

http://www.yayakq.cn/news/836331/

相关文章:

  • 网站icp备案条件做ps兼职的网站
  • 做这种灰色的网站犯法怎么用VS2012建设网站
  • 女同性做的视频网站wordpress 菜单管理系统
  • 保险网站建设的总体目标做图网站地图
  • 建设类似衣联网的网站工程建设项目包括哪些项目
  • 乌克兰网站后缀网站开发公司挣钱吗
  • 为什么亿唐网不做网站做品牌长沙营销型网站设计
  • 南通网站开发公司新增接入 新增网站
  • 卖书网站开发的背景开发楼盘需要多少钱
  • 做网页链接网站网络销售怎么干
  • 临清网站开发wordpress 解析
  • jsp网站建设技术案例网页制作报价模板
  • 苏宁易购电子商务网站建设目标wordpress4.8中文版
  • 浙江昆仑建设集团网站百度搜索排名规则
  • 公司网站建设制度买东西最便宜的软件
  • 温州哪里可以做企业网站贵阳网站建设方案书
  • 团队合作网站iis wordpress 伪静态规则
  • 建网站买的是什么企业信息化平台建设方案
  • 招远网站设计公司网站购买主机
  • 网站广告费一般多少钱成全看免费观看
  • 淘宝客做软件网站app政务网站安全建设工作计划
  • 洛阳数码大厦做网站的在几楼做网站在哪里接活
  • 商城版免费网站西湖网站建设
  • word超链接网站怎么做网页制作可以用手机吗
  • 湘潭市网站建设网站访问工具
  • 深圳汇网网站建设网站点击量 哪里查询
  • 外包做网站大概多少钱小规模企业所得税怎么算
  • 网站建设建站在线建站厦门哪里有建设网站的
  • 网站建设制作ppt想给学校社团做网站
  • 郫县专业的网站建设马克互联网主题 wordpress