不同构建变体的应用程序类在某些设备上崩溃

6
我已修改了build.gradle,根据构建变量(debug / release)使用不同的Application类。
我在文件夹“debug”中添加了两个WrapperApplication类,并在文件夹“release”中添加了第二个类,这两个类都扩展了某些基本Application类。
AndroidManifest中,我指向com.my.package.WrapperApplication,它确实使用了正确的应用程序。 发布测试apk到Play时,我收到了一个预启动报告,说我的新版本在13台设备中的2台(Moto G和Moto X)上崩溃了。
我想知道为什么会崩溃,如果构建有问题,为什么它对我和其他11台测试设备有效。
以下是我收到的堆栈:
 FATAL EXCEPTION: main
 Process: com.my.package, PID: 16348
 java.lang.RuntimeException: Unable to instantiate application com.my.package.WrapperApplication: java.lang.IllegalStateException: Unable to get package info for com.my.package; is package not installed?
    at android.app.LoadedApk.makeApplication(LoadedApk.java:516)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4398)
    at android.app.ActivityThread.access$1500(ActivityThread.java:139)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5102)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalStateException: Unable to get package info for com.my.package; is package not installed?
    at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:376)
    at android.app.LoadedApk.getClassLoader(LoadedApk.java:329)
    at android.app.LoadedApk.makeApplication(LoadedApk.java:508)
    ... 11 more

谢谢。

编辑:

以前我们使用以下方法,但是使用特定于变体的文件夹对于我们的构建系统更加清晰,因此我们希望切换到它。

以前的方法:

AndroidManifest:

<application
    android:name="${application}"
    ... />

build.gradle:

debug {
    manifestPlaceholders = [application:".Application1"]
}
release {
    manifestPlaceholders = [application: ".Application2"]
}

你在发布时也会更改包名吗? - Eugen Martynov
@EugenMartynov 我有4个构建变体:debug/release和flavor1/flavor2。软件包名称根据口味而不是构建类型而异。 - marmor
好的,不知道原因,但我们通常做的是 - 有一个主应用程序,并通过覆盖基类中的方法或注入不同的策略类来改变变体逻辑。 - Eugen Martynov
我们确实一直使用了不同的构建方法,但我想改用这个新的方法,详见我上面的编辑。 - marmor
1个回答

5
我不知道问题的原因。但我们采取了不同的方法:
  1. We have base Application with common functionality and it also contains protected methods for future behaviour modification:

    public class MyApp extends application {
        public void onCreate() {
            super.onCreate();
            initLogging();
        }
    
        protected void initLogging() {}
    }
    
  2. We create another app in flavour or build configuration source folder and override behaviour:

    public class DebugMyApp extends MyApp {
        @Override
        protected void initLogging() {
            //init Stetho
        }
    }
    
  3. We also create another AndroidManifest.xml in flavour or build configuration source folder where we override application name:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest
        package="com.philips.pins.ugrow"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"><application
            android:name=".DebugMyApp"
            android:label="@string/app_name"
            tools:replace="android:name,android:label">
    
            <activity android:name="net.hockeyapp.android.UpdateActivity"/>
        </application></manifest>
    

不需要扩展应用程序,您可以定义两个不同的应用程序类,但必须在清单文件中正确定义它们。


这与我们之前的实现非常相似,唯一的区别是我们使用了一个manifestPlaceholders变量${application}来代替通过清单文件覆盖应用程序名称。我尝试切换回这种方法,但在HTC One上进行Play预启动测试时仍然遇到了相同的崩溃问题。仍然不知道原因。 - marmor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接