android - 如何创建一个新的 Android Wear 项目并在设备上运行它?
问题描述
这个问题说明了一切。不幸的是,它不像创建一个新项目、连接一个设备并按下运行按钮那么简单。以下是详细信息:
我正在尝试创建一个仅适用于 Wear OS的新应用(即不支持手机或平板电脑)。API 级别设置为 28 (Android 8),带有空白磨损活动。完成新项目向导后,Android Studio 会以闪亮的红色字母打印以下欢迎消息:
Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:9:5-35:19 to override.
按照建议并添加tools:replace="android:appComponentFactory"
到<application>
AndroidManifest.xml 中的元素将错误消息更改为:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs
at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:540)
at com.android.build.gradle.tasks.MergeManifests.doFullTaskAction(MergeManifests.java:173)
at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
... 33 more
这并没有让它变得更好......恢复清单修改和谷歌搜索根本原因(清单合并失败)似乎是更好的方法,这导致了这里的答案,建议在以下位置添加以下两行gradle.properties
:
android.useAndroidX=true
android.enableJetifier=true
最后它建立了!但是,该应用程序在尝试在手表上运行时会立即崩溃:
--------- beginning of crash
2019-09-04 15:34:08.435 7341-7341/weartest.com.weartest E/AndroidRuntime: FATAL EXCEPTION: main
Process: weartest.com.weartest, PID: 7341
java.lang.RuntimeException: Unable to start activity ComponentInfo{weartest.com.weartest/weartest.com.weartest.MainActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class android.support.wear.widget.BoxInsetLayout
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class android.support.wear.widget.BoxInsetLayout
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class android.support.wear.widget.BoxInsetLayout
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.wear.widget.BoxInsetLayout" on path: DexPathList[[zip file "/system/framework/com.google.android.wearable.jar", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/base.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_dependencies_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_resources_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_0_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_1_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_2_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_3_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_4_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_5_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_6_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_7_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_8_apk.apk", zip file "/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/lib/arm, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.view.LayoutInflater.createView(LayoutInflater.java:606)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:419)
at android.app.Activity.setContentView(Activity.java:2669)
at weartest.com.weartest.MainActivity.onCreate(MainActivity.java:14)
at android.app.Activity.performCreate(Activity.java:7009)
at android.app.Activity.performCreate(Activity.java:7000)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
2019-09-04 15:34:08.437 7331-7331/? W/app_process: Could not reserve sentinel fault page
2019-09-04 15:34:08.459 7341-7341/weartest.com.weartest E/AndroidRuntime: at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Suppressed: java.io.IOException: No original dex files found for dex location /data/app/weartest.com.weartest-siv6gP9D5m9OQwHrsoFU8g==/split_lib_resources_apk.apk
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:353)
at dalvik.system.DexFile.<init>(DexFile.java:100)
at dalvik.system.DexFile.<init>(DexFile.java:74)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:374)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:337)
at dalvik.system.DexPathList.<init>(DexPathList.java:157)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:65)
at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:73)
at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:88)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:69)
at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:35)
at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:693)
at android.app.LoadedApk.getClassLoader(LoadedApk.java:727)
at android.app.LoadedApk.getResources(LoadedApk.java:954)
at android.app.ContextImpl.createAppContext(ContextImpl.java:2270)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5639)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
... 6 more
所以这也不是正确的解决方法......
您有什么想法吗?创建一个新项目并在设备上运行它应该可以开箱即用,但似乎有些东西严重损坏了。
顺便提一句。使用 Android Studio 版本 3.2.1,带有 SDK 平台工具 29.0.2 和 SDK 工具 26.1.1。安装了 SDK 21 到 29。
任何建议如何让一个空的磨损项目运行表示赞赏,谢谢。
解决方案
看起来依赖关系有些问题。实际上,我从来没有遇到过这样的问题,第一个建议是更新 andorid studio,然后创建新的 wear os 项目并尝试在不做任何更改的情况下运行它。
如果这没有帮助,其他一些解决方案可能是删除磨损类的使用和所有磨损特定的依赖项,只留下
< 使用功能 android:name="android.hardware.type.watch" />
在清单文件中,然后尝试运行默认的 Android 活动。
推荐阅读
- kubernetes - 一个集群 k8s 可以容纳多少个命名空间?
- java - Coretto Java 浮点数
- powershell - PowerShell index[0] 到字符串的第一个实例, index[1] 到第二个实例,依此类推,直到完成
- scala - 参考上传的JAR库
- github - GitHub 回溯到上一次推送
- javascript - 如何在另一个函数中调用一个函数
- ibm-mobilefirst - MFP_PERSISTENT_DATA 截断问题
- javascript - 将 UInt8Array 数组转换为 ArrayBuffer 的最有效方法?
- pandas - 使用 pandas 根据其他列中的条件创建一个新的 ID 列
- javascript - 如何检测对话框“在 appName 中打开此页面”中的按钮已被单击