Proguard minifyEnabled 对于调试构建为 true,不适用于 Lollipop 之前的版本

2024-01-05

我的应用程序的方法计数高于 64k 限制,因此我使用 Proguard 来减少它。

发布版本一切正常。
另一方面,调试版本仅对 Lollipop+ 设备成功。在棒棒糖之前的设备上启动时,我总是遇到臭名昭著的错误:

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

这是我在应用程序级别 gradle 文件中的内容:

buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

我试过删除minifyEnabled true在调试版本中,然后在 Lollipop+ 上构建也失败,因此 proguard 正在工作!但不是在棒棒糖之前。

据我所知minifyEnabled不应该依赖于平台,因此构建过程可能会在棒棒糖之前的设备上跳过它(因为我不知道什么原因)。

有人知道这个问题的解决方案吗?

附:我知道多重分包的可能性,但我将其作为最后的手段。

EDIT:

这是应用程序级 gradle 文件的完整代码:

apply plugin: 'com.android.application'
apply plugin: 'android-apt'
apply plugin: 'me.tatarka.retrolambda'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5'
    }
}

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "com.pierfrancescosoffritti.shuffly"
        minSdkVersion 16
        targetSdkVersion 24
        versionCode 30
        versionName "0.13"
    }
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

def dbflow_version = "3.1.1"

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    apt 'com.jakewharton:butterknife-compiler:8.2.1'
    apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"
    compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}"
    compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}"

    compile 'com.android.support:support-v4:24.1.1'
    compile 'com.android.support:design:24.1.1'
    compile 'com.android.support:recyclerview-v7:24.1.1'
    compile 'com.android.support:cardview-v7:24.1.1'
    compile 'com.android.support:palette-v7:24.1.1'
    compile 'com.jakewharton:butterknife:8.2.1'
    compile 'com.github.PierfrancescoSoffritti:AndroidUtils:0.5'
    compile 'com.github.PierfrancescoSoffritti:SlidingDrawer:0.10'
    compile 'com.github.PierfrancescoSoffritti:WebBasedOAuth:0.7'
    compile 'com.github.PierfrancescoSoffritti:ShrinkingImageLayout:0.4'
    compile 'com.github.PierfrancescoSoffritti:ExpandableLayout:0.1'
    compile 'com.google.apis:google-api-services-youtube:v3-rev177-1.22.0'
    compile 'com.google.api-client:google-api-client-android:1.20.0'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.1.8'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.github.Commit451:ElasticDragDismissLayout:1.0.4'
    compile 'com.google.firebase:firebase-core:9.2.1'
    compile 'com.google.firebase:firebase-crash:9.2.1'
    compile 'com.google.firebase:firebase-ads:9.2.1'
    compile 'com.artemzin.rxjava:proguard-rules:1.1.8.0'
}

apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.getkeepsafe.dexcount'

项目级别的gradle文件:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'com.google.gms:google-services:3.0.0'
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

混淆器规则:

# retrolambda
-dontwarn java.lang.invoke.*

# picasso
-dontwarn com.squareup.okhttp.**

# adMob
-keep public class com.google.android.gms.ads.** {
   public *;
}
-keep public class com.google.ads.** {
   public *;
}

# GoogleApiClient
# Needed to keep generic types and @Key annotations accessed via reflection
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}
# Needed by google-http-client-android when linking against an older platform version
-dontwarn com.google.api.client.extensions.android.**
# Needed by google-api-client-android when linking against an older platform version
-dontwarn com.google.api.client.googleapis.extensions.android.**
# Needed by google-play-services when linking against an older platform version
-dontwarn com.google.android.gms.**
# com.google.client.util.IOUtils references java.nio.file.Files when on Java 7+
-dontnote java.nio.file.Files, java.nio.file.Path
# Suppress notes on LicensingServices
-dontnote **.ILicensingService
# Suppress warnings on sun.misc.Unsafe
-dontnote sun.misc.Unsafe
-dontwarn sun.misc.Unsafe

# DBFlow
-keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; }

如果你想尝试减少方法计数,或者至少你想了解从发布到调试的区别,我建议你尝试查看 AS 2.2 预览版 5 中可用的 dex 计数,他们有一个 YouTube 视频(可能来自 google) IO),这使得计算方法变得非常容易。

这仅适用于计数方法,如果您仍然使用相同的方法buildToolsVersion "23.0.3"您应该在两个版本的 AS 中获得完全相同的 apk 文件(除了 AS 2.2 附带其自己的 JDK 版本这一事实,这不应该妨碍您)。

免责声明:除了玩玩之外,我从未使用过该工具,所以当你真正找到罪魁祸首后,我不知道该推荐什么。

编辑:这是视频https://youtu.be/csaXml4xtN8?t=331 https://youtu.be/csaXml4xtN8?t=331对于“Apk 分析器”,它位于“构建”菜单中。不要尝试早于 2.2 预览版 3 或更高版本的评论,他们预览了一些直到后来才发布的东西。

