Создайте в существующий проект, без виртуального метода Int

#android #android-jetpack-compose

Вопрос:

Не могу заставить compose запускаться в существующем проекте kotlin/native в течение месяца, пытаясь установить пример приветствия по умолчанию для splash вместо пользовательского интерфейса, не могу сделать это:

 java.lang.NoSuchMethodError: No virtual method Int$class-SplashActivity()I in class Lcom/a/b/c/activity/LiveLiterals$SplashActivityKt; or its super classes (declaration of 'a.b.c.ui.activity.LiveLiterals$SplashActivityKt' appears in /data/app/a.b.c.develop-7Zjdfjfy762lPctajg==/base.apk!classes29.dex)
    at a.b.c.ui.activity.SplashActivity.<clinit>
    at java.lang.Class.newInstance(Native Method)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
    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)
 

Да, сбой перед началом активности.

котлин 1.5.21

compose_version = 1.0.2

mTargetSdkVersion=30(я устал от слияния манифестов при каждой синхронизации, поэтому нет 31, пока я не запущу все это)

mCompileSdkVersion=31

mMinSdkVersion=21

сборка на уровне проекта.gradle:

     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath "com.android.tools.build:gradle:7.1.0-alpha12"
    classpath "gradle.plugin.com.wiredforcode:gradle-spawn-plugin:0.8.2"
    classpath "com.google.gms:google-services:4.3.10"
    classpath "com.google.firebase:firebase-crashlytics-gradle:2.7.1"
 

сборка модуля Android.gradle(не весь файл, его существующий проект):

 implementation "com.android.support:recyclerview-v7:28.0.0"
implementation "com.android.support.constraint:constraint-layout:2.0.4"
implementation "com.android.support:cardview-v7:28.0.0"

implementation "androidx.activity:activity-ktx:1.4.0-alpha02"
implementation "androidx.appcompat:appcompat:1.4.0-alpha03"
implementation "com.google.accompanist:accompanist-appcompat-theme:0.18.0"
implementation "com.google.android.material:material:1.5.0-alpha03"

implementation "androidx.navigation:navigation-fragment-ktx:2.4.0-alpha09"
implementation "androidx.navigation:navigation-compose:2.4.0-alpha09"

implementation 'androidx.core:core-ktx:1.7.0-beta01'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-beta01'

implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.activity:activity-compose:1.4.0-alpha02'

implementation "androidx.tracing:tracing-ktx:1.0.0"

implementation "androidx.multidex:multidex:2.0.1"


implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2"

also contains pushwoosh, appsflyer, crashlytics, junit tests(does impact compose libs?)
 

ПРАВКА: pushwoosh, appsflyer, crashlytics был удален ради теста, ничего не исправил.

Понижение рейтинга до версии 1.0.1 и стабильный androidx ничего не сделали

Комментарии:

1. добавлена ли активность всплеска в ваш манифест?

2. @Ritt да, существующий проект

3. Пожалуйста, поделитесь кодом заставки.

4. @RajshekharYadav он пуст, там ничего нет

Ответ №1:

Проблема в том, что ваш SDK для компиляции равен 31, вы настраиваете API 31 (Android 12) и не устанавливаете экспортированный атрибут.

Вам нужно указать android:exported="true" в манифесте.

Если ваше приложение предназначено для Android 12 и содержит действия, службы или широковещательные приемники, использующие фильтры намерений, необходимо явно объявить атрибут android: экспортированный для этих компонентов приложения.

 <activity
    android:name=".SplashActivity"
    android:exported="true"
    android:theme="@style/Theme.Demo.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
 

Для получения дополнительной информации ознакомьтесь с документацией.

Комментарии:

1. как я уже сказал, я устал от слияния манифестов, поэтому сейчас их 30, значит, было 31, значит, все было помечено как экспортированное=true в манифесте, прежде чем я устал от слияния манифестов

2. Измените API на 31 и используйте последнюю версию compose.

3. Используйте Kotlin 1.5.30 с последней версией compose. Я протестировал его, и он работает.

4. как я уже говорил в «баунти», все это работает на пустом проекте. пожалуйста, прочтите сообщение

Ответ №2:

 //contains 99% common code, now contains Compose view 
open class AppLegasyFlavorActivity

//absolutely empty for default flavor
class SplashActivity : AppLegasyFlavorActivity()
 

По какой-то причине вы не можете этого сделать с 1.0.2 compose. У вашего ребенка должно быть переопределено onCreate(даже если это просто суперзвонок). Я удалил ненужные родительские вещи, сделал рефакторинг ароматов, и все сработало. Эта странная ошибка привела к тому, что котлин не может понять класс Int. На переднем крае технологических путей, я думаю.