在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,并且仅第二次出现警告/注释?

2023-12-25

我在 Android 应用程序中使用 MultiDex 和 ProGuard。当我运行我的应用程序时,结果发现 proguard 运行了两次。以下是 proguard 运行后的任务:

:app:transformClassesAndResourcesWithProguardForRelease
ProGuard, version 5.2.1
...
Initializing...
Shrinking...
Obfuscating...
Writing output...

然后:

:app:transformClassesWithMultidexlistForRelease
ProGuard, version 5.2.1

这是我的应用程序build.gradle file:

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.20.1'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'com.google.gms.google-services'


android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "de.majestella"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 3
        versionName "1.0.1"

        // Enabling multidex support.
        multiDexEnabled true
    }

    dexOptions {
        incremental true
        javaMaxHeapSize "2g"
    }


    buildTypes {
        debug {
            debuggable true

            // ProGuard
            minifyEnabled false
        }
        release {
                signingConfig signingConfigs.release

                debuggable false

                // ProGuard
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'),
                        'proguard-rules.pro', 'proguard-guava.pro', 'proguard-square-picasso.pro',
                        'proguard-crashlytics.pro', 'proguard-google-analytics.pro'

       }

    }

}

repositories {
    mavenCentral()
    maven {
        name = "sonatype"
        url = "https://oss.sonatype.org/content/repositories/snapshots/"
    }
    maven {
        name = "sonatypeGoogle"
        url = "https://oss.sonatype.org/content/repositories/google-snapshots/"
    }
    flatDir {
        dirs 'libs'
    }
    maven { url 'https://maven.fabric.io/public' }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'


    compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') {
        transitive = true;
    }

    compile 'com.android.support:multidex:1.0.1'

    compile 'com.google.android.gms:play-services-analytics:8.1.0'
    compile "com.google.android.gms:play-services:8.1.0"

}

第一次 proguard 运行后(即,在 :app:transformClassesAndResourcesWithProguardForRelease 之后),我收到以下警告writing output,所以 proguard 本身按照我的规则工作得很好:

Warning: can't write resource [fabric/com.crashlytics.sdk.android.answers.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.answers.properties])
Warning: can't write resource [fabric/com.crashlytics.sdk.android.beta.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.beta.properties])
Warning: can't write resource [fabric/com.crashlytics.sdk.android.crashlytics-core.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.crashlytics-core.properties])
Warning: can't write resource [fabric/com.crashlytics.sdk.android.crashlytics.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.crashlytics.properties])
Warning: can't write resource [fabric/io.fabric.sdk.android.fabric.properties] (Duplicate zip entry [fabric/io.fabric.sdk.android.fabric.properties])

当第二次 proguard 运行发生后:app:transformClassesWithMultidexlistForRelease我得到以下信息:

Note: android.support.design.widget.CoordinatorLayout calls 'Class.getAnnotation'
Note: com.google.ads.mediation.MediationServerParameters calls 'Field.getAnnotation'
Note: com.google.common.eventbus.AnnotatedSubscriberFinder calls 'Method.getAnnotation'
Note: com.google.common.reflect.Invokable$MethodInvokable calls 'Method.getParameterAnnotations'
Note: d.a.a.a.c calls 'Class.getAnnotation'
Note: d.a.a.a.i calls 'Class.getAnnotation'
Note: android.support.v4.app.ak calls 'Field.getType'
Note: com.google.android.gms.internal.zzsf calls 'Field.getType'
...

这很奇怪,因为在第一次混淆器运行中,由于我的规则,我没有收到这样的警告/注释。

这是我的 ProGuard 规则:

-keep class com.google.common.io.Resources {
    public static <methods>;
}
-keep class com.google.common.collect.Lists {
    public static ** reverse(**);
}
-keep class com.google.common.base.Charsets {
    public static <fields>;
}
-keep class com.google.common.collect.MapMakerInternalMap$ReferenceEntry
-keep class com.google.common.cache.LocalCache$ReferenceEntry

-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-keepattributes SourceFile,LineNumberTable,*Annotation*
-keep class com.crashlytics.android.**



-dontwarn com.squareup.okhttp.**

-dontnote org.apache.http.conn.**
-dontnote org.apache.http.params.**
-dontnote android.net.http.**

-dontnote **ILicensingService
-dontnote com.android.vending.billing.IInAppBillingService


-dontwarn com.google.auto.factory.**

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod


-dontnote android.support.**
-dontnote com.google.common.util.concurrent.**
-dontnote com.squareup.okhttp.**

-keep class org.jsoup.** { *; }
-keeppackagenames org.jsoup.nodes
-keep class com.google.common.cache.Striped64 { *; }
-keep class com.google.common.** { *; }
-keep class com.daimajia.slider.** { *; }


