标签: android-r8

如何使用最新的 R8 Shrinker 版本

由于一个错误,我使用了 R8 Shrinker 的本地 jar 文件(由 R8 团队推荐),并将类路径添加到 top gradle.build

classpath files($..../R8.jar/$)
Run Code Online (Sandbox Code Playgroud)

现在不管 Android Studio 有任何更新,Gradle 构建仍然使用R8我以前使用过的旧版本V. 1.4.55

最近我看到他们发布了最新版本:https : V. 1.4.69 //r8.googlesource.com/r8/

所以我的问题是:How to configure gradle to tell to use the latest version of R8, 因为我没有看到任何关于这个的文档

android android-gradle-plugin android-r8

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

R8 从 AndroidStudio 内抛出 NullPointerException,但不会通过 gradlew 从命令行抛出

问题

当我点击 Android Studio 中的调试图标时,我从 R8 中得到了这个 NullPointerException。

Executing tasks: [:app:assembleDebug] in project /Users/gary/Developer/Foo/Foo-Android

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:checkDebugManifest UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:mainApkListPersistenceDebug
> Task :app:generateDebugResValues
> Task :app:generateDebugResources
> Task :app:createDebugCompatibleScreenManifests
> Task :app:processDebugManifest
> Task :app:mergeDebugResources
> Task :app:processDebugResources
> Task :app:kaptGenerateStubsDebugKotlin

> Task :app:kaptDebugKotlin
w: [kapt] Incremental annotation processing requested, but support is disabled because the following processors are …
Run Code Online (Sandbox Code Playgroud)

gradlew android-studio android-gradle-plugin android-r8

3
推荐指数
2
解决办法
8203
查看次数

Android R8 不会混淆类名

过去几个小时我一直在研究这个,但没有任何运气。无论如何,类名都不会被混淆。这些只是常规类,而不是活动、服务或 Android 清单中的其他内容(我知道这些不会被混淆)。我在这里缺少什么?

在此处输入图片说明

Android Gradle Plugin version: 4.0.0
Gradle version: 6.1.1
Android Studio version: 4.0
Run Code Online (Sandbox Code Playgroud)

在这些版本中,R8 应默认启用。这是我的 buildType 配置:

