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

带购物车的网站模板网站建设预算描述

带购物车的网站模板,网站建设预算描述,微信公众号网站开发,门户网站流量文章目录 关注 ServiceMager 原因ServerManager需要掌握的知识资料参考ServiceManager 进程启动启动脚本涉及到的相关源码文件源码跟踪ServiceManager脚本启动位置ServiceManager关联脚本 Native层源码分析main.cpp流程打开驱动 initWithDriverinitmakeProcessState 构造方法op… 文章目录 关注 ServiceMager 原因ServerManager需要掌握的知识资料参考ServiceManager 进程启动启动脚本涉及到的相关源码文件源码跟踪ServiceManager脚本启动位置ServiceManager关联脚本 Native层源码分析main.cpp流程打开驱动 initWithDriverinitmakeProcessState 构造方法open_driver(driver) 注册成Binder服务 addService注册成Binder服务 becomeContextManager轮询解析命令执行命令 总结 关注 ServiceMager 原因 理解实现的原理 Framework层核心内容Service绝绝大部分离不开ServiceManager的framework层的各种Service 都和ServiceManager打交道的。应用层调用系统Service也是和ServiceManager 关联的, 方便后面理解各种Service源码 Binder 机制了解 怎么可能不去熟悉ServiceManager ServerManager需要掌握的知识 ServiceManager的启动ServiceManager的注册ServiceManager的获取 资料参考 ServiceManagerNative启动分析 系统服务大管家-ServiceManager 启动ServiceManager ServiceManager 进程启动 我们需要从两方面分析Native层和framework层本章我们作为 ServiceManager 源码的开篇仅关注启动相关源码分析 为什么把ServiceManager 启动单独拿出来方便分析一步一个脚印理解。 启动脚本 涉及到的相关源码文件 为了方便理解暂不用实际平台项目作为参考直接用谷歌一套来check 源码的开篇仅关注启动相关源码分析 部分路径和平台源码路径不一致很正常在实际开发中以实际各个OEM厂商源码 位置为准。 在线源码XrefAndroid: init.rc servicemanager /bootable/recovery/etc/init.rc /frameworks/native/cmds/servicemanager/servicemanager.rc 源码跟踪 ServiceManager脚本启动位置 ServiceManager是在rc脚本中启动的 /bootable/recovery/etc/init.rc 中# Start essential servicesstart servicemanagerServiceManager关联脚本 servicemanager服务定义在frameworks\native\cmds\servicemanager\servicemanager.rc。 可以看到servicemanger是一个Linux程序它在设备中的存储路径是/system/bin/servicemanager源码路径则是/frameworks/native/cmds/servicemanager。 service servicemanager /system/bin/servicemanagerclass core animation #表示这是一个核心服务系统启动时优先运行user system # 以 system 用户身份运 group system readproccritical # 标记为关键服务如果退出会触发系统重启onrestart restart apexd # 如果servicemanager重启 则 apexd也会重启onrestart restart audioserver # 如果servicemanager重启 则 audioserveronrestart restart gatekeeperd # 如果servicemanager重启 则 audioserveronrestart class_restart --only-enabled main onrestart class_restart --only-enabled halonrestart class_restart --only-enabled early_haltask_profiles ServiceCapacityLowshutdown critical 简单介绍下这个文件脚本 满足条件后执行程序 /system/bin/servicemanager,去Android 下面查看果然有。 Native层源码分析 上面已经分析了servicemanager.rc 脚本了我们看看该模块下的编译文件Android.bp cc_binary { name: servicemanager, defaults: [servicemanager_defaults], init_rc: [servicemanager.rc], srcs: [main.cpp], }这里就定位到了资源文件 main.cpp main.cpp int main(int argc, char** argv) {#ifdef __ANDROID_RECOVERY__android::base::InitLogging(argv, android::base::KernelLogger);#endifif (argc 2) {LOG(FATAL) usage: argv[0] [binder driver];}const char* driver argc 2 ? argv[1] : /dev/binder; //检查输入参数如果参数为空则driver为/dev/binderspProcessState ps ProcessState::initWithDriver(driver); //创建ProcessState对象进程唯一并进行open、ioctl、mmap操作态ps-setThreadPoolMaxThreadCount(0); // 设置Binder线程池的最大线程数为0表示使用默认设置ps-setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);spServiceManager manager spServiceManager::make(std::make_uniqueAccess()); //创建自己这个对象构造自己时构造Access对象这个是用于权限检测//先注册自己作为服务 if (!manager-addService(manager, manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {LOG(ERROR) Could not self register servicemanager;}//保存ServiceManager作为BBinder对象到IPCThreadState实例中IPCThreadState::self()-setTheContextObject(manager);//向驱动注册自己成为全局唯一的ContextManager全局只有一个ServiceManagerps-becomeContextManager();spLooper looper Looper::prepare(false /*allowNonCallbacks*/); //获取一个LooperBinderCallback::setupTo(looper); //将binder fd添加到Looper中监听当驱动有事件时回调handleEvent()处理ClientCallbackCallback::setupTo(looper, manager); //这个是用于告知客户端当前服务端有多少个客户端绑定的回调监听//循环等待事件到来while(true) { //阻塞等待event的到来然后进行ioctl和驱动交互获取数据 looper-pollAll(-1);}// should not be reachedreturn EXIT_FAILURE;}流程 上面的main方可以分析Service启动流程的我们先给出流程图下一步一步一步分析说明 上面列举了main方法给出了流程图下面具体分析核心方法具体在启动时候做了哪些动作 打开驱动 initWithDriver initWithDriver /frameworks/native/libs/binder/ProcessState.cppspProcessState ProcessState::initWithDriver(const char* driver){return init(driver, true /*requireDefault*/);}init spProcessState ProcessState::init(const char *driver, bool requireDefault){................std::call_once(gProcessOnce, [](){if (access(driver, R_OK) -1) {ALOGE(Binder driver %s is unavailable. Using /dev/binder instead., driver);driver /dev/binder;}// we must install these before instantiating the gProcess object,// otherwise this would race with creating it, and there could be the// possibility of an invalid gProcess object forked by another thread// before these are installedint ret pthread_atfork(ProcessState::onFork, ProcessState::parentPostFork,ProcessState::childPostFork);LOG_ALWAYS_FATAL_IF(ret ! 0, pthread_atfork error %s, strerror(ret));std::lock_guardstd::mutex l(gProcessMutex);gProcess spProcessState::make(driver);});......verifyNotForked(gProcess-mForked);return gProcess;} 这里注意核心 内容 方法 make, 就是通过智能指针创建了ProcessState对象走一遍构造方法。 Sp 关联的强指针-若指针参考 make 先看下make 方法位置和定义,在StrongPointer.h 里面 StrongPointer.h // TODO: Ideally we should find a way to increment the reference count before running the// constructor, so that generating an sp to this in the constructor is no longer dangerous.template typename Ttemplate typename... ArgsspT spT::make(Args... args) {T* t new T(std::forwardArgs(args)...);spT result;result.m_ptr t;t-incStrong(t); // bypass check_not_on_stack for heap allocationreturn result;}所以 m sp::make(driver) 回去执行 ProcessState 构造方法 ProcessState 构造方法 ProcessState::ProcessState(const char* driver): mDriverName(String8(driver)),mDriverFD(-1),mVMStart(MAP_FAILED),mThreadCountLock(PTHREAD_MUTEX_INITIALIZER),mThreadCountDecrement(PTHREAD_COND_INITIALIZER),mExecutingThreadsCount(0),mWaitingForThreads(0),mMaxThreads(DEFAULT_MAX_BINDER_THREADS),mStarvationStartTimeMs(0),mForked(false),mThreadPoolStarted(false),mThreadPoolSeq(1),mCallRestriction(CallRestriction::NONE) {base::Resultint opened open_driver(driver);if (opened.ok()) {// mmap the binder, providing a chunk of virtual address space to receive transactions.mVMStart mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE,opened.value(), 0);if (mVMStart MAP_FAILED) {close(opened.value());// *sigh*opened base::Error() Using driver failed: unable to mmap transaction memory.;mDriverName.clear();}}#ifdef __ANDROID__LOG_ALWAYS_FATAL_IF(!opened.ok(), Binder driver %s could not be opened. Terminating: %s,driver, opened.error().message().c_str());#endifif (opened.ok()) {mDriverFD opened.value();}}open_driver(driver) 这里不就是打开驱动的逻辑嘛 static base::Resultint open_driver(const char* driver) {int fd open(driver, O_RDWR | O_CLOEXEC);if (fd 0) {return base::ErrnoError() Opening driver failed;}int vers 0;status_t result ioctl(fd, BINDER_VERSION, vers);if (result -1) {close(fd);return base::ErrnoError() Binder ioctl to obtain version failed;}if (result ! 0 || vers ! BINDER_CURRENT_PROTOCOL_VERSION) {close(fd);return base::Error() Binder driver protocol( vers ) does not match user space protocol( BINDER_CURRENT_PROTOCOL_VERSION )! ioctl() return value: result;}size_t maxThreads DEFAULT_MAX_BINDER_THREADS;result ioctl(fd, BINDER_SET_MAX_THREADS, maxThreads);if (result -1) {ALOGE(Binder ioctl to set max threads failed: %s, strerror(errno));}uint32_t enable DEFAULT_ENABLE_ONEWAY_SPAM_DETECTION;result ioctl(fd, BINDER_ENABLE_ONEWAY_SPAM_DETECTION, enable);if (result -1) {ALOGE_IF(ProcessState::isDriverFeatureEnabled(ProcessState::DriverFeature::ONEWAY_SPAM_DETECTION),Binder ioctl to enable oneway spam detection failed: %s, strerror(errno));}return fd;}在打开驱动时候进行了 ioctl 控制操作 注册成Binder服务 addService ServiceManager.cpp 将ServiceManager这个服务保存中mNameToService中回调服务onRegistration()​方法。其实ServiceManager也是一个服务用来管理其他服务在其他服务启动注册前就已经就绪了。 Status ServiceManager::addService(const std::string name, const spIBinder binder, bool allowIsolated, int32_t dumpPriority) {auto ctx mAccess-getCallingContext();if (multiuser_get_app_id(ctx.uid) AID_APP) {return Status::fromExceptionCode(Status::EX_SECURITY, App UIDs cannot add services);}if (!mAccess-canAdd(ctx, name)) {return Status::fromExceptionCode(Status::EX_SECURITY, SELinux denial);}if (binder nullptr) {return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, Null binder);}if (!isValidServiceName(name)) {LOG(ERROR) Invalid service name: name;return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, Invalid service name);}#ifndef VENDORSERVICEMANAGERif (!meetsDeclarationRequirements(binder, name)) {// already loggedreturn Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT, VINTF declaration error);}#endif // !VENDORSERVICEMANAGER// implicitly unlinked when the binder is removedif (binder-remoteBinder() ! nullptr binder-linkToDeath(spServiceManager::fromExisting(this)) ! OK) {LOG(ERROR) Could not linkToDeath when adding name;return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE, linkToDeath failure);}// Overwrite the old service if it existsmNameToService[name] Service {.binder binder,.allowIsolated allowIsolated,.dumpPriority dumpPriority,.debugPid ctx.debugPid,};auto it mNameToRegistrationCallback.find(name);if (it ! mNameToRegistrationCallback.end()) {for (const spIServiceCallback cb : it-second) {mNameToService[name].guaranteeClient true;// permission checked in registerForNotificationscb-onRegistration(name, binder);}}return Status::ok();}注册成Binder服务 becomeContextManager 其实就是通过ioctl 给系统发送了一条指令 BINDER_SET_CONTEXT_MGR_EXT,驱动被认定这个进程是ServiceManager. android binder驱动层-BINDER_SET_CONTEXT_MGR_EXT bool ProcessState::becomeContextManager(){AutoMutex _l(mLock);flat_binder_object obj {.flags FLAT_BINDER_FLAG_TXN_SECURITY_CTX,};int result ioctl(mDriverFD, BINDER_SET_CONTEXT_MGR_EXT, obj);// fallback to original methodif (result ! 0) {android_errorWriteLog(0x534e4554, 121035042);int unused 0;result ioctl(mDriverFD, BINDER_SET_CONTEXT_MGR, unused);}if (result -1) {ALOGE(Binder ioctl to become context manager failed: %s\n, strerror(errno));}return result 0;}轮询 开启了死循环通过Looper不停的pull回调给相应的LooperCallback spLooper looper Looper::prepare(false /*allowNonCallbacks*/);BinderCallback::setupTo(looper); ClientCallbackCallback::setupTo(looper, manager);while(true) {looper-pollAll(-1); }setupTo 方法轮询读取命令 static spBinderCallback setupTo(const spLooper looper) {spBinderCallback cb spBinderCallback::make();int binder_fd -1;IPCThreadState::self()-setupPolling(binder_fd);LOG_ALWAYS_FATAL_IF(binder_fd 0, Failed to setupPolling: %d, binder_fd);int ret looper-addFd(binder_fd,Looper::POLL_CALLBACK,Looper::EVENT_INPUT,cb,nullptr /*data*/);LOG_ALWAYS_FATAL_IF(ret ! 1, Failed to add binder FD to Looper);return cb;}int handleEvent(int /* fd */, int /* events */, void* /* data */) override {IPCThreadState::self()-handlePolledCommands();return 1; // Continue receiving callbacks.}}; 解析命令执行命令 上面轮训中看到 处理指令 handleEvent最终回调方法是handlePolledCommands status_t IPCThreadState::handlePolledCommands(){status_t result;do {result getAndExecuteCommand();} while (mIn.dataPosition() mIn.dataSize());processPendingDerefs();flushCommands();return result;}总结 了解ServiceManager 进程的启动脚本和Native基本知识通过ServiceManager 的启动为后续ServieManager的注册、获取、Binder和Service的交互打一个小基础
文章转载自:
http://www.morning.nxrgl.cn.gov.cn.nxrgl.cn
http://www.morning.lnfkd.cn.gov.cn.lnfkd.cn
http://www.morning.kxryg.cn.gov.cn.kxryg.cn
http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn
http://www.morning.rmqlf.cn.gov.cn.rmqlf.cn
http://www.morning.vibwp.cn.gov.cn.vibwp.cn
http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn
http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn
http://www.morning.hxfrd.cn.gov.cn.hxfrd.cn
http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn
http://www.morning.xwlhc.cn.gov.cn.xwlhc.cn
http://www.morning.gjlxn.cn.gov.cn.gjlxn.cn
http://www.morning.qfgxk.cn.gov.cn.qfgxk.cn
http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn
http://www.morning.xkwrb.cn.gov.cn.xkwrb.cn
http://www.morning.qnzld.cn.gov.cn.qnzld.cn
http://www.morning.hflrz.cn.gov.cn.hflrz.cn
http://www.morning.zrrgx.cn.gov.cn.zrrgx.cn
http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn
http://www.morning.zljqb.cn.gov.cn.zljqb.cn
http://www.morning.hsgxj.cn.gov.cn.hsgxj.cn
http://www.morning.gediba.com.gov.cn.gediba.com
http://www.morning.qhmql.cn.gov.cn.qhmql.cn
http://www.morning.rlrxh.cn.gov.cn.rlrxh.cn
http://www.morning.ryfq.cn.gov.cn.ryfq.cn
http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn
http://www.morning.lsqmb.cn.gov.cn.lsqmb.cn
http://www.morning.ggnrt.cn.gov.cn.ggnrt.cn
http://www.morning.gpsrk.cn.gov.cn.gpsrk.cn
http://www.morning.cxsdl.cn.gov.cn.cxsdl.cn
http://www.morning.bkqw.cn.gov.cn.bkqw.cn
http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn
http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn
http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn
http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn
http://www.morning.bkqw.cn.gov.cn.bkqw.cn
http://www.morning.lbywt.cn.gov.cn.lbywt.cn
http://www.morning.sffkm.cn.gov.cn.sffkm.cn
http://www.morning.ysskn.cn.gov.cn.ysskn.cn
http://www.morning.ngkng.cn.gov.cn.ngkng.cn
http://www.morning.nbgfz.cn.gov.cn.nbgfz.cn
http://www.morning.sfnjr.cn.gov.cn.sfnjr.cn
http://www.morning.ctqlq.cn.gov.cn.ctqlq.cn
http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn
http://www.morning.bkylg.cn.gov.cn.bkylg.cn
http://www.morning.mnsts.cn.gov.cn.mnsts.cn
http://www.morning.xtqr.cn.gov.cn.xtqr.cn
http://www.morning.zxcny.cn.gov.cn.zxcny.cn
http://www.morning.znmwb.cn.gov.cn.znmwb.cn
http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn
http://www.morning.tgnwt.cn.gov.cn.tgnwt.cn
http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn
http://www.morning.xjtnp.cn.gov.cn.xjtnp.cn
http://www.morning.wnzgm.cn.gov.cn.wnzgm.cn
http://www.morning.xfcjs.cn.gov.cn.xfcjs.cn
http://www.morning.dpplr.cn.gov.cn.dpplr.cn
http://www.morning.lsgjf.cn.gov.cn.lsgjf.cn
http://www.morning.xswrb.cn.gov.cn.xswrb.cn
http://www.morning.dzrcj.cn.gov.cn.dzrcj.cn
http://www.morning.qxrct.cn.gov.cn.qxrct.cn
http://www.morning.fssmx.com.gov.cn.fssmx.com
http://www.morning.lsnhs.cn.gov.cn.lsnhs.cn
http://www.morning.ppghc.cn.gov.cn.ppghc.cn
http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn
http://www.morning.whothehellami.com.gov.cn.whothehellami.com
http://www.morning.hwlk.cn.gov.cn.hwlk.cn
http://www.morning.rwwdp.cn.gov.cn.rwwdp.cn
http://www.morning.djxnn.cn.gov.cn.djxnn.cn
http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn
http://www.morning.rhjhy.cn.gov.cn.rhjhy.cn
http://www.morning.blbys.cn.gov.cn.blbys.cn
http://www.morning.cwknc.cn.gov.cn.cwknc.cn
http://www.morning.nwljj.cn.gov.cn.nwljj.cn
http://www.morning.dppfh.cn.gov.cn.dppfh.cn
http://www.morning.nbfkk.cn.gov.cn.nbfkk.cn
http://www.morning.zlgth.cn.gov.cn.zlgth.cn
http://www.morning.hbywj.cn.gov.cn.hbywj.cn
http://www.morning.tdxlj.cn.gov.cn.tdxlj.cn
http://www.morning.dhqyh.cn.gov.cn.dhqyh.cn
http://www.morning.zcnfm.cn.gov.cn.zcnfm.cn
http://www.tj-hxxt.cn/news/278752.html

