随着android studio推出了两款新工具D8和R8.根据谷歌文档D8是一个dex工具,R8是一个progourd工具,但由于他们的解释两者都做了几乎相同的事情如下:
D8是一个将java字节代码转换为dex代码的dexer.
R8是一个java程序缩小和缩小工具,它将java字节代码转换为优化的dex代码.
它似乎都将java字节代码逐字转换为dex代码.那么,实际上他们在转换dex代码时是在内部做什么的?
Firebase Crashlytics 中出现崩溃,并附有如何解决问题的注释:
致命异常:java.lang.IllegalStateException:必须使用类型参数创建 TypeToken:new TypeToken<...>() {}; 使用代码压缩器(ProGuard、R8...)时,请确保保留通用签名。
我的尖括号 <...> 之间的通用类名为ApiResponse。我用jsonschema2pojo创建它。
我使用Android Studio 3.3 Canary 5,Gradle 4.9,gradle插件3.3.0-alpha05
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
Run Code Online (Sandbox Code Playgroud)
不起作用
编辑:
@JakeWharton:“您为此使用ProGuard配置,而不是Gradle DSL。使用-dontshrink禁用收缩,使用-dontobfuscate禁用混淆,以及使用-dontoptimize禁用优化。”
我有一个应用程序,它崩溃了,就像每个好的应用程序应该的一样!不久前,Android 构建工具开始使用R8而不是Proguard。它有效并加快了我的构建速度,所以我不理会它。然后出现了一个异常堆栈跟踪,我必须对其进行反混淆。我使用了 proguard UI、retrace.bat脚本和命令行,但所谓的反混淆堆栈跟踪仍然看起来很模糊。
查看mapping.txt生成的结果,我在映射中看到了一堆我不记得以前见过的数字(行号?)。我怀疑这些是反混淆器首先失败的原因。
目前有什么方法可以对此类堆栈跟踪进行反混淆处理吗?
我在动态功能模块中使用 DataBinding 有问题。
当我无法生成与我的片段相关的绑定对象时 isMinifyEnabled = true
通常,我尝试使用此代码来执行此操作:
val viewDataBinding: FragmentFeature1Binding = DataBindingUtil.inflate(inflater, layoutId, container, false)
但返回的inflate()值始终为 null,没有任何附加消息。我试图FragmentFeature1Binding直接使用膨胀布局,但我得到了相同的结果。
当我将片段移动到app模块中时,一切正常。
我的应用程序build.gradle.kts:
android {
compileSdkVersion(AndroidVersions.compileSdk)
buildToolsVersion(AndroidVersions.buildTools)
dataBinding.isEnabled = true
defaultConfig {
applicationId = ApplicationConfig.id
minSdkVersion(AndroidVersions.minSdk)
targetSdkVersion(AndroidVersions.targetSdk)
versionCode = ReleaseVersions.versionCode
versionName = ReleaseVersions.versionName
}
buildTypes {
getByName(BuildTypes.debug) {
isMinifyEnabled = true
isShrinkResources = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
buildConfigField("Long", "API_TIMEOUT_IN_SECONDS", "30l")
}
}
compileOptions {
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_1_8
}
dynamicFeatures …Run Code Online (Sandbox Code Playgroud) android android-databinding android-r8 dynamic-feature-module
在 build.gradle (app) 文件中,我们默认有这个,
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
根据https://developer.android.com/studio/build/shrink-code,
minifyEnabled true 使代码更安全(使逆向工程变得困难)并缩小我们用于发布应用程序的发布版本的大小。
我知道使用minifyEnabled true会使编译时间更长,但通常调试版本用于开发和测试,无论如何都不会受到影响。
我正在寻找的是,minifyEnabled true在运行时使用会导致哪些缺点(例如性能影响)。我不担心发布版本的构建时间。
Google Play Console 还建议我们启用它,因此我想知道为什么minifyEnabled默认情况下禁用它。
我将 Android Studio 版本从 4.1 更新到 4.2,但该项目未编译,因为 Proguard 版本非常旧(4.7)并且与 Java 10 不兼容,但是我决定将项目从 proguard 迁移到 R8,但该项目由于此错误而无法编译:
File not found: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/lib/rt.jar
然后我将 R8 设置为 false 并使用 Proguard 将这一行添加到我的 build.gradle 中,以便将我的 Proguard 更新到更高版本:
classpath 'net.sf.proguard:proguard-gradle:6.1.1'
但我仍然遇到了同样的错误,而不是第一个告诉我更新新版本的 Proguard 的错误。
那么我该如何修复 rt.jar 呢?也许一个 AS 版本和另一个 AS 版本之间的某些目录发生了变化?,如果我将 android studio 降级到 4.1 并恢复我所做的所有更改,该项目工作正常,但我想升级 Android Studio。
将 kotlin 版本 ( ext.kotlin_version ) 更新到1.6.10后,出现一些错误:
com.android.tools.r8.internal.E00: Unexpected type in conversion to primitive: OBJECT
Execution failed for task ':app:minifyReleaseWithR8'.
> com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Lcom/facebook/login/DefaultAudience$EnumUnboxingLocalUtility;getNativeProtocolAudience(I)Ljava/lang/String;, origin: ..\.gradle\caches\transforms-3\57102c4e3d32396b86898e5ca0dd620d\transformed\jetified-facebook-core-7.1.0-runtime.jar:com/facebook/login/DefaultAudience.class
Run Code Online (Sandbox Code Playgroud)
如果我在build.gradle (:app)中使用选项minifyEnabled true 和生成签名包,就会发生这种情况。如果我使用旧的ext.kotlin_version(例如 1.5.0),则不会出现此错误。
我认为,如果我在proguard-rules.pro中使用正确的规则,我可以解决这个问题。
这是我们的R8版本
当前版本是:1.4.94(从 go/r8bot 构建 390954928f0db9c3b888a367f7f128ce3bbfb160 (luci-r8-ci-archive-0-5g74))。
当我从
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
到
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
我们收到以下错误。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code": 403,
"errors": [
{
"domain": "usageLimits",
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
"reason": "dailyLimitExceededUnreg",
"extendedHelp": "https://code.google.com/apis/console"
}
],
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:378)
at com.google.api.client.http.HttpRequest.a(HttpRequest.java:1067)
at …Run Code Online (Sandbox Code Playgroud) 我安装了新版本的 Android Studio 并更新了我的项目(不更改依赖项),但遇到了以下问题:
Missing class com.google.protobuf.java_com_google_android_gmscore_sdk_target_granule__proguard_group_gtm_N1281923064GeneratedExtensionRegistryLite$Loader (referenced from: java.util.List kotlinx.coroutines.internal.FastServiceLoader.load(java.lang.Class, java.lang.ClassLoader))
Missing class org.bouncycastle.jsse.BCSSLParameters (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 1 other context)
Missing class org.bouncycastle.jsse.BCSSLSocket (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 5 other contexts)
Missing class org.bouncycastle.jsse.provider.BouncyCastleJsseProvider (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.<init>())
Missing class org.conscrypt.Conscrypt$Version (referenced from: boolean okhttp3.internal.platform.ConscryptPlatform$Companion.atLeastVersion(int, int, int))
Missing class org.conscrypt.Conscrypt (referenced from: boolean okhttp3.internal.platform.ConscryptPlatform$Companion.atLeastVersion(int, int, int) and 4 other contexts)
Missing class org.conscrypt.ConscryptHostnameVerifier (referenced from: okhttp3.internal.platform.ConscryptPlatform$DisabledHostnameVerifier)
Missing class org.openjsse.javax.net.ssl.SSLParameters (referenced from: void okhttp3.internal.platform.OpenJSSEPlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, …Run Code Online (Sandbox Code Playgroud) android-r8 ×10
android ×9
proguard ×5
gradle ×2
obfuscation ×2
android-d8 ×1
dex ×1
facebook ×1
generics ×1
gson ×1
jar ×1
okhttp ×1