buildTypes {
    release {
        //useProguard false // even tried this without luck
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 proguard-rules.pro

-ignorewarnings

# --- Glide ---
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# --- Billing library ---
-keep class …
Run Code Online (Sandbox Code Playgroud)

android proguard android-r8

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

如何在编译期间调试 R8?

有什么办法可以在编译 Android 项目时调试 R8 吗?

我有一个非常奇怪的错误,随意的修复无济于事

android android-d8 android-r8

2
推荐指数
1
解决办法
1061
查看次数

资源收缩器不能用于多 apk 应用程序

所以今天我决定尝试制作一个动态功能模块。我启用了 R8,并将 minifyEnabled 和 ShrinkResources 设置为 true。尝试编译时出现以下错误。

Resource shrinker cannot be used for multi-apk applications
Affected Modules: app
Run Code Online (Sandbox Code Playgroud)

还有其他人看过这个吗?关于堆栈也有类似的问题,但与 DFM 没有直接关系。

我希望保持此标志处于启用状态以避免库膨胀

摇篮插件:4.0.0

Gradle 包装器:6.1.1

android android-gradle-plugin android-r8 dynamic-feature-module

2
推荐指数
1
解决办法
4163
查看次数

如何获取 Android Gradle 插件正在使用的 R8 版本?

我如何才能找出 Android Gradle 插件正在使用哪个版本的 R8,比如说 4.0.1?

buildscript {
  repositories {
    google()
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:4.0.1'
  }
}
Run Code Online (Sandbox Code Playgroud)

android android-r8

2
推荐指数
1
解决办法
281
查看次数

如何混淆两个不同“.aar”的包名称而不发生重复的类冲突?

假设我有 3 个子项目(模块):

:libraryA
:libraryB
:app
Run Code Online (Sandbox Code Playgroud)

:app取决于:libraryA:libraryB。在我的图书馆中,我有:

// libraryA
com.example.libraryA.Class1
// libraryB
com.example.libraryB.Class2
Run Code Online (Sandbox Code Playgroud)

当我在这两个库上运行 R8(如 proguard)时,它们会生成以下类:

// libraryA - Class1
a.a.a.a
// libraryB - Class2
a.a.a.a

(note that 2 different classes end up having the same signature)
Run Code Online (Sandbox Code Playgroud)

当我构建:app使用混淆的和 的.aar变体时,出现以下构建失败::libraryA:libraryB

Caused by: com.android.tools.r8.utils.b: Type a.a.a.a is defined multiple times:
Run Code Online (Sandbox Code Playgroud)

-keeppackagenames一种解决方案是在我的库的混淆器规则中使用

-keeppackagenames com.example.**
Run Code Online (Sandbox Code Playgroud)

但我想真正混淆包名称。我在这里有什么选择?

是否可以以唯一但确定的方式混淆包名称?例如,我希望发生以下情况:

  • com.example.libraryA->a.a.a
  • com.example.libraryB->a.a.b

这将避免任何潜在的冲突。这样的事情可以实现吗?

obfuscation android proguard android-r8

2
推荐指数
1
解决办法
1055
查看次数

使用 R8 和 proguard 删除日志记录,但关闭其他所有内容

我正在尝试使用 R8 和 proguard 从发布版本中删除日志记录。问题是我目前需要这是微创的,所以我想启用 R8/proguard 来删除日志,但关闭其他所有内容。IE缩小、混淆等

构建.gradle:

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

proguard-rules.pro:

-dontobfuscate
-dontoptimize
-dontshrink

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int w(...);
    public static int e(...);
    public static int d(...);
    public static int i(...);
}
Run Code Online (Sandbox Code Playgroud)

但是,在构建和部署发布版本时,日志不会被删除。我想这是因为假设没有副作用作为我关闭的选项之一的一部分运行。

我也尝试过这个:

-keep class ** { *; }

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int w(...);
    public static int e(...);
    public …
Run Code Online (Sandbox Code Playgroud)

android proguard android-r8

2
推荐指数
1
解决办法
2338
查看次数

如何在android中添加r8规则?

我们如何在 android 项目中为依赖项添加 R8 规则,并从缩小和混淆中排除文件和包?。

performance android proguard android-r8

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

为什么 R8 不重命名所有方法和类?

我第一次尝试使用 R8 的 Android Studio 版本来执行混淆和代码优化。

\n

正如官方文档所说:

\n
\n

混淆你的代码

\n

混淆的目的是通过缩短应用程序\xe2\x80\x99s 类、方法和\n字段的名称来减小应用程序的大小。

\n
\n

我认为R8会重命名所有方法和类名,但是如果我通过“Build -> Analytics APK...”分析APK,我可以读取大部分原始方法和类名。

\n

在此输入图像描述\n在此输入图像描述

\n

Contenuti是 中提到的一个 Activity manifest.xml

\n

mostraViewnascondiView是我创建的方法,它们不在任何库中,它们不扩展任何内容,所以我希望看到它们的名称发生变化。

\n
void mostraView(View v)\n{\n     v.setVisibility(View.VISIBLE);\n}\nvoid nascondiView(View v)\n{\n     v.setVisibility(View.GONE);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

R8 的行为正确吗?

\n

如何设置 R8 来混淆所有这些,或者至少这两个?

\n

多谢!

\n

obfuscation android build android-studio android-r8

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

Firebase + Proguard/R8

我目前正在项目中设置 Firebase (FCM),当我运行经过 R8 混淆的应用程序时遇到问题,Firebase 服务 (FirebaseMessagingService) 不再工作。有人遇到过同样的问题吗?有什么解决办法吗?

UPD:最后我通过降级到 FCM 修复了它

com.google.firebase:firebase-messaging:15.0.0
Run Code Online (Sandbox Code Playgroud)

现在使用了一些已弃用的类,但它仍然有效。

UPD2:在使用最新版本的库运行混淆的应用程序时,我还注意到日志中的警告:

W/FA: Failed to retrieve Firebase Instance Id
Run Code Online (Sandbox Code Playgroud)

这很可能是问题的根源。

android firebase firebase-cloud-messaging android-r8

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

java.lang.IncompatibleClassChangeError inside FirebaseInitProvider.onCreate when starting app with minifyEnabled true

Tested Environment / Dependencies

  • Android Studio: Android Studio Arctic Fox Beta 2 and Bumblebee Canary 1
  • AGP: 7.1.0-alpha01
  • Firebase Analytics: com.google.firebase:firebase-analytics-ktx:19.0.0
  • Firebase Crashlytics: com.google.firebase:firebase-crashlytics-ktx:18.0.0
  • minifyEnabled: true
  • Proguard Config specifically for Firebase: None

What's happening

When I build my app with minifyEnabled = true and try to start the app, app crashes right after it launches with the following crash log:

2021-05-29 22:30:37.652 16541-16541/com.my.app.package.name E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.my.app.package.name, PID: 16541
    java.lang.IncompatibleClassChangeError: Class j$.util.concurrent.i implements non-interface class e.a (declaration of …
Run Code Online (Sandbox Code Playgroud)

android proguard firebase android-gradle-plugin android-r8

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