编辑2:另外为什么你只使用shrinkResources释放时?这就是应该消除不需要的方法的行:“minifyEnabled”与“shrinkResources” - 有什么区别?以及如何获得节省的空间? https://stackoverflow.com/questions/30800804/minifyenabled-vs-shrinkresources-whats-the-difference-and-how-to-get-the

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Proguard minifyEnabled 对于调试构建为 true,不适用于 Lollipop 之前的版本 的相关文章

  • 为什么layout_width =“wrap_content”会占据屏幕的整个宽度?

    使用这个 xml
  • Eclipse 运行时 Dalvik 错误

    当我要运行任何程序时 会显示此对话框 在 Eclipse 中 这些错误显示在控制台中 2013 02 25 19 05 09 Dex Loader Unable to execute dex Target out of range 0000
  • 如何更新不是我自己创建的 APK 的版本

    我是 Android 开发新手 我正在使用 x 平台开发工具 它为我构建并签署 APK 该工具有一个错误 它不会使用我指定的版本代码生成 APK 所有生成的 APK 都是版本 1 0 我想解压APK 编辑版本代码 然后辞职并重新打包 它最初
  • 如何刷新 Android 上的 MediaStore?

    这最初是 Android 论坛上的一个一般用户问题 然而 它必然成为一个编程问题 这是我的问题 Android 有一个服务 MediaScanner 每当 我相信 SD 卡卸载和重新安装时它都会在后台运行 该服务收集卡上所有媒体文件的数据
  • 使用数据绑定更新对象类型 LiveData

    我想通过与 livedata 的数据绑定来更新视图 让我们看一下场景 数据类 data class Movie var name String var createdAt String 视图模型 class MyViewModel View
  • 创建像 facebook android 一样的登录动画

    我想创建一个登录页面 如 facebook android 应用程序 其中包含用户名和密码EditText字段被隐藏 页面上会显示一个徽标 该徽标会在上方动画一定距离并停留在新位置 然后显示编辑字段 这是我尝试过的 但这里的徽标从页面底部开
  • ListView 可以存储多少个项目?

    我是 Android 编程新手 我想知道ListView可以存储多少个项目 我在文档中搜索 但他们没有谈论这个 如果我将很多 可能是 10k 项放入 ListAdapter 中 会影响性能吗 干杯 MK ListView 在 Android
  • GPSTracker 类不工作

    我尝试在我的应用程序中使用我在网上找到的 GPSTracker 类 并且我之前让它工作过 但现在似乎莫名其妙地不起作用 public class GPSTracker extends Service implements LocationL
  • 带有选项卡和 ActivityGroup 的后退按钮行为

    我有一个活动 Main 显示如下选项卡 private void initTabs mTabHost getTabHost The activity TabHost Intent intent intent new Intent setCl
  • HttpURLConnection.getResponseCode() 冻结执行/不会超时

    我正在编写一个 Android 应用程序 它连接到受密码保护的 cPanel 服务器 Apache 2 2 22 页面 当身份验证凭据正确时 我的连接没有问题 但是 当凭据不正确时 我的 Android 应用程序似乎会冻结在HttpURLC
  • 为什么 CheckBox 检查不能以编程方式与 Kotlin 一起使用?

    我想这个问题以前可能有人问过 但这个问题也发生在我身上 所以我在这里再次询问 看看我们能否找到解决方案 所以基本上问题是以编程方式检查复选框不与 Kotlin 代码一起工作 为了解释一下 我正在分享我的代码和问题的屏幕截图 filterCo
  • Android:直接从浏览器下载文件

    我试图让 Android 浏览器下载特定类型 xxx 的文件 这样我就可以设置一个应用程序与其关联 我已经成功完成了关联部分 因为我已经做到了 以便在资源管理器应用程序中单击正确类型的文件会加载适当的应用程序 我希望这会转移到浏览器 这样如
  • 当我想用它来进行单独的 apk 测试时,出现“android.support.test.espresso 不存在”

    我需要在没有源代码的情况下对 Android 应用程序进行一些自动测试工作 我发现 Robotium 和 espresso 都可以完成这项工作 我决定使用 espresso 因为它有 Google 支持 我想使用相同的签名对目标 apk 和
  • Android SearchView 自定义

    我是 Android 新手 我被困在一些我认为很简单但我很困惑的事情上 我需要不在操作栏 工具栏中而是在我的相对布局中创建自定义 searchView 问题是我不知道如何自定义背景 文本输入颜色 XML 中的搜索图标颜色 或者只是它们的属性
  • 加入牛轧糖热点

    我的应用程序有 2 个按钮 一个用于创建热点 另一个用于加入热点 流程是 我在其中一台设备上创建一个热点 然后尝试将其与其他设备连接 通过我的应用程序 问题是 有时我无法加入由 Nougat 设备创建的热点 它会卡在 获取 IP 地址 上
  • 如何在android中动态创建按钮?

    我想创建一个这样的页面 这 7 个按钮已经存在 但如果用户想添加更多类别 按钮 那么他可以使用 按钮并使用删除 按钮 有制作这个的想法或教程吗 创建 删除按钮onClick of button and button如下 public voi
  • Android 中何时使用服务、何时不使用服务

    我从事Android开发已经不到两年了 我仍然对这个看似简单的问题感到困惑 何时应该实施一项服务 根据我的经验 有一些罕见的情况 但我对此表示怀疑 因为每部手机上都运行着很多这样的情况 我怀疑这只是一个糟糕的应用程序设计 这本质上是我的问题
  • Android:将“内部”链接添加到 TextView 的一部分,该链接链接到我的代码中的操作

    正如标题所解释的 我想添加链接到我的TextView 有这两个警告 我希望链接能够作用于TextView 不是完整的 类似于AHTML 中的锚点 我希望链接指向我的代码中的操作 而不是网站 我可以在我的活动中定义一个方法 或者实现一个OnC
  • SDK管理器不显示示例包选项

    我关注的是安卓安装示例的开发人员链接 http developer android com tools samples index html包裹 但是 当我展开Android平台的包列表时 没有 SDK示例 选项 复选框 可用 为什么 我已
  • 如何使用 androidX 不破坏片段

    现在 我尝试 androidX 导航和底部导航栏 当我像下面一样使用它时 supportFragmentManager getSupportFragmentManager navHostFragment NavHostFragment su

随机推荐