标签: android-r8

proguard-rules.pro似乎不适用于R8

我今天早些时候将Android Studio升级到3.4,并且第一次使用默认的收缩器R8。我将proguard-project.txt图书馆项目的内容复制到proguard-rules.proproguard-project.txt完美地为这个项目工作,生成了供其他应用程序项目使用的aar文件。

文件proguard-rules.pro似乎并没有被使用。该项目的内容如下build.gradle

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
                    'proguard-rules.pro'
            signingConfig signingConfigs.Release
        }
        debug {
            signingConfig signingConfigs.Debug
        }
    }
Run Code Online (Sandbox Code Playgroud)

proguard-rules.pro 具有以下内容:

# Preserve all public classes, and their public and protected fields and methods.
-keep public class * {
    public protected *;
}
Run Code Online (Sandbox Code Playgroud)

公用方法的名称根本不保留: 在此处输入图片说明

谁能提供解决此问题的技巧?

android android-proguard android-r8 r8

4
推荐指数
1
解决办法
1154
查看次数

有没有一种方法可以防止Android应用代码收缩器R8更改行号?

Android Studio 最近默认开始使用R8代替ProGuard。

来自ProGuard的堆栈跟踪很容易理解,即使代码被混淆,也无需使用任何工具。让我们使用以下示例:

 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
    at net.foo.anroid.Foo.wb.d(SourceFile:453)
    at net.foo.anroid.Foo.wb.a(SourceFile:213)
    at net.foo.anroid.Foo.wb.n(SourceFile:103)
    at net.foo.anroid.Foo.qa.run(Unknown Source:2)
    at java.lang.Thread.run(Thread.java:764)
Run Code Online (Sandbox Code Playgroud)

通常,我确切知道net.foo.anroid.Foo.wb与哪个文件相对应,并且行号(例如453、213 ...)是ProGuard源文件中的实际行号。

但是,对于R8,找出哪一行的唯一方法是在mapping.txt中查找它们。

这确实是一个很大的麻烦。如果没有很好的方法从堆栈跟踪中快速找到源代码,仅出于这个原因,我将返回ProGuard。

有没有办法防止R8更改行号?

android android-r8

4
推荐指数
1
解决办法
427
查看次数

使用R8的Firebase中的循环参考错误

Firebase和R8出现以下错误。

[CIRCULAR REFERENCE:java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: Multiple entries with same key: Method com.google.firebase.iid.FirebaseInstanceId.zza Proto LLL com.google.android.gms.tasks.Task java.lang.String java.lang.String=Encoded method Method com.google.firebase.iid.FirebaseInstanceId.zza Proto LLL com.google.android.gms.tasks.Task java.lang.String java.lang.String and Method com.google.firebase.iid.FirebaseInstanceId.zza Proto LLL com.google.android.gms.tasks.Task java.lang.String java.lang.String=Encoded method Method com.google.firebase.iid.FirebaseInstanceId.zza Proto LLL com.google.android.gms.tasks.Task java.lang.String java.lang.String]
Run Code Online (Sandbox Code Playgroud)

请帮助我进一步调试它。让我知道是否需要更多日志来进行调试。

编辑:其固定的3.4.0-beta02起。

android build proguard android-r8 r8

4
推荐指数
2
解决办法
657
查看次数

带有 Firebase 性能监控库的 DexArchiveBuilderException,R8 无法脱糖?

如果我什至只包含 Firebase 性能库,我几乎无法构建该项目,它会因以下异常而失败,我不知道如何解决这个问题,因为它在较旧的 Android Studio 版本上运行良好(我不确定哪个一),我使用的是性能插件 1.2.1 和性能库 17.0.2,这是这篇文章的最新版本

