在本文中,我们将为您详细介绍android–Systrace没有为–set-tags提供这样的选项错误的相关知识,并且为您解答关于androidstudio没有systemimage的疑问,此外,我们
在本文中,我们将为您详细介绍android – Systrace没有为–set-tags提供这样的选项错误的相关知识,并且为您解答关于androidstudio没有systemimage的疑问,此外,我们还会提供一些关于Android API 8,10 ContactsContract.Data.HAS_PHONE_NUMBER没有这样的列、Android Studio 中 System Trace 的新增功能、Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu、Android Systrace 使用方法的有用信息。
本文目录一览:- android – Systrace没有为–set-tags提供这样的选项错误(androidstudio没有systemimage)
- Android API 8,10 ContactsContract.Data.HAS_PHONE_NUMBER没有这样的列
- Android Studio 中 System Trace 的新增功能
- Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu
- Android Systrace 使用方法
android – Systrace没有为–set-tags提供这样的选项错误(androidstudio没有systemimage)
我按照这里的说明为我的应用程序使用systrace,但每当我尝试为systrace设置标记时,我都会收到以下错误:
systrace.py: error: no such option: --set-tags
这似乎是一个相当新的问题,昨天刚刚出现.有谁知道怎么了?当我尝试在运行4.3的设备上进行systrace时,这似乎只是一个问题.
解决方法:
4.3没有–set-tags选项. systrace的工作方式发生了重大变化,文档尚未更新. (编辑:已更新为4.3)
systrace.py脚本检查设备版本,并将命令转发到systrace-legacy.py以用于4.3之前的设备.这就是旧命令仍适用于旧设备的原因.
4.3设备的一个例子是:
python systrace.py gfx view sched dalvik
也就是说,您只需将您想要的标记列为启动跟踪的命令的参数.
我有一个例子(它也展示了新的应用程序定义的标签功能)here.
Android API 8,10 ContactsContract.Data.HAS_PHONE_NUMBER没有这样的列
这是查询:
Cursor contactsCur = getContentResolver().query( ContactsContract.Data.CONTENT_URI,new String[] { ContactsContract.Data._ID,ContactsContract.Data.CONTACT_ID,ContactsContract.Data.disPLAY_NAME,ContactsContract.CommonDataKinds.Organization.COMPANY,ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.Data.LOOKUP_KEY,ContactsContract.CommonDataKinds.Phone.NUMBER,Contacts.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.MIMETYPE,ContactsContract.CommonDataKinds.StructuredPostal.CITY,ContactsContract.CommonDataKinds.StructuredPostal.STREET,ContactsContract.CommonDataKinds.StructuredPostal.REGION,ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE},ContactsContract.Data.HAS_PHONE_NUMBER + " >? ",new String[] { "0" },ContactsContract.Data.disPLAY_NAME + " COLLATE NOCASE ASC");
以下是它抛出的异常:
android.database.sqlite.sqliteException:没有这样的列:has_phone_number :,编译时:SELECT _id,contact_id,display_name,data1,data2,lookup,mimetype,data7,data4,data8,data9 FROM view_data_restricted data WHERE(1 )AND(has_phone_number>?)ORDER BY display_name COLLATE NOCASE ASC
奇怪的是,以下代码也不起作用:
Cursor contactsCur = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[] { ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER},ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + " >? ",null);
它产生:java.lang.IllegalArgumentException:无效的列has_phone_number
http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html声明ContactsContract.CommonDataKinds.Phone可以访问HAS_PHONE_NUMBER来自界面android.provider.ContactsContract.ContactsColumns
为了增加陌生感,此查询有效:
Cursor contactsCur = getContentResolver().query( ContactsContract.Data.CONTENT_URI,new String[] { ContactsContract.Data.LOOKUP_KEY},null,null);
但是这个没有:
Cursor contactsCur = getContentResolver().query( ContactsContract.Data.CONTENT_URI,new String[] { ContactsContract.Data.HAS_PHONE_NUMBER},null);
ContactsContract.Data.LOOKUP_KEY来自与ContactsContract.Data.HAS_PHONE_NUMBER相同的隐式连接!
我哪里错了?
解决方法
供参考(请注意,数据/电话URI中不存在has_phone_number):
Columns for content://com.android.contacts/contacts: - times_contacted - contact_status - custom_ringtone - has_phone_number - phonetic_name - phonetic_name_style - contact_status_label - lookup - contact_status_icon - last_time_contacted - display_name - sort_key_alt - in_visible_group - _id - starred - sort_key - display_name_alt - contact_presence - display_name_source - contact_status_res_package - contact_status_ts - photo_id - send_to_voicemail
和:
Columns for content://com.android.contacts/data/phones: - data_version - phonetic_name - phonetic_name_style - contact_id - lookup - data12 - data11 - data10 - mimetype - data15 - data14 - data13 - display_name_source - data_sync1 - data_sync3 - data_sync2 - data_sync4 - account_type - custom_ringtone - status - data1 - data4 - data5 - data2 - data3 - data8 - data9 - group_sourceid - data6 - account_name - data7 - display_name - in_visible_group - display_name_alt - contact_status_res_package - is_primary - contact_status_ts - raw_contact_id - times_contacted - contact_status - status_res_package - status_icon - contact_status_icon - mode - version - last_time_contacted - res_package - _id - name_verified - status_ts - dirty - is_super_primary - photo_id - send_to_voicemail - name_raw_contact_id - contact_status_label - status_label - sort_key_alt - starred - sort_key - contact_presence - sourceid
Android Studio 中 System Trace 的新增功能
在 Android Studio 4.0 中,我们已经对 CPU Profiler 的 UI 做了大量调整来提供更加直观的工作流记录,而在 Android Studio 4.1 中,我们基于开发者们的反馈对此功能进行了持续改进,并且新增了更多特性。
我们将会在本文重点介绍 Android Studio 中 System Trace 的新增功能,System Trace 也就是 "系统跟踪" 的意思,用来记录短时间内的设备活动,它会生成一个 .trace 跟踪文件,该文件可用于生成系统报告,此报告可帮助您了解如何最有效地提升应用或游戏的性能。System Trace 虽然使用率不高,但它是一款功能强大的 CPU 记录配置。不同于函数跟踪,如 Java Method 或 C/C++ Func Trace,System Trace 跟踪的是系统级的内容,如设备活动 (例如 CPU 核心调度) 和 Android 系统进程 (例如 SurfaceFlinger)。此外,您还可以通过在应用中调用 Trace API,使用 自定义事件 检测您的代码,这样您的自定义事件便会与系统事件一起被收集。当您在排查性能问题时 (例如 UI 卡顿或功耗过高),这些组合数据就会显得十分有用。
一次搞定所有线程
为了便于进行分析,我们将 CPU 的记录从主分析器的时间线中分离了出来。在这个专用视图中,跟踪数据被整理到了 Profiler 窗口的左侧区域中。
Android Studio 4.1 Beta 1 中的 System Trace 界面
您可以通过简单拖拽将某一区域或者区域内的某个元素进行向上或向下移动来重新组织列表。
我们从开发者们的反馈得知,选择每个线程来查看它的调用图 (或 System Trace 的跟踪事件) 是一件很麻烦的事,所以我们将所有线程活动整合到了同一个视图中,从而可以在显示线程状态的同时显示调用图。默认情况下,我们根据线程的繁忙程度对其进行排序,但是您也可以拖放任意一个线程以对其重新排序。
拖放线程来改变列表顺序
您也可以通过单击三角形图标或双击线程名称来折叠或展开每个线程。注意,对于 Java Method Trace 和 C/C++ Function Trace,由于调用栈很深,我们默认情况下会折叠所有线程视图,以便您可以一目了然地查看所有线程数据。
C/C++ Function Trace 默认以折叠状态展示线程数据
为了便于区分,现在每个 System Trace 的跟踪事件都有一个独立的颜色。
System Trace 事件按命名添加了对应颜色
更加直观的导航
新的 Trace UI 使用了改进的时间轴导航方案,我们用主要 - 细节视图替换了以前的水平滚动条。
在顶部,您可以看到一个时间轴,它仅仅映射了跟踪过程而不是整个分析过程。您可以使用范围选择器快速缩小范围到特定的时间段,而下面的部分则会显示对应的详细数据。
使用范围选择器来专注于时间轴的一小部分
在这里您可以进行更加精细的导航操作:
- 使用 Ctrl (在 Mac 上为 Cmd) + 鼠标滚轮进行缩放;
- 按住空格键的同时左右拖动鼠标可平移视图;
- 使用 "WASD" 键缩放和平移视图,就像 Chrome 中的旧版 SysTrace UI 一样 (chrome://tracing)。
从 Android Studio 4.1 Canary 9 开始,您可以通过拖动鼠标在 Thread 部分进行框选。这一操作使您可以精确地选择一个矩形区域,并且只要点击右上角的 Zoom to Selection (或 "M" 键) 便可以放大该区域。您甚至可以跨越多个线程执行选择操作,这个特性在您把相似线程拖放到一起进行检视时十分有用。举例来说,您也许会想对多个辅助线程进行分析,而这种场景在游戏开发中很常见。
框选、拖放与缩放
分析面板
说到分析,我们想着重聊一聊 Android Studio 4.0 中引入的新 Analysis Panel ,它位于 Profiler 窗口的右边一列。
基于您所选择的跟踪记录,在这里可以找到相应的分析数据。当您在左边栏中选择一个线程、堆栈帧或者跟踪事件时,Analysis Panel 将会显示对应的特定信息。举例来说,当您选择了一个线程时,该线程的状态与其他一些有用的信息就会被显示出来。
我们希望 Analysis Panel 能对您有所帮助,所以我们一直在探索使用各种形式来展示这些有用的分析数据。在 CPU Profiler 中,我们已经有了 Top Down、Flame Chart 和 Bottom Up。作为补充,我们在 Android Studio 4.1 Canary 10 中添加了 Summary 选项卡,用于展示线程状态分布、跟踪事件统计等信息。举例来说,我们经常需要深入了解一个反复出现的跟踪事件。Summary 选项卡会显示基本的统计信息 (如计数,最小值,最大值等) 以及所选跟踪事件中运行时间最长的一次事件。您也可以通过从表中选择一行来导航到另一个事件。
统计信息以及跟踪事件中运行时间最长的事件
稳定性与性能改进
最后但也同样重要的是,我们还改进了 CPU 记录的性能和稳定性:
- 我们修复了一些可能导致记录失败的 Bug;
- 我们从 Android API level 28 开始使用 Perfetto 作为 System Trace 的后台,从而可以从 Android 平台的最新检测技术中获益;
- 我们还优化了 profiler 的代码,从而显著减少了解析跟踪记录时的内存消耗 (最多达 80%)。这样您便可以开启和解析更长的跟踪信息。请记住,您可以增加 Android Studio 的 最大堆容量 来支持更长时间的追踪。
下载最新的 Android Studio 4.1 预览版 可以尝鲜本文介绍的新特性。也同样欢迎大家 反馈。
Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu
Android studio Run with --stacktrace option to get the stack trace. Run with --info or --debu
提示信息
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
其实是让你去查看更多的log信息。找到你项目的根目录,比如你的项目是MyApplication,在dos命令下进入该目录执行
gradlew compileDebug --stacktrace
如果上面的命令不管用,可以使用下面的命令试试
gradle compileDebug --stacktrace
可以看到很多错误的信息输出出来。
E:\MyApplication>gradle compileDebug --stacktrace FAILURE: Build Failed with an exception. * What went wrong: A problem occurred configuring root project 'MyApplication'. > Could not resolve all dependencies for configuration ':classpath'. > Could not resolve com.android.tools.build:gradle:1.0.0. required by: :MyApplication:unspecified > Could not GET 'https://jcenter.bintray.com/com/android/tools/build/gradl e/1.0.0/gradle-1.0.0.pom'. > Connection to https://jcenter.bintray.com refused * Try: Run with --info or --debug option to get more log output. * Exception is: org.gradle.api.ProjectConfigurationException: A problem occurred configuring roo t project 'MyApplication'. at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigu rationFailure(LifecycleProjectEvaluator.java:91) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(L ifecycleProjectEvaluator.java:61) at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProj ect.java:504) at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProj ect.java:83) at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(Task PathProjectEvaluator.java:42) at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuil dConfigurer.java:35) at org.gradle.initialization.DefaultGradleLauncher.dobuildStages(Default GradleLauncher.java:129) at org.gradle.initialization.DefaultGradleLauncher.dobuild(DefaultGradle Launcher.java:106) at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLaun cher.java:86) at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildCon troller.run(InProcessBuildActionExecuter.java:80) at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.jav a:33) at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.jav a:24) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProce ssBuildActionExecuter.java:36) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProce ssBuildActionExecuter.java:26) at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51) at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.jav a:171) at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction. execute(CommandLineActionFactory.java:237) at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction. execute(CommandLineActionFactory.java:210) at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRunti meValidationAction.java:35) at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRunti meValidationAction.java:24) at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute( CommandLineActionFactory.java:206) at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute( CommandLineActionFactory.java:169) at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionRep ortingAction.java:33) at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionRep ortingAction.java:22) at org.gradle.launcher.Main.doAction(Main.java:33) at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45) at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBoots trap.java:54) at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.j ava:35) at org.gradle.launcher.GradleMain.main(GradleMain.java:23) Caused by: org.gradle.api.artifacts.ResolveException: Could not resolve all depe ndencies for configuration ':classpath'. at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfigurat ion.rethrowFailure(DefaultLenientConfiguration.java:52) at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfigura tion.rethrowFailure(DefaultResolvedConfiguration.java:36) at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyR esolver$FilesAggregatingResolvedConfiguration.rethrowFailure(SelfResolvingDepend encyResolver.java:110) at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDep endencyResolver$ErrorHandlingResolvedConfiguration.rethrowFailure(ErrorHandlingA rtifactDependencyResolver.java:180) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration $ConfigurationFileCollection.getFiles(DefaultConfiguration.java:444) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration .getFiles(DefaultConfiguration.java:205) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration _Decorated.getFiles(UnkNown Source) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.defines criptHandlerClassScope(DefaultPluginRequestApplicator.java:142) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPl ugins(DefaultPluginRequestApplicator.java:60) at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl. apply(DefaultScriptPluginFactory.java:131) at org.gradle.configuration.project.Buildscriptprocessor.execute(BuildSc riptProcessor.java:39) at org.gradle.configuration.project.Buildscriptprocessor.execute(BuildSc riptProcessor.java:26) at org.gradle.configuration.project.ConfigureActionsprojectEvaluator.eva luate(ConfigureActionsprojectEvaluator.java:34) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(L ifecycleProjectEvaluator.java:59) ... 27 more Caused by: org.gradle.internal.resolve.ModuLeversionResolveException: Could not resolve com.android.tools.build:gradle:1.0.0. required by: :MyApplication:unspecified at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryCha inDependencyResolver.resolve(RepositoryChainDependencyResolver.java:81) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryCha inAdapter.resolve(RepositoryChainAdapter.java:69) at org.gradle.api.internal.artifacts.ivyservice.clientmodule.ClientModul eResolver.resolve(ClientModuleResolver.java:44) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder$ModuLeversionResolveState.resolve(DependencyGraphBuilder.java :577) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder$ModuLeversionResolveState.getMetaData(DependencyGraphBuilder. java:587) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder$DependencyEdge.calculateTargetConfigurations(DependencyGraphB uilder.java:272) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder$DependencyEdge.attachToTargetConfigurations(DependencyGraphBu ilder.java:246) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:156) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder.resolveDependencyGraph(DependencyGraphBuilder.java:94) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.Depe ndencyGraphBuilder.resolve(DependencyGraphBuilder.java:84) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDep endencyResolver$1.execute(DefaultDependencyResolver.java:122) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDep endencyResolver$1.execute(DefaultDependencyResolver.java:88) at org.gradle.internal.Transformers$4.transform(Transformers.java:136) at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager .withIvy(DefaultIvyContextManager.java:61) at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager .withIvy(DefaultIvyContextManager.java:39) at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDep endencyResolver.resolve(DefaultDependencyResolver.java:88) at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDepe ndencyResolver$1.run(CacheLockingArtifactDependencyResolver.java:42) at org.gradle.internal.Factories$1.create(Factories.java:22) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAcc ess.java:187) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAcc ess.java:175) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(De faultPersistentDirectoryStore.java:106) at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache. useCache(DefaultCacheFactory.java:187) at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManag er.useCache(DefaultCacheLockingManager.java:64) at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDepe ndencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:40) at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyR esolver.resolve(SelfResolvingDependencyResolver.java:45) at org.gradle.api.internal.artifacts.ivyservice.ShortcircuitEmptyConfigs ArtifactDependencyResolver.resolve(ShortcircuitEmptyConfigsArtifactDependencyRes olver.java:55) at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDep endencyResolver.resolve(ErrorHandlingArtifactDependencyResolver.java:47) at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationReso lver.resolve(DefaultConfigurationResolver.java:46) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration .resolveNow(DefaultConfiguration.java:250) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration .getResolvedConfiguration(DefaultConfiguration.java:240) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration _Decorated.getResolvedConfiguration(UnkNown Source) at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration $ConfigurationFileCollection.getFiles(DefaultConfiguration.java:442) ... 36 more Caused by: org.gradle.internal.resource.transport.http.HttpRequestException: Cou ld not GET 'https://jcenter.bintray.com/com/android/tools/build/gradle/1.0.0/gra dle-1.0.0.pom'. at org.gradle.internal.resource.transport.http.HttpClientHelper.performR equest(HttpClientHelper.java:80) at org.gradle.internal.resource.transport.http.HttpClientHelper.performR awGet(HttpClientHelper.java:66) at org.gradle.internal.resource.transport.http.HttpClientHelper.performG et(HttpClientHelper.java:70) at org.gradle.internal.resource.transport.http.HttpResourceAccessor.getR esource(HttpResourceAccessor.java:53) at org.gradle.internal.resource.transport.http.HttpResourceAccessor.getR esource(HttpResourceAccessor.java:36) at org.gradle.internal.resource.transfer.ProgressLoggingExternalResource Accessor.getResource(ProgressLoggingExternalResourceAccessor.java:39) at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResour ceAccessor.getResource(DefaultCacheAwareExternalResourceAccessor.java:72) at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExtern alResourceArtifactResolver.downloadStaticResource(DefaultExternalResourceArtifac tResolver.java:91) at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExtern alResourceArtifactResolver.resolveMetaDataArtifact(DefaultExternalResourceArtifa ctResolver.java:57) at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResou rceResolver.parseMetaDataFromArtifact(ExternalResourceResolver.java:162) at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResou rceResolver.resolveStaticDependency(ExternalResourceResolver.java:141) at org.gradle.api.internal.artifacts.repositories.resolver.MavenResolver .doResolveComponentMetaData(MavenResolver.java:82) at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResou rceResolver$RemoteRepositoryAccess.resolveComponentMetaData(ExternalResourceReso lver.java:391) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CacheLockRele asingModuleComponentsRepository$LockReleasingRepositoryAccess$2.run(CacheLockRel easingModuleComponentsRepository.java:65) at org.gradle.internal.Factories$1.create(Factories.java:22) at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(Def aultCacheAccess.java:237) at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(Def aultCacheAccess.java:308) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunning Operation(DefaultPersistentDirectoryStore.java:114) at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache. longRunningOperation(DefaultCacheFactory.java:179) at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManag er.longRunningOperation(DefaultCacheLockingManager.java:56) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CacheLockRele asingModuleComponentsRepository$LockReleasingRepositoryAccess.resolveComponentMe taData(CacheLockReleasingModuleComponentsRepository.java:63) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModule ComponentRepository$ResolveAndCacheRepositoryAccess.resolveComponentMetaData(Cac hingModuleComponentRepository.java:284) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.BaseModuleCom ponentRepositoryAccess.resolveComponentMetaData(BaseModuleComponentRepositoryAcc ess.java:38) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.memcache.InMe moryCachedModuleComponentRepository$CachedAccess.resolveComponentMetaData(InMemo ryCachedModuleComponentRepository.java:70) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMeta DataResolveState.process(ComponentMetaDataResolveState.java:70) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMeta DataResolveState.resolve(ComponentMetaDataResolveState.java:62) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryCha inDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:114) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryCha inDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:97) at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryCha inDependencyResolver.resolve(RepositoryChainDependencyResolver.java:70) ... 67 more Caused by: org.apache.http.conn.HttpHostConnectException: Connection to https:// jcenter.bintray.com refused at org.apache.http.impl.conn.DefaultClientConnectionoperator.openConnect ion(DefaultClientConnectionoperator.java:190) at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedCli entConnectionImpl.java:294) at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(Default RequestDirector.java:640) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultReq uestDirector.java:479) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpCl ient.java:906) at org.apache.http.impl.client.DecompressingHttpClient.execute(Decompres singHttpClient.java:137) at org.apache.http.impl.client.DecompressingHttpClient.execute(Decompres singHttpClient.java:118) at org.gradle.internal.resource.transport.http.HttpClientHelper.performH ttpRequest(HttpClientHelper.java:111) at org.gradle.internal.resource.transport.http.HttpClientHelper.executeG etorHead(HttpClientHelper.java:87) at org.gradle.internal.resource.transport.http.HttpClientHelper.performR equest(HttpClientHelper.java:78) ... 95 more Caused by: java.net.ConnectException: Connection timed out: connect at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFact ory.java:549) at org.apache.http.impl.conn.DefaultClientConnectionoperator.openConnect ion(DefaultClientConnectionoperator.java:180) ... 104 more BUILD Failed Total time: 45.485 secs
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
Android Systrace 使用方法
极力推荐文章:欢迎收藏 Android 干货分享
Systrace
允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android
内核的数据(例如CPU调度
程序,磁盘活动和应用程序线程)组合起来,以生成HTML
报告。
本篇文章主要介绍 Android
开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
- Systrace 简介
- Systrace 使用方法
- 使用命令行抓取 Systrace
- 使用Systrace 检测UI 性能
- 使用Systrace 检测警告以及掉帧问题
- 查看trace 文件的快捷键
- 代码中添加trace 标记具体分析问题所在
- 使用TraceView 分析trace Log
#1.Systrace 简介
Systrace 允许您在系统级别收集和检查设备上运行的所有进程的计时信息。 它将来自Android
内核的数据(例如CPU调度
程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。
2.Systrace 使用方法
抓取Systrace 的方法
如果想分析Android
系统或者app
的问题,首先我们需要抓取Systrace
文件分析并找出引起系统卡顿,或者app反应慢
的原因,然后在源码上解决引起慢的问题。
抓取Systrace 的方法:
- 首先链接手机,打开
Android Device Monitor
,选择要分析的进程(比如com.google.process.gapps
),点击Capture system wide trace using Android systrace
(下图右上角箭头所指的地方)
- 配置需要抓取Systrace的内容
此时根据不同的需求,配置抓取不同的trace
时间(时间请勿过长,否则会导致抓取内容部分丢失),内容等,然后点击OK
,操作要分析系统卡顿或app
运行缓慢的部分,系统会自动收集运行时的信息,然后用Chrome 浏览器打
开生成的trace
文件 。
注意: 假如抓取过多次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在
Android Device Monitor
的右下角,如下图所示
用Chrome 浏览器
打开生成的trace 文件
,如下图所示,里面会包含每个CPU,
以及图形渲染,输入事件等等内容。
抓取的Trace
报告提供了Android
系统进程在特定时间段内的整体情况。 它检查捕获的跟踪信息,并突出显示其检查到的问题,例如在显示运动或动画时UI粗糙
,并提供关于如何解决这些问题的建议。 但是,systrace
不会在应用程序进程中收集有关代码执行的信息。 有关您的应用程序执行哪些方法以及使用多少CPU资源
的更多详细信息,请使用Android Studio
的内置CPU分析器
,或生成跟踪日志并使用Traceview
查看它们。
3.使用命令行抓取 Systrace
本文档介绍了如何从命令行生成systrace
报告,浏览由该工具生成的跟踪文件,并使用它们来分析和提高应用程序用户界面(UI)
的性能。
抓取systrace
之前,请完成以下步骤:
- 下载并安装
Android SDK Tools
- 安装
Python ,
并将其包含在工作站的执行路径中。 - 连接手机,打开开发者选项中的
USB Debug
选项 。 Systrace
存储路径如下android-sdk/platform-tools/systrace/
使用命令行抓取 Systrace
的语法如下: python systrace.py [options] [categories]
例如,以下命令调用systrace
在10
秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtrace
的HTML
报告:
python systrace.py --time=10 -o mynewtrace.html gfx
如果不指定任何类别或选项,systrace
将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。
4.使用Systrace 检测UI 性能
systrace
对于检查应用程序的UI性能
特别有用,因为它可以分析您的代码和帧速率以识别问题区域并提供可能的解决方案。 开始,按照以下步骤进行:
- 连接手机并运行您的
app
。 - 使用以下命令运行systrace:
python systrace.py view --time = 10
- 操作您的应用 10秒后,
systrace
生成一个HTML报告。 - 使用网络浏览器打开HTML报告。
您现在可以与报告进行交互,以便在记录期间检查设备CPU
使用情况。 以下部分介绍如何检查报告中的信息以查找和修复UI性能问题
。
5. 使用Systrace 检测警告以及掉帧问题
如下报告列出了每个进程呈现UI帧,并指示沿着时间线的每个渲染帧。 在绿色框架
圆圈中指示在16.6毫秒内呈现的帧以保持每秒稳定60帧。 花费16.6毫秒以上渲染的帧用黄色
或红色
框圈表示。
注意: 在运行
Android 5.0(API级别21)
或更高版本的设备上, UI 渲染的工作是在UI Thread
和RenderThread
两个线程完成。 在之前的版本中,创建框架的所有工作都是在UI Thread
上完成的。
点击一个F框架圈
可以提供有关系统为渲染该框架而完成的工作的其他信息,包括警报。 它还向您展示了在渲染该框架时系统正在执行的方法,因此您可以调查这些方法是否导致UI jank
。
选择慢帧后,您可能会在报告的底部窗格中看到警报。 上图中显示的Alert
提出,框架的主要问题是在ListView
回收和重新绑定中花费了太多的时间。 跟踪中有相关事件的链接可以解释更多关于系统在这段时间内正在做什么的事情。
要查看工具在trace
中发现的每个Alert
以及设备触发Alert
的次数,请单击窗口最右侧的Alerts
选项卡,如下图所示。 Alerts
面板可帮助您查看发生了哪些问题,以及发生的频率。 将Alert
面板看作是要修复的错误列表, 通常情况下,一个区域的微小变化或改进可以消除应用程序中的全部警报。
如果你在UI Thread
上做太多的工作,你需要找出哪些方法消耗了太多的CPU时间
。 一种方法是添加跟踪标记(请参阅检测应用代码)到您认为会导致这些瓶颈的方法,以查看这些函数调用是否显示在systrace
中。 如果您不确定哪些方法可能会在UI线程上造成瓶颈,请使用Android Studio
的内置CPU分析器,
或者生成跟踪日志并使用Traceview
查看它们。
6. 查看trace 文件的快捷键
7. 代码中添加trace 标记具体分析问题所在
由于systrace
是在系统级显示有关进程的信息,因此很难在HTML
报告中的某个特定时间知道您的应用程序正在执行什么方法。 在Android 4.3(API级别18)
及更高版本中,您可以使用代码中的Trace
类在HTML
报告中标记执行事件。 您不需要用代码来记录systrace
的跟踪记录,但是这样做可以帮助您查看应用程序代码的哪些部分可能会导致线程挂起或UI断线。 这种方法与使用Debug
类不同,Trace
类简单地将标志添加到systrace
报告中,而Debug
类可帮助您通过生成.trace
文件来检查详细的app CPU
使用情况。
要生成包含已检测的跟踪事件的systrace HTML
报告,需要使用-a
或--app
命令行选项运行systrace
,并指定应用程序的包名称。
通常我们在怀疑引起jank代码地方,添加如下内容: Trace.beginSection("MyAdapter.onCreateViewHolder");
和 Trace.endSection();
,主要这两个是成对出现的。
多次调用beginSection(String)
时,调用endSection()
只会结束最近调用的beginSection(String)
方法。 因此,对于嵌套的调用,例如上面示例中的调用,您需要确保通过调用endSection()
将每个调用正确匹配到beginSection()
。
此外,您不能在一个线程上调用beginSection()
并从另一个线程结束 - 您必须从同一线程调用endSection()
。
8. 使用TraceView 分析trace Log
Traceview
是提供跟踪日志的图形表示的工具。 您可以通过使用Debug
类来设置代码来生成日志。 这种跟踪方法非常精确,因为您可以准确指定要启动的代码中的哪个位置,并停止记录跟踪数据。 如果尚未生成这些跟踪日志并将其从连接的设备保存到本地计算机,请转至通过检测应用程序生成跟踪日志。 使用Traceview
检查这些日志可帮助您调试您的应用程序并剖析其性能。
提示:可以使用命令行中的dmtracedump
来生成跟踪日志文件的图形调用堆栈图。
如果您不需要查看通过使用Debug
类检测应用程序来记录的跟踪日志,则可以使用Android Studio 3.0
及更高版本中包含的CPU
分析器来查看应用程序的线程和记录方法跟踪。
使用Android Device Monitor
可以查看trace Log内容,步骤如下,打开Android Device Monitor
,选择File
,然后打开*.trace log分析。 当然,你也可以使用Android Device Monitor
的图形按键进行trace
的抓取与查看。
打开跟踪日志后,Traceview
使用以下两个窗格显示日志数据:
-
- 时间轴窗格: 描述每个线程何时进入和退出方法的时间轴窗格
-
- 配置文件窗格: 总结每个线程在跟踪日志的执行期间的配置文件窗格 以下各节提供有关traceview输出窗格的附加信息。
1.时间轴窗格
每个线程的执行都显示在自己的进程中,并且时间向右增加。 每种方法都以不同的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),如下图所示。
2. 配置文件窗格
如下图所示,配置文件窗格提供了系统在跟踪日志期间执行的每种方法的列表以及执行这些方法所用的时间。 调用另一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您通过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。
对于每种方法(顶级节点),该表都显示包含和排他时间(以毫秒为单位)以及总时间的百分比。独占时间是执行方法自己的代码的时间,而包含时间是执行方法自己的代码的时间加上执行子程序的时间。定时信息也以CPU时间
和实时的方式报告。 CPU时间
只考虑线程主动使用CPU时间的时间
,实时提供绝对时间信息,从您的应用程序进入方法的时刻到退出该方法的时间 - 无论线程处于活动状态还是休眠状态。
对于配置文件窗格中的每个顶级节点,表中的Calls + Rec
,Calls / Total
列(图2中未显示)将报告该方法的调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。
Traceview 已知问题
Traceview
日志记录不能很好地处理线程,导致以下问题:
-
1.如果线程在分析期间退出,线程名称不会被发射
(在Android 5.1及更高版本中被修复)
。 -
- 虚拟机重用线程ID。 如果一个线程停止,另一个线程开始,他们可能会得到相同的ID。
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
今天关于android – Systrace没有为–set-tags提供这样的选项错误和androidstudio没有systemimage的介绍到此结束,谢谢您的阅读,有关Android API 8,10 ContactsContract.Data.HAS_PHONE_NUMBER没有这样的列、Android Studio 中 System Trace 的新增功能、Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu、Android Systrace 使用方法等更多相关知识的信息可以在本站进行查询。
本文标签: