2016-12-19 19 views
3

В настоящее время я обновляю свое приложение для работы с java 8. Поэтому я использую компилятор jack.Использование Java 8 с компилятором jack на устройствах Android Pre L

Это прекрасно работает для любого устройства с Android 5.0 или выше. На старых устройствах с версиями Pre леденец, я получаю следующее исключение:

вызвано следующими причинами: java.lang.ClassNotFoundException: Не нашли класс «de.gelbeseiten.android.GelbeSeitenApplication» по пути: DexPathList [[zip-файл "/data/app/de.gelbeseiten.android-1.apk"],nativeLibraryDirectories=[/data/app-lib/de.gelbeseiten.android-1, /vendor/lib,/system/Библиотека,/система/Библиотека/рука]] на dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56) на java.lang.ClassLoader.loadClass (ClassLoader.java:497) в т java.lang.ClassLoader.loadClass (ClassLoader.java:457) на android.app.Instrumentation.newApplication (Instrumentation.java:981) на android.app.LoadedApk.makeApplication (LoadedApk.java:511) на android.app.ActivityThread.handleBindApplication (ActivityThread.java:4722) в android.app.ActivityThread.access $ 1600 (ActivityThread.java:172) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1368) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:146) at android.app.ActivityThread.main (ActivityThread.java:5653) по адресу java.lang.reflect.Method.invokeNative (собственный метод) по адресу java.lang.reflect.Method.invoke (Method.java:515)

Я 99% уверен, переход на Java 8 является причиной тому, как это случится, если я проверить текущую публичную версию и ничего не меняется, кроме включая Java 8.

к сожалению, я могу» t найти что-нибудь в google для этого. На сайте google android для поддержки java 8 ничего не написано о минимальной версии для Android. https://developer.android.com/guide/platform/j8-jack.html

Я не думаю, что полный файл build.gradle полезен, но вот фрагмент кода:

android { 
    useLibrary 'org.apache.http.legacy' 

    defaultConfig { 
     [...] 
     multiDexEnabled = true 
     jackOptions { 
      enabled true 
     } 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 

    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES.txt' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/notice.txt' 
     exclude 'META-INF/license.txt' 
     exclude 'META-INF/dependencies.txt' 
     exclude 'META-INF/LGPL2.1' 
    } 
} 

Я никогда не вручную изменили Proguard-Rules.txt, но вот это:

# Add project specific ProGuard rules here. 
# By teilnehmer, the flags in this file are appended to flags  specified 
# in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt 
# You can edit the include path and order by changing the ProGuard 
# include property in project.properties. 
# 
# For more details, see 
# http://developer.android.com/guide/developing/tools/proguard.html 

# Add any project specific keep options here: 

# If your project uses WebView with JS, uncomment the following 
# and specify the fully qualified class name to the JavaScript interface 
# class: 
#-keepclassmembers class fqcn.of.javascript.interface.for.webview { 
# public *; 
#} 

