每个构建变体的不同Application类在某些设备上崩溃

时间:2016-05-30 13:51:29

标签: android android-studio android-gradle build.gradle

我已根据构建变体(build.gradle / Application)修改了我的debug以使用不同的release类。

我在文件夹“WrapperApplication”中添加了两个debug类,在文件夹“release”中添加了第二个类,这两个类都扩展了一些基类Application类。

AndroidManifest中,我指向com.my.package.WrapperApplication,它确实使用了正确的 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 。 当发布测试apk到Play时,我得到了一个预启动报告,我的新版本在测试的13个设备中的2个(Moto G和Moto X)上崩溃。

很想知道它为什么会崩溃,如果构建中出现问题,它对我和其他11个测试设备是如何工作的。

这是我收到的堆栈:

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

感谢。

修改

以前我们使用了以下方法,但使用特定于变体的文件夹对于我们的构建系统来说更清晰,所以我们很乐意切换到它。

以前的方法:

AndroidManifest:

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

的build.gradle:

//setup the service
var queue = commonmq.connect('amqp://localhost:5672/queue');

queue.on('message', function(message) {
  console.log('Got a new message', message);
  //do something
});
//listen eventually on other events (error, ready)

1 个答案:

答案 0 :(得分:4)

我不知道问题的原因是什么。但我们正在采取不同的方法:

  1. 我们的基础Application具有通用功能,并且还包含用于将来行为修改的受保护方法:

    public class MyApp extends application {
        public void onCreate() {
            super.onCreate();
            initLogging();
        }
    
        protected void initLogging() {}
    }
    
  2. 我们在flavor或build配置源文件夹中创建另一个应用程序并覆盖行为:

    public class DebugMyApp extends MyApp {
        @Override
        protected void initLogging() {
            //init Stetho
        }
    }
    
  3. 我们还在flavor或build配置源文件夹中创建了另一个AndroidManifest.xml,我们覆盖了应用程序名称:

    <?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>
    
  4. 确实没有必要扩展应用程序,您可以定义两个不同的应用程序类,但只需在清单文件中正确定义它们。