【问题标题】:Why can an app run in real device by Android Studio and failed by install?为什么Android Studio可以在真实设备上运行应用程序并安装失败?
【发布时间】:2021-03-20 04:17:30
【问题描述】:

我从 Android Studio 在真机(Android 7.0 Table)上运行一个应用,没关系。

现在我创建应用的 APK 文件,然后将其安装到我的真实设备上,完成运行应用。

我收到以下错误,为什么?

为什么一个应用可以通过Android Studio在真机上运行而安装失败?

E:\>cd E:\Android_SDK\platform-tools

E:\Android_SDK\platform-tools>adb logcat --buffer=crash

03-20 12:05:29.378 15996 15996 E AndroidRuntime: FATAL EXCEPTION: main
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Process: info.dodata.voicerecorder, PID: 15996
03-20 12:05:29.378 15996 15996 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{info.dodata.voicerecorder/info.dodata.voicerecorder.ui.ActivityMain}: android.view.InflateException: Binary XML file line #25: Binary XML file line #25: Error inflating class fragment
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2804)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2875)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.-wrap12(ActivityThread.java)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1578)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:105)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:156)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6617)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #25: Binary XML file line #25: Error inflating class fragment
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Caused by: java.lang.RuntimeException: Exception inflating info.dodata.voicerecorder:navigation/nav_graph line 66
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.q.r.c()
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at androidx.navigation.NavController.j(:2)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at androidx.navigation.fragment.NavHostFragment.L(:32)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.m.b.r.U(:19)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.m.b.p.onCreateView(:5)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.m.b.e.onCreateView(:4)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:738)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.rInflate(LayoutInflater.java:869)03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:832)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.b.c.n.v()
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.b.c.k.setContentView()
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at info.dodata.voicerecorder.ui.ActivityMain.onCreate(:2)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:6910)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2757)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2875)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.-wrap12(ActivityThread.java)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1578)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:105)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:156)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6617)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: info.dodata.voicerecorder.model.MVoice
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.q.r.d(:1)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.q.r.b(:1)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at g.q.r.b(:27)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        ... 28 more
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: info.dodata.voicerecorder.model.MVoice
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.Class.classForName(Native Method)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.Class.forName(Class.java:400)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.Class.forName(Class.java:326)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        ... 31 more
03-20 12:05:29.378 15996 15996 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "info.dodata.voicerecorder.model.MVoice" on path: DexPathList[[zip file "/data/app/info.dodata.voicerecorder-1/base.apk"],nativeLibraryDirectories=[/data/app/info.dodata.voicerecorder-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
03-20 12:05:29.378 15996 15996 E AndroidRuntime:        ... 34 more

添加内容

致阿明:谢谢!

当我在 Android Studio 中运行我的应用时,它可以正常运行。

为了缩小文件大小,我在 Build.gradle 中使用了 Code A,但它可能会导致我在安装和运行单独的 apk 文件时没有映像的错误。

你的意思是我应该像 Code B 一样处理我的课程吗?太复杂了。

顺便说一句,我觉得“minifyEnabled true”太可怕了,缩小的apk文件只会导致运行时出错,我无法在Android Studio中测试。

代码 A

   Build.gradle
    
        buildTypes {
            release {
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        debug {
        }
    }

代码 B

-keep public class info.dodata.voicerecorder.model.** 
{
  public protected *;
}

【问题讨论】:

    标签: android android-studio


    【解决方案1】:

    我觉得 proguard/R8 已经删除了 info.dodata.voicerecorder.model.MVoice 类,因为我在包名称中没有看到 .debug 后缀,我假设您正在安装启用了 minify 的发布变体。 尝试使用以下方法保留您的模型类,或禁用 minify 以找出是否是原因

    -keep public class info.dodata.voicerecorder.model.** 
    {
      public protected *;
    }
    

    【讨论】:

    • 谢谢!当我将minify设置为false时就可以了
    • 还有,minify 太可怕了,太可怕了,太可怕了!!!您知道应用程序可以通过 Android Studio 在真实设备上运行,但安装失败。我不会通过Google Play下载和安装来测试应用程序,我不会发现大错误!!!
    • Android Studio 是否测试minify? Android Studio 有没有给开发者警告信息?
    • @HelloCW 我不知道你所说的测试缩小是什么意思,但我通常也会在调试变体上启用缩小,并保留应该保留的类/方法/属性而不是跨度>
    • @HelloCW 是的,您是对的,但是如果您禁用它,人们可以轻松地反编译您的代码并通过一些简单的点击获取您 99% 的源代码。这有点像将您的源代码发布到 google play,公开可用:D
    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2018-10-29
    • 2021-03-05
    • 2018-11-07
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多