Android Studio 应用程序可在模拟器中运行,但不能在真实设备上运行

Posted

技术标签:

【中文标题】Android Studio 应用程序可在模拟器中运行,但不能在真实设备上运行【英文标题】:Android Studio app works in emulator but not on a real device 【发布时间】:2017-05-01 23:28:57 【问题描述】:

我是 android 编程的新手,并且在使用它时遇到了很多麻烦。我终于让我的应用程序在 API 23 和 16 上的模拟器中运行,我的目标是 API 16。它在模拟器上运行没有问题,但是当我尝试在我的手机上使用它时(Google Nexus 5 API 23)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:gravity="center"
    android:orientation="vertical"
    android:background="#F44336"
    android:id="@+id/background"
    tools:context="thereisstuffhere.MainActivity">

    <TextView
        android:layout_
        android:layout_
        android:text="Hello World!"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/factTextBox"
        android:textSize="25dp"
        android:textColor="#fff"/>
</LinearLayout>


package there is stuff here too;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity 

    TextView factBox;
    LinearLayout bg;
    Facts factHolder = new Facts(this);
    Backgrounds backs = new Backgrounds();
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        factBox = (TextView) findViewById(R.id.factTextBox);
        factBox.setText(factHolder.nextFact());
        bg = (LinearLayout) findViewById(R.id.background);
        bg.setBackgroundColor(getResources().getColor(backs.getBackground()));
        bg.setOnTouchListener(new OnSwipeTouchListener(this)
        
            public void onSwipeTop()
            
                //Toast.makeText(MainActivity.this, "top", Toast.LENGTH_SHORT).show();
            
            public void onSwipeRight()
            
                //Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
                prev();
            
            public void onSwipeLeft()
            
                //Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
                next();
            
            public void onSwipeBottom()
            
                //Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show();
            
            public boolean onTouch(View v, MotionEvent event) 
                return gestureDetector.onTouchEvent(event);
            
        );
    

    private void next() 
        factBox.setText(factHolder.nextFact());
        bg.setBackgroundColor(getResources().getColor(backs.getBackground()));
    

    private void prev() 
        factBox.setText(factHolder.prevFact());
        bg.setBackgroundColor(getResources().getColor(backs.getBackground()));
    

    public void genFact(View view)
    
        factBox.setText(factHolder.nextFact());
    

Facts.java 只包含一个巨大的列表和两个返回列表中下一个或上一个字符串的函数

Backgrounds.java 基本上做同样的事情,只是它使用整数列表和 colors.xml 文件来存储标签等

这是我的 OnTouchListener 类:

package stuff be here;

import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class OnSwipeTouchListener implements OnTouchListener 
    final GestureDetector gestureDetector;

    public OnSwipeTouchListener(Context ctx)
    
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent)
    
        return false;
    

    private final class GestureListener extends SimpleOnGestureListener

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e)
        
            return true;
        

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
        
            boolean result = false;
            try
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if(Math.abs(diffX) > Math.abs(diffY))
                    if(Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD)
                        if(diffX > 0)
                            onSwipeRight();
                        else
                            onSwipeLeft();
                        
                    
                    result = true;
                
                else if(Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD)
                    if(diffY > 0)
                        onSwipeBottom();
                    else
                        onSwipeTop();
                    
                
                result = true;
             catch (Exception exception)
                exception.printStackTrace();
            
            return result;
        
    
    public void onSwipeRight()
    public void onSwipeLeft()
    public void onSwipeTop()
    public void onSwipeBottom()

我为所有的代码道歉,但我已经尝试修复了一段时间,但无济于事。当我尝试像“使用引导类加载器找不到类;没有可用的堆栈跟踪”和“无法实例化活动 ComponentInf ...”之类的运行时遇到很多错误,我还收到一些警告,例如“ClassLoader 引用了未知路径: /data/app/packagenamehere-1/lib/x86_64 和 /data/app/packagenamehere-1/lib/arm" 即使在模拟器中运行

这是我的日志猫文件:

