由于一个错误,我使用了 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 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) 过去几个小时我一直在研究这个,但没有任何运气。无论如何,类名都不会被混淆。这些只是常规类,而不是活动、服务或 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 项目时调试 R8 吗?
我有一个非常奇怪的错误,随意的修复无济于事
所以今天我决定尝试制作一个动态功能模块。我启用了 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
我如何才能找出 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) 假设我有 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.acom.example.libraryB->a.a.b这将避免任何潜在的冲突。这样的事情可以实现吗?
我正在尝试使用 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 项目中为依赖项添加 R8 规则,并从缩小和混淆中排除文件和包?。
我第一次尝试使用 R8 的 Android Studio 版本来执行混淆和代码优化。
\n正如官方文档所说:
\n\n\n混淆你的代码
\n混淆的目的是通过缩短应用程序\xe2\x80\x99s 类、方法和\n字段的名称来减小应用程序的大小。
\n
我认为R8会重命名所有方法和类名,但是如果我通过“Build -> Analytics APK...”分析APK,我可以读取大部分原始方法和类名。
\n\nContenuti是 中提到的一个 Activity manifest.xml。
mostraView和nascondiView是我创建的方法,它们不在任何库中,它们不扩展任何内容,所以我希望看到它们的名称发生变化。
void mostraView(View v)\n{\n v.setVisibility(View.VISIBLE);\n}\nvoid nascondiView(View v)\n{\n v.setVisibility(View.GONE);\n}\nRun Code Online (Sandbox Code Playgroud)\nR8 的行为正确吗?
\n如何设置 R8 来混淆所有这些,或者至少这两个?
\n多谢!
\n我目前正在项目中设置 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)
这很可能是问题的根源。
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-r8 ×12
android ×11
proguard ×5
firebase ×2
obfuscation ×2
android-d8 ×1
build ×1
gradlew ×1
performance ×1