##---------------Begin: proguard configuration common for all Android apps ---------- 
-dontobfuscate 
-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontskipnonpubliclibraryclassmembers 
-dontpreverify 
-verbose 
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt 
-optimizations    !code/simplification/arithmetic,!field/*,!class/merging/* 

-allowaccessmodification 
-keepattributes *Annotation* 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-repackageclasses 
-libraryjars libs 

# The official support library. 
-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 

# Library JARs. 
-keep class de.greenrobot.dao.** { *; } 
-keep interface de.greenrobot.dao.** { *; } 
-keep class org.joda.** { *; } 
-keep interface org.joda.** { *; } 
-keep class com.loopj.android.http.** { *; } 
-keep interface com.loopj.android.http.** { *; } 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
-dontnote com.android.vending.licensing.ILicensingService 

# Espress: java.lang.NoSuchMethodError:  android.support.test.espresso.Espresso 
-keep class android.support.v7.widget.RecyclerView { *; } 

# adjust 
-keep class com.adjust.sdk.** { *; } 
-keep class com.google.android.gms.common.** { *; } 
-keep class com.google.android.gms.ads.identifier.** { *; } 

-keep class com.adjust.sdk.plugin.MacAddressUtil { 
    java.lang.String getMacAddress(android.content.Context); 
} 
-keep class com.adjust.sdk.plugin.AndroidIdUtil { 
    java.lang.String getAndroidId(android.content.Context); 
} 
-keep class com.google.android.gms.common.ConnectionResult { 
    int SUCCESS; 
} 
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { 
    com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo (android.content.Context); 
} 
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { 
    java.lang.String getId(); 
    boolean isLimitAdTrackingEnabled(); 
} 

#keep all classes that might be used in XML layouts 
-keep public class * extends android.view.View 
-keep public class * extends android.app.Fragment 
-keep public class * extends android.support.v4.Fragment 

# Explicitly preserve all serialization members. The Serializable interface 
# is only a marker interface, so it wouldn't save them. 
-keepclassmembers class * implements java.io.Serializable { 
static final long serialVersionUID; 
private static final java.io.ObjectStreamField[] serialPersistentFields; 
private void writeObject(java.io.ObjectOutputStream); 
private void readObject(java.io.ObjectInputStream); 
java.lang.Object writeReplace(); 
java.lang.Object readResolve(); 
} 

-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
    public static *** v(...); 
} 

-keepclassmembers class fqcn.of.javascript.interface.for.webview { 
    public *; 
} 


-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

# Preserve all native method names and the names of their classes. 
-keepclasseswithmembernames class * { 
native <methods>; 
} 


-keepclasseswithmembernames class * { 
public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

# Preserve static fields of inner classes of R classes that might be  accessed 
# through introspection. 
-keepclassmembers class **.R$* { 
public static <fields>; 
} 

# Preserve the special static methods that are required in all  enumeration classes. 
-keepclassmembers enum * { 
public static **[] values(); 
public static ** valueOf(java.lang.String); 
} 

-keep public class * { 
public protected *; 
} 

-keep class * implements android.os.Parcelable { 
public static final android.os.Parcelable$Creator *; 
} 
##---------------End: proguard configuration common for all Android apps ---------- 

##---------------Begin: proguard configuration for Gson ---------- 
# Gson uses generic type information stored in a class file when working with fields. Proguard 
# removes such information by teilnehmer, so configure it to keep all of it. 
-keepattributes Signature 

# For using GSON @Expose annotation 
-keepattributes *Annotation* 

# Gson specific classes 
-keep class sun.misc.Unsafe { *; } 
#-keep class com.google.gson.stream.** { *; } 

# Application classes that will be serialized/deserialized over Gson 
-keep class com.google.gson.examples.android.model.** { *; } 

##---------------End: proguard configuration for Gson ---------- 

Stackoverflow отображает часть файла в качестве комментария, но в моем файле Proguard в Android Studio, что это не так.

Су ... у кого-нибудь есть дополнительная информация по этой теме? Или, может быть, даже исправление для приложения, работающего на устройствах Pre L?

Заранее благодарен!
Ben

+0

ли с помощью ProGuard и multidex? Отправьте свой файл gradle и proguard. – AndroidRuntimeException

+0

Я использую multidex, yes.Added оба к исходному сообщению. –

+0

Я думаю, что Джек требует АРТ. ART доступен на kitkat, но его необходимо активировать (а не по умолчанию VM) – JSON

ответ

0

Прежде всего, если вы используете Instant Run, отключите его. На данный момент не работает с Java 8.

Кроме того, следует добавить:

-keep class de.gelbeseiten.android.** { *; } 

Кроме того, убедитесь, что de.gelbeseiten.android.GelbeSeitenApplication находится в основном файле DEX (вероятно classes.dex).

Если нет, вы должны сделать некоторые, как это:

android { 
    buildTypes { 
     debug { 
      ... 
      multiDexEnabled true 
      multiDexKeepFile file('multidex_keep_file.txt') 
     } 
    } 
} 

И в вашем multidex_keep_file.txt вам необходимо указать, какие классы будут в главном декс.

de/gelbeseiten/android/GelbeSeitenApplication.class 
de/gelbeseiten/android/MainActivity.class (for example) 

Этот текстовый файл, который определяет дополнительные классы, которые будут скомпилированы в основной файл Dex.

Классы, указанные в файле, добавляются к основным классам dex , вычисленным с использованием aapt.

Если установлено, то файл должен содержать один класс в каждой строке, в следующем формате : ком/пример/MyClass.class

+0

К сожалению, это не работает. Поскольку приложение работает на устройствах с Android 5 или более новыми версиями, приложение и действия должны быть включены в файлы .dex. –

 Смежные вопросы

  • Нет связанных вопросов^_^