首页 文章 精选 留言 我的

精选列表

搜索[源代码漏洞],共10002篇文章
优秀的个人博客,低调大师

调试鸿蒙(HarmonyOS)App源代码的两种方式

为了让更多的人看到本文,请各位读者动动小手,点击右上角【...】,将本文分享到朋友圈,thanks! 调试是开发App的必备技能,毕竟任何一个比较复杂的App都不可能一次编码成功,如果App的预期与自己期望的不同,或由于某些原因异常中断,就需要查中断的原因,这些都需要调试程序。 调试程序有多种方法,比较常用的有设置断点和输出日志两种方式,本文将详细介绍这两种调试App的方式。 1. 设置断点 如果认为需要跟踪的代码或bug在某行代码的附近,可以单击该行代码前面的部分为该行设置断点,这时会在这行代码前面出现一个红点,如图1所示。 图1 设置断点 然后点击上方工具栏中如图2所示的调试运行按钮。 图2 调试运行按钮 如果未遇到断点,点击该按钮会正常运行程序,一旦遇到断点,程序执行就会在断点处停止执行。知道按F7或F8键才继续一行一行执行程序,以便监控程序中的相关变量的状态。F7表示Step Into,F8表示Step Over。其中Step Into表示会跟踪到方法内部,例如,当前正在执行一个方法,按F7键会继续跟踪到方法内部,然后继续一行一行代码执行。Step Over会将方法当做一行代码执行,不会跟踪到方法内部。所以如果认为某一个方法肯定没有问题,就按F8,如果认为该方法可能会有一些问题,就按F7。 调试过程的效果如图3所示。我们可以看到,在下方的Variables视图中会显示相关变量的当前值。 图3 调试代码 2. 输出日志 另外一种调试代码的方式就是输出日志,可以直接使用System.out.println(...)的方式将信息输出到LogCat视图中,例如,执行下面的代码,会在LogCat视图中看到如图4所示的信息。 System.out.println("hello world"); 图4在LogCat视图中输出的调试信息 HarmonyOS还提供了另外一种输出日志的方式,这就是HiLog类,该类提供了多个静态方法,用于输出不同级别的日志信息。这些静态方法如表1所示。 表1 HiLog类中用于输出日志信息的方法 方法名 功能 debug 用于输出调试日志信息 info 用于输出普通的日志信息 warn 用于输出警告日志信息 error 用于输出普通错误日志信息 fatal 用于输出致命错误日志信息 这5个方法的参数完全相同,例如,error方法的原型如下: public static int error(HiLogLabel label, String format, Object... args); 其中label参数表示输出日志的相关信息,类型是HiLogLabel对象,format表示要输出的日志文本(可以包括格式化占位符),args参数表示格式化的参数值,是可选的参数。 使用输出日志方法的案例如下: HiLogLabel label = new HiLogLabel(HiLog.LOG_APP ,223, "MY_TAG");HiLog.error(label, "这是一行错误信息,原因:%{private}s","Url不可访问");HiLog.warn(label,"这是一个警告,原因是:%{public}s", "变量的值可能是负数"); 其中HiLogLabel构造方法的第1个参数表示日志类型,目前只能是HiLog.LOG_APP,后续会开放更多的日志类型。第2个参数是domain,就是一个整数类型,第3个参数是日志的标签。Domain和日志标签都会以某种形式显示在日志信息上。 在输出日志信息时,运行格式化日志信息,也就是为日志信息指定占位符。占位符需要在%和符号(如s、d)之间加{private}或{public},如果加{private},输出的信息就是<private>,也就是说会隐藏占位符对应的信息,如果加{public},则输出原始的占位符信息。Domain在输出时被转换为十六进制数放到标签的前面,中间用斜杠(/)分隔。 执行这段代码,会在HiLog视图中输出如图5所示的日志信息。 图5 在HiLog视图输出日志信息 使用error方法会输出深红色的日志信息,日志的内容与其他方法输出的日志内容相同。不过要注意,使用HiLog的相关方法输出的日志分为5个级别,分别是DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)、FATAL(致命错误)。这5个级别分别用5个整数表示,这些整数都在HiLog类中定义,代码如下: public final class HiLog { public static final int DEBUG = 3; public static final int INFO = 4; public static final int WARN = 5; public static final int ERROR = 6; public static final int FATAL = 7; … …} 如果要在HiLog视图中过滤这些级别的信息。只有不大于当前级别的信息才会给显示。例如,要过滤WARN信息,只有DEBUG、INFO和WARN这3类信息才会被显示,由于ERROR和FATAL的值逗比WARN大,所以这两类信息不会被显示。 - EOF - 推荐阅读 点击标题可跳转 1.开发跨设备的鸿蒙(HarmonyOS) App 2.鸿蒙(HarmonyOS)大神都喜欢玩命令行 3.像极客一样提取Android的Root权限 4.牛掰了!鸿蒙与Android完美融合,将鸿蒙设备当Android设备用 5.【鸿蒙学院】鸿蒙App开发直播学员提问与回答 6.使出Python的六脉神剑,让Python拥有无限扩展性 关注「极客起源」公众号,加星标,不错过精彩技术干货 本文分享自微信公众号 - 极客起源(geekculture)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