-dontnote org.jsoup.**
-dontnote com.google.common.**
-keep class com.squareup.picasso.** { *; }
-keep class com.google.android.gms.** { *; }
-keep class com.google.ads.** { *; }
-keep class com.lorentzos.** { *; }
-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**

-dontnote com.google.android.gms.maps.internal.CreatorImpl

-keep class com.mikepenz.iconics.** { *; }

在我看来,第二次 ProGuard 运行并没有使用我的 proguard 规则。

编辑:这是结果gradlew -q tasks --all: https://gist.github.com/confile/2a15d80980214656f4f1 https://gist.github.com/confile/2a15d80980214656f4f1

为什么第二次 Proguard 运行会引发错误以及如何解决这些错误?


看来是android gradle插件的问题。看到这个

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

在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,并且仅第二次出现警告/注释? 的相关文章

  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • Android 对 Runtime.getRuntime().exec() 的权限

    我有一个应用程序在清单上具有以下权限 我的应用程序在 Android JB 4 1 2 上运行 UPDATE 我尝试在 JB 上运行该应用程序 但它不起作用 它适用于早期的 API 版本
  • ThreadPoolExecutor 和队列

    我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
  • Firestore OncompleteListener [重复]

    这个问题在这里已经有答案了 我想看看这段代码的执行有什么错误 当我编译它时 它只返回 log 1 3 2 的值 并且我希望 log2 在 3 之前 Log d 1 antes de validar DocumentReference doc
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • 从前台服务的活动中释放内存

    我有一个带有前台服务和一项活动的应用程序 该服务可以在启动时自行启动 也可以从 Activity 中启动 我注意到当服务在启动时自行启动时 内存使用量约为 3MB 一旦我打开该 Activity 内存使用量就会跃升至约 9mB 一旦 Act
  • python 和 android 中通过 AES 算法加密和解密

    我有用于 AES 加密的 python 和 android 代码 当我在android中加密文本时 它在python上成功解密 但无法在android端解密 有人有想法吗 Python代码 import base64 import hash
  • androidx.navigation.fragment.NavHostFragment 无法从 xml 文件访问

    我正在尝试使用带有底部导航视图的 androidx 导航 因此 当我在 xml 文件中放置带有 android name androidx navigation fragment NavHostFragment 的片段时 它会给我一个错误
  • 为什么replaceAll在这行代码中不起作用? [复制]

    这个问题在这里已经有答案了 String weatherLocation weatherLoc 1 toString weatherLocation replaceAll how weatherLocation replaceAll wea
  • 使用 LinearLayout 将按钮放在屏幕底部?

    我有以下代码 如何使 3 个按钮位于底部
  • Java DNSLookup MX 记录列表。类似于 MXToolBox

    我正在构建一个程序来列出域的所有 MX 记录 起初似乎工作正常 但与在线工具进行比较后http mxtoolbox com http mxtoolbox com 有些域程序无法获取 MX 记录 而 MXToolbox 可以 我不确定原因是什
  • 未捕获的引用错误:cordova 未定义

    这是我的 HelloPlugin js 文件 var HelloPlugin callNativeFunction function success fail resultType return cordova exec success f
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • Android 10 通知彩色操作按钮

    I m trying to color the buttons Action in Notification like this So far this is what i m achieved so far 下面是我正在使用的代码 通知服
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • Android - 从渲染线程内结束活动

    下午好 我不熟悉 android 中的活动生命周期 并且一直在尽可能地阅读 但我不知道如何以良好的方式解决以下问题 我有一个使用 GLSurfaceView 的活动来在屏幕上绘制各种内容 在这个 GLSurfaceView 的渲染线程中 我
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • Android:防止嗅探(例如使用 CharlesProxy)SSL 流量

    我使用 Charles 检查将我的应用程序发送到 HTTPS 的数据 我在手机上安装了 Charles CA 证书 因此我能够解密每个 SSL 流量 但我发现一些应用程序无法看到 SSL 流量 我如何将这种行为实现到我自己的应用程序中 有了