12-16 17:26:25.167 22237-22237/com.ubiquity.sciencefacts I/art: Late-enabling -Xcheck:jni
12-16 17:26:25.197 22237-22243/com.ubiquity.sciencefacts I/art: Ignoring second debugger -- accepting and dropping
12-16 17:26:25.203 22237-22243/com.ubiquity.sciencefacts I/art: Debugger is no longer active
12-16 17:26:25.211 22237-22243/com.ubiquity.sciencefacts W/art: Suspending all threads took: 7.324ms
12-16 17:26:25.235 22237-22237/com.ubiquity.sciencefacts W/System: ClassLoader referenced unknown path: /data/app/com.ubiquity.sciencefacts-2/lib/arm
12-16 17:26:25.248 22237-22237/com.ubiquity.sciencefacts D/AndroidRuntime: Shutting down VM
12-16 17:26:25.254 22237-22237/com.ubiquity.sciencefacts E/AndroidRuntime: FATAL EXCEPTION: main
12-16 17:26:27.065 22237-22237/com.ubiquity.sciencefacts I/Process: Sending signal. PID: 22237 SIG: 9
12-16 17:33:18.574 24986-24986/com.ubiquity.sciencefacts W/System: ClassLoader referenced unknown path: /data/app/com.ubiquity.sciencefacts-1/lib/arm
12-16 17:33:18.662 24986-24986/com.ubiquity.sciencefacts D/AndroidRuntime: Shutting down VM
12-16 17:33:18.673 24986-24986/com.ubiquity.sciencefacts E/AndroidRuntime: FATAL EXCEPTION: main
12-16 17:33:20.800 24986-24986/com.ubiquity.sciencefacts I/Process: Sending signal. PID: 24986 SIG: 9
12-16 17:34:15.668 25845-25845/com.ubiquity.sciencefacts W/System: ClassLoader referenced unknown path: /data/app/com.ubiquity.sciencefacts-1/lib/arm
12-16 17:34:15.687 25845-25845/com.ubiquity.sciencefacts D/AndroidRuntime: Shutting down VM
12-16 17:34:15.693 25845-25845/com.ubiquity.sciencefacts E/AndroidRuntime: FATAL EXCEPTION: main
12-16 18:00:52.080 2640-2640/com.ubiquity.sciencefacts I/art: Not late-enabling -Xcheck:jni (already on)
12-16 18:00:52.142 2640-2640/com.ubiquity.sciencefacts W/System: ClassLoader referenced unknown path: /data/app/com.ubiquity.sciencefacts-1/lib/x86_64
12-16 18:00:52.568 2640-2640/com.ubiquity.sciencefacts W/System: ClassLoader referenced unknown path: /data/app/com.ubiquity.sciencefacts-1/lib/x86_64
12-16 18:00:52.805 2640-2640/com.ubiquity.sciencefacts W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
12-16 18:00:53.993 2640-2646/com.ubiquity.sciencefacts W/art: Suspending all threads took: 633.582ms
12-16 18:00:54.020 2640-2716/com.ubiquity.sciencefacts D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
12-16 18:00:54.063 2640-2716/com.ubiquity.sciencefacts I/OpenGLRenderer: Initialized EGL, version 1.4
12-16 18:00:54.091 2640-2716/com.ubiquity.sciencefacts E/EGL_emulation: tid 2716: eglSurfaceAttrib(1165): error 0x3009 (EGL_BAD_MATCH)
12-16 18:00:54.091 2640-2716/com.ubiquity.sciencefacts W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7f8b8ec90c40, error=EGL_BAD_MATCH
12-16 18:34:41.488 27869-27869/com.ubiquity.sciencefacts I/art: Late-enabling -Xcheck:jni
12-16 18:34:41.561 27869-27869/com.ubiquity.sciencefacts W/System: ClassLoader referenced unknown path: /data/app/com.ubiquity.sciencefacts-2/lib/arm
12-16 18:34:41.586 27869-27869/com.ubiquity.sciencefacts D/AndroidRuntime: Shutting down VM
12-16 18:34:41.589 27869-27869/com.ubiquity.sciencefacts E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.ubiquity.sciencefacts, PID: 27869
                                                                           java.lang.RuntimeException: Unable to instantiate activity ComponentInfocom.ubiquity.sciencefacts/com.ubiquity.sciencefacts.MainActivity: java.lang.ClassNotFoundException: Didn't find class "com.ubiquity.sciencefacts.MainActivity" on path: DexPathList[[zip file "/data/app/com.ubiquity.sciencefacts-2/base.apk"],nativeLibraryDirectories=[/data/app/com.ubiquity.sciencefacts-2/lib/arm, /vendor/lib, /system/lib]]
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                            Caused by: java.lang.ClassNotFoundException: Didn't find class "com.ubiquity.sciencefacts.MainActivity" on path: DexPathList[[zip file "/data/app/com.ubiquity.sciencefacts-2/base.apk"],nativeLibraryDirectories=[/data/app/com.ubiquity.sciencefacts-2/lib/arm, /vendor/lib, /system/lib]]
                                                                               at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                                               at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                                                                               at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                                                                               at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                               at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:148) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                                                                            Suppressed: java.lang.ClassNotFoundException: com.ubiquity.sciencefacts.MainActivity
                                                                               at java.lang.Class.classForName(Native Method)
                                                                               at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
                                                                               at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
                                                                               at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                                                                                    ... 12 more
                                                                            Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