com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process /app/build/intermediates/transforms/FirebasePerformancePlugin/debug/10
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:593)
at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677)
at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:720)
at com.android.ide.common.internal.WaitableExecutor.waitForTasksWithQuickFail(WaitableExecutor.java:149)
at com.android.build.gradle.internal.transforms.DesugarIncrementalTransformHelper.getInitalGraphData(DesugarIncrementalTransformHelper.java:162)
at com.android.build.gradle.internal.transforms.DesugarIncrementalTransformHelper.makeDesugaringGraph(DesugarIncrementalTransformHelper.java:130)
at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
at com.android.build.gradle.internal.transforms.DesugarIncrementalTransformHelper.getDependenciesPaths(DesugarIncrementalTransformHelper.java:231)
at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.getD8DesugaringCacheInfo(DexArchiveBuilderTransform.java:467)
at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.transform(DexArchiveBuilderTransform.java:390)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
at …
Run Code Online (Sandbox Code Playgroud)

android performance-testing firebase firebase-performance android-r8

4
推荐指数
1
解决办法
1950
查看次数

R8 问题:由于错误 GC 开销限制超出,无法设置 Proguard minifyEnabled

使用minifyEnabled true选项生成发行包时出错。以下是给我错误的 Gradle 设置:

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
Run Code Online (Sandbox Code Playgroud)

我还发现任务 transformClassesAndResourcesWithR8For... 花费了太多时间(最多 10-20 分钟)

错误: java.lang.OutOfMemoryError: GC overhead limit exceeded在Gradle任务transformClassesAndResourcesWithR8ForCommonRelease中

android android-r8

4
推荐指数
1
解决办法
1845
查看次数

proguard 规则“-dontwarn”不起作用(AGP 8.0)

更新到 Android Gradle Plugin 8.0 后,我在 minifyReleaseAndroidTestWithR8 步骤中收到以下构建时错误:

运行 R8 时检测到缺少类。请添加缺少的类或应用在 C:\Users\...\app\build\outputs\mapping\releaseAndroidTest\missing_rules.txt 中生成的其他保留规则。

缺少 io.reactivex.Flowable 类(引用自:io.reactivex.Flowable io.realm.BaseRealm.asFlowable() 和 5 个其他上下文)

缺少类 io.reactivex.Observable (引用自:io.reactivex.Observable io.realm.RealmList.asChangesetObservable() 和其他 3 个上下文)

缺少类 java.lang.ClassValue (引用自:java.lang.ClassValue com.google.common.util.concurrent.FuturesGetChecked$GetCheckedTypeValidatorHolder$ClassValueValidator.isValidClass 和 3 个其他上下文)

据我了解,在 AGP 8.0 之前,缺少的类被视为警告,而现在它们被视为错误。所以我将文件中的规则添加missing_rules.txt到我的proguard-rules.pro

-dontwarn io.reactivex.Flowable
-dontwarn io.reactivex.Observable
-dontwarn java.lang.ClassValue
Run Code Online (Sandbox Code Playgroud)

不过,新增加的-dontwarn规则似乎并没有什么作用。我在后续构建中遇到相同的“缺少类”错误。我尝试过清理项目后构建、重新启动 Android Studio 后构建以及使 Android Studio 缓存无效后构建。一切都无济于事。

我还尝试在每个规则中添加“.**”。我仍然遇到相同的“缺少课程”错误。

我的proguard-rules文件有另一个有效-dontwarn的规则:

-dontwarn sun.misc.Cleaner
Run Code Online (Sandbox Code Playgroud)

如果删除此规则,我会收到缺失类警告sun.misc.Cleaner(如预期),如果我重新设置该规则,错误就会消失。这似乎表明该问题不是-dontwarn规则的根本问题。

如果我禁用minifyEnabled,构建将完成且不会出现错误。

三个缺失的 ( io.reactivex) 类中的两个是从 Realm …

android proguard realm android-r8 android-gradle-plugin-8.0

4
推荐指数
1
解决办法
3465
查看次数

使用 Pusher 库时缺少类 org.slf4j.impl.StaticLoggerBinder (引用自: void org.slf4j.LoggerFactory.bind() 和其他 3 个上下文)

启用 R8 ( isMinifyEnabled = true) 并使用"com.pusher.pusher-java-client:2.4.4"库时,我在发布版本中收到以下错误:

AGPBI: {"kind":"error","text":"运行 R8 时检测到缺少类。请添加缺少的类或应用在 project\app\build\outputs\mapping\devRelease\missing_rules 中生成的其他保留规则.txt。","sources":[{}]} AGPBI: {"kind":"error","text":"缺少类 org.slf4j.impl.StaticLoggerBinder (引用自: void org.slf4j.LoggerFactory. bind() 和其他 3 个上下文)","sources":[{}],"tool":"R8"} 运行 R8 时检测到缺少类。请添加缺少的类或应用在project\app\build\outputs\mapping\devRelease\missing_rules.txt 中生成的其他保留规则。

缺少类 org.slf4j.impl.StaticLoggerBinder (引用自:void org.slf4j.LoggerFactory.bind() 和其他 3 个上下文)

我该如何解决?有了isMinifyEnabled = false它就可以毫无问题地构建

android android-build android-r8

4
推荐指数
1
解决办法
2539
查看次数

Android R8 片段实现但实际上匹配扩展

目前使用的版本是: androidx.fragment:fragment-ktx: 1.2.1。当我尝试构建发布版本时,proguard (R8) 显示如下警告:

R8: The rule `-neverclassinline public class ** implements androidx.fragment.app.Fragment` uses implements but actually matches extends.

R8: The rule `-keep public class ** implements androidx.fragment.app.Fragment {
  public <init>();
}` uses implements but actually matches extends.
Run Code Online (Sandbox Code Playgroud)

我没有在错误跟踪器上找到任何相关问题。可能是什么原因,我该如何解决?

android proguard android-fragments android-r8 androidx

3
推荐指数
1
解决办法
1622
查看次数

Android Studio 4.2 开始在发布版本中重命名 APK 内的资源

最近,我从 4.1.3 更新到 Android Studio 4.2.1,当我在发布模式下构建时,发现 res/ 文件夹下 APK 中的所有内容都被重命名(我可以称之为“混淆”吗?)。

在调试中它与旧版本中的相同。我使用控制台构建与gradlew assembleRelease.

我没有找到任何变更日志或官方说明为什么会发生这种情况。shrinkResources false尝试通过添加app/build.gradle 并使用 res/raw/keep.xml来禁用它。即使minifyEnabled false资源被重命名。

当我将 apk 安装到设备时,我的所有图标和图像似乎都像以前一样显示,但我的应用程序分发 Web 工具无法再显示应用程序图标。

有人有同样的情况并且知道如何在发布版本中将其关闭吗?

android gradle apk android-studio android-r8

3
推荐指数
1
解决办法
2349
查看次数

getParcelable() 由于 AGP 8 中的 ifTable 为空而崩溃

我最近更新到了 AGP 8,并在 Play 商店上发布了更新。我收到一些最近未更改的代码区域发生崩溃的报告。我相当有信心这是由 AGP 8 升级引起的崩溃,特别是在 R8 全模式周围。

崩溃周围的代码正在恢复布局管理器的状态。

恢复代码

if (savedInstanceState != null) {
    oldRecyclerLayoutState = savedInstanceState.getParcelableCompat(
        SIS_RECYCLER_LAYOUT_STATE,
    )
}
Run Code Online (Sandbox Code Playgroud)

保存实例代码

private lateinit var layoutManager: LinearLayoutManager
...
override fun onSaveInstanceState(outState: Bundle) {
    outState.putParcelable(SIS_RECYCLER_LAYOUT_STATE, layoutManager.onSaveInstanceState())
    super.onSaveInstanceState(outState)

}
Run Code Online (Sandbox Code Playgroud)

Class.isAssignableFrom()崩溃报告表明,读取 Parcelable 会崩溃,因为调用类时其 ifTable 为 null 。从AOSP中,我可以看到 anifTable是一个接口表。我假设isAssignableFrom正在使用 来ifTable确定可分配性,但是由于类为空,它无法读取它。不幸的是,该错误没有告诉我哪个类为空。

完整的堆栈跟踪:

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'java.lang.Object[] java.lang.Class.ifTable' on a null object reference in method 'boolean java.lang.Class.isAssignableFrom(java.lang.Class)'
       at java.lang.Class.isAssignableFrom(Class.java:579)
       at …
Run Code Online (Sandbox Code Playgroud)

android parcelable android-r8 android-gradle-plugin-8.0

3
推荐指数
1
解决办法
802
查看次数