有哪些Java源代码看了后让你收获很多?

曾经读过Erudika/para的源码,此源码托管在github,大致是2014年前后开源的云计算通用后端框架,基于spring boot体系,原生集成持久化(默认H2 DB,通过配置方式实现MongoDB、mysql等常用关系数据库的支持)、缓存(默认Caffeine、支持配置参数的Hazelcast、redis等)和搜索(默认Lucene,支持配置参数的Elasticsearch)三大功能,快速开发resful风格的API接口,其强大的分层思想和通用性设计能力,让我的架构思维有了很大的进步,其开源版本对于中小团队实践spring boot+spring cloud打通云计算服务具有借鉴意义,目前最新的版本为1.29.1。 下面,我就简单的分享Erudika/para源码官网的介绍,解释不到位的地方希望大家批评指正,同时,这款较为优秀的开源项目也推荐给大家去学习和使用。 特性: 多租户技术【多重租赁技术】支持——每个应用程序都有自己的表、索引和缓存; 用Amazon的签名算法进行安全的JSON; 数据库动态性,专为可伸缩和分布式数据存储而设计 全文搜索(Elasticsearch); 分布式对象缓存(hazelcast,高可扩展内存数据网格); 物联网支持与AWS(业务流程管理开发平台)和(基于云计算的操作系统,Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序)的集成; 灵活的安全LDAP(LDAP是轻量目录访问协议),社交登录,CSRF(跨站请求伪造)保护; 无状态的客户端认证与JSON的Web令牌(JWT,网络应用环境间传递声明而执行的一种基于JSON的开放标准,JWT是由三段信息构成的,将这三段信息文本用); 用于客户端访问控制的简单但有效的资源权限; 鲁棒约束验证基于JSR-303和Hibernate Validator; 持久性、索引和缓存操作的每个对象控制; 模块化设计的谷歌Guice(依赖注入框架(IOC))和支持插件; 网络控制台-管理用户界面。 欢迎大家加入Java高级架构/互联网:468947140 点击链接加入群聊:https://jq.qq.com/?_wv=1027&k=56hvqnu 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导 进群修改群备注:开发年限-地区-经验 方便架构师解答问题

优秀的个人博客,低调大师

最强观战指南 | Python分析热门夺冠球队(附源代码)

018年,火热的世界杯即将拉开序幕。在比赛开始之前,我们不妨用 Python 来对参赛队伍的实力情况进行分析,并大胆的预测下本届世界杯的夺冠热门球队。 通过数据分析,可以发现很多有趣的结果,比如: 找出哪些队伍是首次进入世界杯的黑马队伍 找出2018年32强中之前已经进入过世界杯,但在世界杯上没有赢得过一场比赛的队伍 当然,我们本次的主要任务是要通过数据分析来预测2018年世界杯的夺冠热门队伍。 本次分析的数据来源于 Kaggle, 包含从 1872 年到今年的数据,包括世界杯比赛、世界杯预选赛、亚洲杯、欧洲杯、国家之间的友谊赛等比赛,一共大约 40000 场比赛的情况。 本次的环境为 window 7 系统 python 3.6 Jupyter Notebook pandas version 0.22.0 先来看看数据的情况: import panda