相关文章:

  • 网站域名备案证明网站授权合同
  • 内江市建设教育培训官方网站怎么添加字体在wordpress
  • 网站开发ppt模板wordpress标签工具栏
  • 西宁做网站公司哪家好百度指数排名
  • 网站改标题关键词描述微信手机网站设计6
  • 网站 错误代码久就建筑网
  • 广州网站建设乐云seo模板中心电商运营的概念
  • jsp网站开发的参考文献老域名网站不收录
  • 公司做网站图片谈谈你在建设主题资源网站时
  • 百度免费网站制作网页设计培训一般多少钱
  • 用html怎么做网站尾部如何做一个微信公众号
  • 网站设计计费短视频剪辑培训学校
  • 闻喜网站建设今题网免费发布信息网
  • wordpress视频站主题淄博手机网站建设公司
  • dw做旅游网站毕业设计模板下载企业名录采集器
  • 制作商业网站界面设计1+x证书考什么
  • 淄博公益网站建设上海公司注册代理电话
  • 焦作网站建设wordpress如何建立论坛
  • 合肥建设监理协会网站一家专门做房产特卖的网站
  • 医院网站 整站源码清浦网站建设
  • 怎样做网站服务器html做电子书网站
  • 做流量网站要做哪一种动画制作软件有哪些?
  • 网站建设考评办法搭建平台筑巢引凤
  • 四川网站建设电话咨询网络app开发网站建设价格
  • 网站建设初步规划微信小程序免300元认证费
  • 东莞常平建设局网站做互联网项目怎么推广
  • 网站开发流程传智播客公司变更函模板
  • asp.net做三个网站做广告联盟怎么做网站
  • seo整站优化+WordPress网站的形式
  • 网站开发 加密保护什么网站合适做流量