Страницы

Поиск по вопросам

четверг, 21 февраля 2019 г.

Долгий запуск android приложения

Очень долго запускается приложение (в этом примере 40 секунд) если запуск происходит впервые, потом запускается быстро.
Пробовал на простой активности (хотя есть и рабочие):
public class SplashActivity extends Activity {
private static final String TAG = "SplashActivity";
@Override public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); }
@Override public void onStart() { Log.d(TAG, "onStart"); super.onStart(); }
@Override public void onResume() { Log.d(TAG, "onResume"); super.onResume(); } }
Проект состоит из двух рабочих модулей.
Модуль app:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.0' compile 'com.android.support:design:23.2.0' apt "org.androidannotations:androidannotations:$AAVersion" compile "org.androidannotations:androidannotations-api:$AAVersion" testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' compile 'com.github.ParkSangGwon:TedPermission:v1.0.8' compile 'com.vk:androidsdk:1.6.5' compile 'com.fasterxml.jackson.core:jackson-core:2.4.1' compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.1' compile 'com.fasterxml.jackson.core:jackson-databind:2.4.1' compile project(':libw') }
Модуль libw:
dependencies { compile 'com.google.guava:guava:18.0' compile 'com.android.support:support-v4:22.1.1'
compile 'com.google.http-client:google-http-client:1.19.0' compile 'com.google.http-client:google-http-client-android:1.19.0' compile 'com.google.http-client:google-http-client-jackson2:1.19.0' compile 'com.google.oauth-client:google-oauth-client:1.19.0' compile 'com.google.code.gson:gson:2.4' compile 'com.google.code.findbugs:jsr305:3.0.0' compile 'com.google.protobuf:protobuf-java:2.6.1'
compile 'com.fasterxml.jackson.core:jackson-core:2.5.0' compile('com.crashlytics.sdk.android:crashlytics:2.5.7@aar') { transitive = true; } compile files('libs/m3u8parser-0.2.jar')
jaxDoclet("com.google.doclava:doclava:1.0.5") classpaths fileTree(dir: 'build/classes/release').matching { include 'io/x/sdk/S.java' } }
Лог:
07-04 17:18:37.893 31219-31219/com.sapp W/System: ClassLoader referenced unknown path: /data/app/com.sapp-1/lib/arm 07-04 17:19:17.429 31219-31219/com.sapp W/System: ClassLoader referenced unknown path: /data/app/com.sapp-1/lib/arm 07-04 17:19:17.488 31219-31219/com.sapp D/SplashActivity: onCreate 07-04 17:19:17.513 31219-31219/com.sapp D/SplashActivity: onStart 07-04 17:19:17.513 31219-31219/com.sapp D/SplashActivity: onResume 07-04 17:19:17.522 31219-31875/com.sapp D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: false 07-04 17:19:17.539 31219-31219/com.sapp D/SplashActivity: onStart 07-04 17:19:17.539 31219-31219/com.sapp D/SplashActivity: onResume 07-04 17:19:17.558 31219-31875/com.sapp D/libEGL: loaded /system/lib/egl/libEGL_mali.so 07-04 17:19:17.564 31219-31875/com.sapp D/libEGL: loaded /system/lib/egl/libGLESv1_CM_mali.so 07-04 17:19:17.602 31219-31875/com.sapp D/libEGL: loaded /system/lib/egl/libGLESv2_mali.so [ 07-04 17:19:17.641 31219:31875 E/ ] Device driver API match Device driver API version: 29 User space API version: 29 [ 07-04 17:19:17.641 31219:31875 E/ ] mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Tue Jul 22 19:59:34 KST 2014 07-04 17:19:17.642 31219-31875/com.sapp I/OpenGLRenderer: Initialized EGL, version 1.4
В период долгого запуска приложения, в профайлере такая картина:
В период долгой загрузки приложения, на устройстве такая ситуация:
Это на экране можно видеть до появления в логе onResume, после чего отображается экран загрузки.
Тестировал на Api 21, 23.
Насколько я понимаю, долго происходит первоначальная инициализация, и связана она с загрузкой дополнительных библиотек. Как можно это ускорить или хотя бы отложить, чтобы показать экран загрузки?


Ответ

Это особенности работы виртуальной машины ART. На самом деле, долгая загрузка кажется долгой изза оптимизации приложения после его установки. То есть, дивайсу нужно время не на запуск приложения, а на его распаковку. Соответственно, пока приложение не распакуется, оно не сможет запуститься. Проверить мою теорию вы можете удалив приложение, установив APK файл, подождав ~40 сек, и запустив приложение.

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

Отправить комментарий