随机推荐

  • std::list 中最小元素的索引

    如果我有一个std vector
  • WellPointed 适合双至 PreArrow 级别

    In Control Arrow Constrained http hackage haskell org package constrained categories 0 2 0 0 docs Control Arrow Constrai
  • 是否有标准方法可以将多个 API 调用组合成一个 HTTP 请求?

    在设计 REST API 时 我有时会遇到处理批量操作 例如一次删除或更新许多实体 以减少许多 tcp 客户端连接的开销的挑战 在特定情况下 问题通常通过添加特定操作的自定义 api 方法来解决 例如POST files batchDele
  • 使用 aiohttp 维护客户端 http 缓存

    我有一个同步应用程序使用缓存控制 https pypi org project CacheControl requests https requests readthedocs io en master 它与本地文件系统缓存配合得很好 我希
  • 我可以使用 MYSQLI 和 PHP 将多个值绑定为单个参数吗?

    假设我有以下 SQL 查询 SELECT id name FROM user WHERE id IN id1 id2 id3 现在假设我需要 PHP 提供的 ids 数组 所以我有这样的事情 idList array id1 id2 id3
  • SQL-Server 2005 的 Oracle 等效 ROWNUM?

    在 Oracle PL SQL 中我习惯这样写 SELECT FROM MY TABLE WHERE ROWNUM lt 100 为了仅获取名为 MY TABLE 的表的前 100 条记录 SQL SERVER 中等效的 SELECT 语句
  • jQuery - 检查 DOM 元素是否已经存在

    我正在尝试通过 Ajax 和 jQuery 动态添加一些表单元素 我想确保不会两次创建相同的元素 因此我只想在尚未将其添加到 DOM 时添加它 我的所有元素都有一个唯一的 CSS id 例如 data 1 我正在使用以下命令来检查该元素是否
  • 按行上的字数对大量文件的行进行排序(最好是并行)

    我正在研究一种社区检测算法 用于分析 Facebook 的社交网络数据 第一个任务是检测图中的所有派系 可以有效地并行完成 并留下如下输出 17118 17136 17392 17064 17093 17376 17118 17136 17
  • Next.JS + AMP CSS

    我在 Next js 中使用 AMP 和 CSS 时遇到问题 在我的头部组件中 我有 在 HTML 源代码中 它显示为 在控制台中我收到此错误 The mandatory attribute amp custom is missing in
  • 为什么 SCNNode .flattenedClone() 会崩溃或使性能变差?

    我正在尝试添加大约 4 5kSCNNode对象到场景 它们的几何形状是以下两种之一SCNPlanes 其材质由CALayers 但我认为这并不重要 CALayerDelegate每个仅调用一次 因此这似乎不是问题 性能很糟糕 With sh
  • 在 Windows 上找不到 PHP 8.1.9 的 php_pdo_informix.dll

    我必须在安装了 Apache 2 4 54 PHP 8 1 9 VS16 x64 线程安全 的 Windows 10 版本 20H2 上测试 php 应用程序 已安装 informix client sdk 4 50 FC8 并且 INFO
  • 如何使按钮文本从文本更改为空名称并延迟?

    我正在使用 tkinter 库作为 GUI 基本上我使用 for 循环创建 4 个按钮 每个按钮都有一个随机数作为文本 现在 当我尝试实现一种方法时遇到了困难 该方法允许按钮文本显示为数字 然后在一秒钟左右更改为任何内容 完成此操作后 下一
  • 序列化ctype联合

    有没有办法序列化 ctype 联合以便通过套接字发送它们 我试图通过套接字将联合发送到网络服务器 但我无法序列化数据 而是作为联合对象的实例发送 是否可以使用 Python Struct 库来执行此操作 我不相信它支持联合 任何帮助深表感谢
  • Swift 包管理器条件编译不尊重标志

    我有一个具有以下结构的 Package swift 文件 var package Package name MyProject targets Target name MyProject dependencies exclude Exclu
  • 过滤掉Python子进程模块中需要终端的命令

    我正在开发一个机器人 它接受来自网络 XMPP 的命令 并使用Python中的子进程模块来执行它们并发回命令的输出 本质上它是一个类似 SSH 的基于 XMPP 的非交互式 shell 机器人仅执行来自经过身份验证的可信源的命令 因此允许任
  • 查找本地网络中的所有IP地址

    我想使用 Java 代码查找当前连接到的本地网络中设备的所有 IP 地址 有用的实用程序Advanced IP Scanner http www advanced ip scanner com 能够在我的中找到各种IP地址subnet ht
  • 使用 Pyparsing 访问解析的元素

    我有一堆句子需要解析并转换为相应的正则表达式搜索代码 我的句子的例子 LINE CONTAINS phrase one BEFORE phrase2 AND phrase3 AND LINE STARTSWITH Therefore we
  • 如何自定义活动管理布局?

    我需要自定义活动管理布局 但我该怎么做呢 活动管理布局实际上并未定义为布局文件 而是以编程方式生成 因此 将自定义布局放置在布局目录中实际上不会覆盖默认布局 但是 您可以对应用程序中的活动管理布局方法进行猴子补丁或鸭子打孔 下面将向标题添加
  • Swift,自定义 UIButton 单击时不起作用

    我有一个使用 xib 文件创建的自定义 UIButton 当我在视图上使用自定义按钮时 按下它时它不起作用 我的 RoundBtn swift 文件 import UIKit IBDesignable class RoundBtn UIBu
  • 在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,并且仅第二次出现警告/注释?

    我在 Android 应用程序中使用 MultiDex 和 ProGuard 当我运行我的应用程序时 结果发现 proguard 运行了两次 以下是 proguard 运行后的任务 app transformClassesAndResour