12-16 18:34:43.772 27869-27869/com.ubiquity.sciencefacts I/Process: Sending signal. PID: 27869 SIG: 9

重要更新:我将程序构建为 apk 并使用它安装在我的手机上,它可以正常工作。这是否意味着下面在 cmets 中所说的目标错误?这会影响我的应用程序的分发(以供将来参考,我实际上并没有分发它)?

【问题讨论】:

不要在日志崩溃的地方道歉 请复制粘贴您的日志猫文件。 您是否使用了任何权限?如果是,那么您将必须编写运行时代码以请求允许您的应用程序在 API 23(或更高版本)上正常工作。此外,目标 API 应始终大于两者(在您的情况下为 23 而不是 16)。 请提供 Android Studio 显示的所有 logcats 我不相信我正在使用任何权限,这是一个非常简单的应用程序有没有办法找出我是否在使用。我正在尝试让应用程序在大于 16 的 API 上运行。我是 android 编程新手,所以我不确定您是否说我应该在创建项目时使用 23? 【参考方案1】:

关于您的错误,似乎缺少一些 SDK。

检查您的 SDK 管理器是否已安装所有需要的 SDK 和 SDK 工具。

【讨论】:

这是在我的电脑上吧?我不确定我还需要什么。我相信我拥有一切,尽管我在 jdk 和 sdk 上遇到了很多问题 基本上需要安装JDK和Android Studio。 Android Studio 应该自己安装所有需要的 SDK,但有时它会遇到可怕的错误。 如果 Android Studio 一切正常,您还可以检查您的 build.gradle 文件和您尝试更改目标版本的清单 Didi,如您帖子下方的 cmets 中所述? 1.清理并运行它会工作的项目或删除即时运行并在设备中运行 我相信我现在有 jdk 工作。我已经运行了 sdk 并下载了所有默认选择的文件和我正在使用的 API。这应该够吗?我不确定我应该如何更改目标版本。我希望我的应用能够在高于 API 16 的所有设备上运行【参考方案2】:

在你的 build.gradle 中使用 multidexEnabled:

defaultConfig 
     multiDexEnabled true

清理、构建并运行

【讨论】:

这真的是个问题吗?我的极其简单的应用程序肯定没有超过 64k 的引用吗?【参考方案3】:

您还可以检查您的 Build.Gradle 文件。 在您的情况下,它应该如下所示:

android 
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig 
        minSdkVersion 16
        targetSdkVersion 23
    

    buildTypes 
        debug 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    

确保通过将 minifyEnabled 设置为 false 来禁用 proguard。这可以确保这不会导致其他错误;)

【讨论】:

【参考方案4】:

在大多数情况下,只需 cleaningrebuilding 项目就可以解决问题。

【讨论】:

【参考方案5】:

尝试启用 USB 调试模式。 Here's一本手册

【讨论】:

【参考方案6】:

当您使用连接到 Android Studio 的 USB 电缆调试/运行您的应用程序时,对于某些设备,当您卸载该应用程序并尝试通过 Studio 再次运行它时,它会显示目标错误。

为此,在您卸载应用程序后,只需断开设备与 USB 数据线的连接并重新连接即可。

【讨论】:

【参考方案7】:

如果以上都不起作用,则出于其他可能的原因。

我的应用在模拟器中运行没有问题,但无法在 Pixel 设备上运行。我在应用程序的清单中有以下行:

android:testOnly="true"

删除此行后,该应用程序在设备上完美运行。

【讨论】:

以上是关于Android Studio 应用程序可在模拟器中运行,但不能在真实设备上运行的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 应用程序可在真实设备上运行,但无法在模拟器上运行

Android Studio安装超详细步骤(包括SDK安装不成功,模拟器无法创建等问题)

如何在 android studio 模拟器中运行 ionic 应用程序?

Android 模拟器未在 Visual Studio 中显示

当我在 Android Studio 中运行 Android 应用程序时,它没有安装在模拟器或设备上

无法在 Android Studio 中启动模拟器