【问题标题】:Unable to build apk - android studio无法构建 apk - android studio
【发布时间】:2016-06-27 15:46:59
【问题描述】:

现在已经一个星期了,我们无法为我们的 andorid 项目构建 apk 文件。我们得到的错误与proguard有关(请参阅附加的错误):

警告:有 416 个未解析的类或接口引用。

错误:任务 ':app:transformClassesAndResourcesWithProguardForDebug' 执行失败。 java.io.IOException: 请先更正上述警告。

该项目用于在我们最近的一次提交之前构建。因此,当我们签出该提交时,它就可以工作了!我们已经在 stackoverflow/internet 上尝试了与此相关的所有可用方法,但没有任何效果! 最糟糕的是,它只能在我们的一台计算机上构建,我们无法弄清楚为什么它不能在具有相同版本 Android Studio 的其他计算机上运行。

我们甚至试图通过使用来抑制警告:

-不要警告

-继续上课

因此,在这种情况下,构建成功但应用崩溃了。

使用的不同组件的版本:

Android Studio - 2.1.2

Proguard - 5.2.1

buildToolsVersion 23.0.2

Proguard errors

这些是我们在项目中使用的 proguard 规则:

-dontwarn com.github.siyamed.shapeimageview.path.parser.SvgToPath
-dontwarn com.google.android.gms.internal.zzhu
-dontwarn com.squareup.okhttp.**
-keep class com.opentok.** { *; }
-keep class org.webrtc.** { *; }

-keepattributes SourceFile,LineNumberTable
-keepattributes *Annotation*
-keep class org.acra.** { *; }
-keepclassmembers class com.paytm.pgsdk.PaytmWebView$PaytmJavaScriptInterface {
    public *;
}

##MoEngage proguard rules, src : http://docs.moengage.com/docs/android-configuring-proguard
-dontwarn com.google.android.gms.location.**
-dontwarn com.google.android.gms.gcm.**
-dontwarn com.google.android.gms.iid.**
-dontwarn okio.**

-keep class com.google.android.gms.gcm.** { *; }
-keep class com.google.android.gms.iid.** { *; }
-keep class com.google.android.gms.location.** { *; }
-keep class com.facebook.drawee.**{*;}
-dontwarn com.facebook.drawee.*

-keep class com.moe.pushlibrary.activities.** { *; }
-keep class com.moe.pushlibrary.internal.MoEService
-keep class com.moe.pushlibrary.GeofenceIntentService
-keep class com.moe.pushlibrary.InstallReceiver
-keep class com.moengage.push.MoEPushWorker
-keep class com.moe.pushlibrary.PushGcmBroadcastReceiver
-keep class com.moe.pushlibrary.providers.MoEProvider
-keep class com.moengage.receiver.MoEInstanceIDListener
-keep class com.moengage.worker.MoEGCMListenerService
-keep class com.moe.pushlibrary.models.** { *;}
-keep class com.moe.pushlibrary.internal.GeoTask
-keep class com.moengage.locationlibrarynew.LocationHandlerImpl

-dontwarn com.moengage.locationlibrarynew.LocationHandlerImpl
-dontwarn com.moe.pushlibrary.internal.GeoTask
-dontwarn com.moengage.receiver.*
-dontwarn com.moengage.worker.*
-dontwarn com.moengage.*
-keep class com.delight.**  { *; }

## for rx java
-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

【问题讨论】:

  • 这次提交后你是否添加了新的依赖项或更改了你的 proguard 规则?
  • 不,我们没有更改 proguard 规则中的任何内容,但我们确实在 build.gradle 文件中添加了一些依赖项
  • kann 您是否提供了新添加的依赖项列表?大多数依赖项都为您的 proguard 文件提供了规则。
  • @AshishRanjan:请阅读我的更新答案。
  • 这些是新添加的依赖项:compile 'com.hannesdorfmann.sqlbrite:dao:0.6.1' + compile 'com.hannesdorfmann.sqlbrite:annotations:0.6.1' + apt 'com.hannesdorfmann .sqlbrite:object-mapper:0.6.1'

标签: java android android-studio proguard


【解决方案1】:

当你添加一些依赖时,有一个巨大的变化,proguard 会混淆依赖代码。因此,您应该使用 -keep class,而不是使用 -dontwarn(基本上不会警告您一些未解决的引用)。

找到依赖包名,然后防止它们的类被proguard混淆。

-- 已更新--

从您的日志中,有 2 个依赖项需要解决:facebook 和 android-shape-imageview。

对于 facebook,请尝试将其添加到您的 proguard:

-keep class com.facebook.** {
   *;
}

对于形状图像视图:

-dontwarn android.support.v7.**
-keep class android.support.v7.** { ; }
-keep interface android.support.v7.* { ; }
-keepattributes *Annotation,Signature
-dontwarn com.github.siyamed.**
-keep class com.github.siyamed.shapeimageview.**{ *; }

阅读更多:

  1. Android ProGuard settings for Facebook
  2. Anyone able to use this with proguard on?

【讨论】:

  • 嘿 @isnotmenow ,感谢您的回答,我们确实尝试为我们遇到的错误添加 -keep 类规则,但是构建项目需要很多时间,最后它会抛出一些错误.
  • 我不明白为什么它会内置在其中一台 PC 中?跟构建工具版本还是gradle版本有关系?
  • @AshishRanjan: 什么错误?...也许这台 PC 上的项目与其他 PC 上的项目不完全相同。首先尝试清理和重建项目。有时,当我们尝试运行应用程序时,Android Studio 会使用较旧的编译代码。
  • 顺便说一句,尝试评论一些规则:-dontwarn com.github.siyamed.shapeimageview.path.parser.SvgToPat 和 *-keep class com.facebook.drawee.**{ i>;} -dontwarn com.facebook.drawee.* 在我的答案中使用规则之前。
  • 项目完全相同,因为我们只是从 git 中提取代码,是的,我们尝试了多次清理和重建,但没有任何成功!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多