优秀的个人博客,低调大师

javascript dom的图片最终版源代码 (重复看)

html代码: <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Image Gallery</title> <script type="text/javascript" src="scripts/showPic.js"></script> <link rel="stylesheet" href="styles/layout.css" type="text/css" media="screen" /> </head> <body> <h1>Snapshots</h1> <ul id="imagegallery"> <li> <a href="images/fireworks.jpg" title="A fireworks display"> <img src="images/thumbnail_fireworks.jpg" alt="Fireworks" /> </a> </li> <li> <a href="images/coffee.jpg" title="A cup of black coffee" > <img src="images/thumbnail_coffee.jpg" alt="Coffee" /> </a> </li> <li> <a href="images/rose.jpg" title="A red, red rose"> <img src="images/thumbnail_rose.jpg" alt="Rose" /> </a> </li> <li> <a href="images/bigben.jpg" title="The famous clock"> <img src="images/thumbnail_bigben.jpg" alt="Big Ben" /> </a> </li> </ul> </body> </html> css: body { font-family: "Helvetica","Arial",serif; color: #333; background-color: #ccc; margin: 1em 10%; } h1 { color: #333; background-color: transparent; } a { color: #c60; background-color: transparent; font-weight: bold; text-decoration: none; } ul { padding: 0; } li { float: left; padding: 1em; list-style: none; } #imagegallery { list-style: none; } #imagegallery li { display: inline; } #imagegallery li a img { border: 0; } function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { oldonload(); func(); } } } function insertAfter(newElement,targetElement) { var parent = targetElement.parentNode; if (parent.lastChild == targetElement) { parent.appendChild(newElement); } else { parent.insertBefore(newElement,targetElement.nextSibling); } } function preparePlaceholder() { if (!document.createElement) return false; if (!document.createTextNode) return false; if (!document.getElementById) return false; if (!document.getElementById("imagegallery")) return false; var placeholder = document.createElement("img"); placeholder.setAttribute("id","placeholder"); placeholder.setAttribute("src","images/placeholder.gif"); placeholder.setAttribute("alt","my image gallery"); var description = document.createElement("p"); description.setAttribute("id","description"); var desctext = document.createTextNode("Choose an image"); description.appendChild(desctext); var gallery = document.getElementById("imagegallery"); insertAfter(placeholder,gallery); insertAfter(description,placeholder); } function prepareGallery() { if (!document.getElementsByTagName) return false; if (!document.getElementById) return false; if (!document.getElementById("imagegallery")) return false; var gallery = document.getElementById("imagegallery"); var links = gallery.getElementsByTagName("a"); for ( var i=0; i < links.length; i++) { links[i].onclick = function() { return showPic(this); } links[i].onkeypress = links[i].onclick; } } function showPic(whichpic) { if (!document.getElementById("placeholder")) return true; var source = whichpic.getAttribute("href"); var placeholder = document.getElementById("placeholder"); placeholder.setAttribute("src",source); if (!document.getElementById("description")) return false; if (whichpic.getAttribute("title")) { var text = whichpic.getAttribute("title"); } else { var text = ""; } var description = document.getElementById("description"); if (description.firstChild.nodeType == 3) { description.firstChild.nodeValue = text; } return false; } addLoadEvent(preparePlaceholder); addLoadEvent(prepareGallery);

优秀的个人博客,低调大师

Android应用程序安装过程源代码分析(3)

Step 7.PackageManagerService.main 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [cpp] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... publicstaticfinalIPackageManagermain(Contextcontext,booleanfactoryTest){ PackageManagerServicem=newPackageManagerService(context,factoryTest); ServiceManager.addService("package",m); returnm; } ...... } 这个函数创建了一个PackageManagerService服务实例,然后把这个服务添加到ServiceManager中去,ServiceManager是Android系统Binder进程间通信机制的守护进程,负责管理系统中的Binder对象,具体可以参考 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路 一文。 在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... publicPackageManagerService(Contextcontext,booleanfactoryTest){ ...... synchronized(mInstallLock){ synchronized(mPackages){ ...... FiledataDir=Environment.getDataDirectory(); mAppDataDir=newFile(dataDir,"data"); mSecureAppDataDir=newFile(dataDir,"secure/data"); mDrmAppPrivateInstallDir=newFile(dataDir,"app-private"); ...... mFrameworkDir=newFile(Environment.getRootDirectory(),"framework"); mDalvikCacheDir=newFile(dataDir,"dalvik-cache"); ...... //Findbaseframeworks(resourcepackageswithoutcode). mFrameworkInstallObserver=newAppDirObserver( mFrameworkDir.getPath(),OBSERVER_EVENTS,true); mFrameworkInstallObserver.startWatching(); scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM |PackageParser.PARSE_IS_SYSTEM_DIR, scanMode|SCAN_NO_DEX,0); //Collectallsystempackages. mSystemAppDir=newFile(Environment.getRootDirectory(),"app"); mSystemInstallObserver=newAppDirObserver( mSystemAppDir.getPath(),OBSERVER_EVENTS,true); mSystemInstallObserver.startWatching(); scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0); //Collectallvendorpackages. mVendorAppDir=newFile("/vendor/app"); mVendorInstallObserver=newAppDirObserver( mVendorAppDir.getPath(),OBSERVER_EVENTS,true); mVendorInstallObserver.startWatching(); scanDirLI(mVendorAppDir,PackageParser.PARSE_IS_SYSTEM |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0); mAppInstallObserver=newAppDirObserver( mAppInstallDir.getPath(),OBSERVER_EVENTS,false); mAppInstallObserver.startWatching(); scanDirLI(mAppInstallDir,0,scanMode,0); mDrmAppInstallObserver=newAppDirObserver( mDrmAppPrivateInstallDir.getPath(),OBSERVER_EVENTS,false); mDrmAppInstallObserver.startWatching(); scanDirLI(mDrmAppPrivateInstallDir,PackageParser.PARSE_FORWARD_LOCK, scanMode,0); ...... } } } ...... } 这里会调用scanDirLI函数来扫描移动设备上的下面这五个目录中的Apk文件 /system/framework /system/app /vendor/app /data/app /data/app-private Step 8.PackageManagerService.scanDirLI 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... privatevoidscanDirLI(Filedir,intflags,intscanMode,longcurrentTime){ String[]files=dir.list(); ...... inti; for(i=0;i<files.length;i++){ Filefile=newFile(dir,files[i]); if(!isPackageFilename(files[i])){ //Ignoreentrieswhicharenotapk's continue; } PackageParser.Packagepkg=scanPackageLI(file, flags|PackageParser.PARSE_MUST_BE_APK,scanMode,currentTime); //Don'tmessaroundwithappsinsystempartition. if(pkg==null&&(flags&PackageParser.PARSE_IS_SYSTEM)==0&& mLastScanError==PackageManager.INSTALL_FAILED_INVALID_APK){ //Deletetheapk Slog.w(TAG,"Cleaningupfailedinstallof"+file); file.delete(); } } } ...... } 对于目录中的每一个文件,如果是以后Apk作为后缀名,那么就调用scanPackageLI函数来对它进行解析和安装。 Step 9.PackageManagerService.scanPackageLI 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... privatePackageParser.PackagescanPackageLI(FilescanFile, intparseFlags,intscanMode,longcurrentTime){ ...... StringscanPath=scanFile.getPath(); parseFlags|=mDefParseFlags; PackageParserpp=newPackageParser(scanPath); ...... finalPackageParser.Packagepkg=pp.parsePackage(scanFile, scanPath,mMetrics,parseFlags); ...... returnscanPackageLI(pkg,parseFlags,scanMode|SCAN_UPDATE_SIGNATURE,currentTime); } ...... } 这个函数首先会为这个Apk文件创建一个PackageParser实例,接着调用这个实例的parsePackage函数来对这个Apk文件进行解析。这个函数最后还会调用另外一个版本的scanPackageLI函数把来解析后得到的应用程序信息保存在PackageManagerService中。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966522,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册