问题剖析 - 两种不同的构建方式 在一个典型的场景中,在模块化应用程序并使用新的 Gradle 插件后,您的项目结构将如下所示: ? 一个典型的多功能安装 + 即时应用程序项目。...为你所有的即时应用功能启用 ProGuard(混淆) 在可安装的应用程序版本构建过程中,ProGuard(混淆)只运行一次:在使用 com.android.application 插件的模块中。...要解决这个问题,首先要启用 ProGuard(混淆)来开发即时应用程序(例如使用刚刚在前面步骤中设置的构建方式)。...请记住通过运行应用程序并检查所有可能的情况来彻底进行测试,因为某些错误只能在运行时发生。 ---- 希望本指南能够让你更好地理解为什么 ProGuard(混淆)可以使你的即时应用程序崩溃。...遵循这些步骤应该能带你完成构建,并防止你的即时应用程序崩溃。
方法一:通过“事件查看器”查看应用程序崩溃日志步骤:打开“事件查看器”:按下Win + R键,输入eventvwr.msc ,然后按回车。...导航到应用程序日志:在左侧导航栏中展开“Windows日志” -> “应用程序”。查找崩溃相关的错误日志:在右侧窗口中查找带有“错误”标志的日志条目。...方法三:启用并查看调试日志步骤:启用调试模式(如果支持):某些应用程序允许用户启用详细的调试日志记录功能。参考应用程序的帮助文档或设置菜单以启用此功能。触发崩溃问题:重现导致崩溃的操作。...导航到以下路径:计算机配置 -> 管理模板 -> Windows组件 -> Windows错误报告 启用崩溃转储文件生成:配置“启用内存诊断”策略以确保系统在崩溃时生成内存转储文件。...方法六:联系应用程序的技术支持步骤:收集所有相关信息:包括错误日志、崩溃时的操作步骤、系统配置等。提交问题报告:访问应用程序官方网站或联系技术支持团队,提供收集到的信息以获得进一步帮助。
'proguard-rules.pro' } } } 二、启用严格模式的资源引用检查 ---- 资源压缩器 压缩资源时 , 默认使用比较保守的模式 , 通过动态 id 获取资源不会被移除..., 压缩后的布局资源变成了如下内容 , 程序中没有引用该资源 , 在编译时 , 该资源自动替换成如下类型 ; kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' // 矢量图支持库 , 支持...混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat...命令执行目录 | 暴露更少信息 ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt ) 博客资源 :
不难看出,我们一般在打 release 包时才启用混淆,因为混淆会增加额外的编译时间,所以不建议在 debug 模式下启用。此外,需要注意的是:只有在启用混淆的前提下开启资源压缩才会有效!...其他应用程序访问组件时可能会用到类的包名加类名,如果经过混淆,可能会无法找到对应组件或者产生异常。...代码经过 ProGuard 混淆处理后,想要读取 StackTrace(堆栈追踪)信息就会变得很困难。...系统为我们提供了 retrace 工具,结合上文提到的 mapping.txt 文件,就可以将混淆后的崩溃堆栈追踪信息还原成正常情况下的 StackTrace 信息。...选择 ReTrace 栏 ,并添加我们项目中混淆生成的 mapping.txt 文件所在位置,然后将我们的混淆后的崩溃信息复制到 Obfuscated stack trace 那一栏,点击 ReTrace
启用混淆 .........不难看出,我们一般在打 release 包时才启用混淆,因为混淆会增加额外的编译时间,所以不建议在 debug 模式下启用。此外,需要注意的是:只有在启用混淆的前提下开启资源压缩才会有效!...其他应用程序访问组件时可能会用到类的包名加类名,如果经过混淆,可能会无法找到对应组件或者产生异常。...ProGuard 混淆处理后,想要读取 StackTrace(堆栈追踪)信息就会变得很困难。...系统为我们提供了 retrace 工具,结合上文提到的 mapping.txt 文件,就可以将混淆后的崩溃堆栈追踪信息还原成正常情况下的 StackTrace 信息。
启用混淆 .........不难看出,我们一般在打 release 包时才启用混淆,因为混淆会增加额外的编译时间,所以不建议在 debug 模式下启用。 此外,需要注意的是:只有在启用混淆的前提下开启资源压缩才会有效!...其他应用程序访问组件时可能会用到类的包名加类名,如果经过混淆,可能会无法找到对应组件或者产生异常。...ProGuard 混淆处理后,想要读取 StackTrace(堆栈追踪)信息就会变得很困难。...系统为我们提供了 retrace 工具,结合上文提到的 mapping.txt 文件,就可以将混淆后的崩溃堆栈追踪信息还原成正常情况下的 StackTrace 信息。
Gradle 面板中列出的任务(尤其是 other 和 build 分类下的)是由 AGP 在解析 buildTypes、productFlavors、flavorDimensions 等 DSL 配置后动态注册的...'), 'proguard-rules.pro' signingConfig signingConfigs.release // 启用 R8 全程序优化(...Crash(ClassNotFoundException) ProGuard/R8 误删反射类 在 proguard-rules.pro 中添加 -keep class your.package.**...{ *; } 打包速度极慢 未启用增量构建或缓存 启用 Gradle 缓存、关闭 lint(lintOptions { abortOnError false }) AAB 无法安装到设备 AAB 需通过...使用 AGP Variant API(AGP 7.0+) 新 API 更类型安全,支持 Kotlin DSL: androidComponents { onVariants(selector()
proguard-rules.pro 是 Android 项目中用于配置 ProGuard(或 R8)代码优化和混淆规则的配置文件,如果我们将代码进行混淆,对于我们的项目就能起到一定的保护作用,说起来简单...kotlin.android:启用 Kotlin 语言支持。 kotlin.compose:支持 Jetpack Compose(声明式 UI 框架)。...默认配置 (defaultConfig) defaultConfig { applicationId = "com.example.helloworld" // 应用唯一标识(发布后不可更改)..."), "proguard-rules.pro" ) } } minifyEnabled:若为 true,会启用代码压缩、混淆和优化(需配置 proguard-rules.pro...编译目标 JVM 版本 } 统一使用 Java 11 特性 功能开关 (buildFeatures) buildFeatures { compose = true // 启用 Jetpack
在设备或模拟器上 配置 Frida、Xposed 调试工具 , 这些工具可以动态 Hook 安卓应用的运行时函数 ; 一般情况下是 在有 root 权限的模拟器中 进行 动态 Hook 调试 ; 再后...的目标函数的核心逻辑 , 比如绕过登录 , 篡改数据 , 绕过付费流程 等 ; 二、Frida、Xposed 动态调试攻击应对措施 Frida、Xposed 动态调试攻击应对措施 : 混淆代码 : 启用...ProGuard , 将 Java 代码 或 Kotlin 代码混淆 , 这样会增加 Hook 关键函数的难度 ; 加密数据 : 使用 HTTPS 安全传输协议 加密传输 , 使用 OpenSSL 加密...如果发现被调试直接退出 ; 漏洞检测 : 对应用定期进行 漏洞检测 , 检查应用的漏洞和弱点 ; 三、调用 Debug.isDebuggerConnected 函数查询是否被动态调试 在 Android 应用程序中..., 可以使用 Debug.isDebuggerConnected 方法来检测当前是否有调试器连接 , 这个方法返回一个布尔值 , 指示调试器是否已连接到应用程序 , 该函数的函数原型如下 : public
文件时,会看到类似这样的结构: app.apk ├── AndroidManifest.xml # 二进制格式的清单文件 ├── classes.dex # 编译后的代码...DEX 文件 (classes.dex, classes2.dex…) 内容:编译后的 Java/Kotlin 代码 占比:通常 20-40% 特点:方法数超过 65536 时会生成多个 dex 文件...( 'proguard-android-optimize.txt' ), 'proguard-rules.pro' } }...} 配置 ProGuard/R8 规则 # proguard-rules.pro # 保留必要的类和方法 -keep class com.example.model.** { *; } -keep class...'armeabi-v7a' universalApk false } } } 评估是否需要原生库 检查是否真的需要 JNI 代码 考虑使用纯 Java/Kotlin
image.png demo模块的好处有两点: 方便开发时自己调试,自己写的库,自己写的过程中就要不停尝尝咸淡才能保证“真香” 库发布后可以编译出 apk 供人先行体验 注意 demo 模块的 build.gradle...而启用混淆的方法也很简单,在编译 release 版本的时候把混淆启用即可,就像这样: release { minifyEnabled true proguardFiles getDefaultProguardFile...把自己的 ProGuard 配置文件打包进 aar 我们经常在一些开源库的主页介绍下面看到一段 Proguard 内容,目的是让调用者把他加到自己 app 模块的 Proguard 配置文件中去。...Proguard 配置文件 合并后一起运行混淆,这样一来引用你 library 的人就再也不用担心混淆配置的问题了,因为你已经完全帮他做好。...armeabi-v7a', 'x86', 'x86_64' } } } 这么一来你的 library 编出来之后就会包含上面 5 种 abi,确保所有的新老机型起码都不会崩溃
鉴权失败") class RateLimited(val retryAfterMs: Long) : SdkError(3002, "请求过于频繁, ${retryAfterMs}ms 后重试...容错 — SDK 不能让宿主 App 崩溃kotlin 体验AI代码助手 代码解读复制代码// ✅ 核心原则: SDK 的任何异常都不能影响宿主 App!...ProGuard / R8 混淆 ││ consumerProguardFiles("proguard-rules.pro...} } fun init(context: Context, config: Config) { // 初始化时不采集数据, 等用户同意后才开始...* * 事件会先缓存在本地, 达到阈值后批量上报。 * 可以调用 [flush] 强制立即上报。 * * **线程安全**: 可以在任意线程调用。
本文我们将对 R8 的特性进行一个简要的介绍,并介绍可预期的代码缩减程度以及如何在 R8 中启用这些功能。...不过,大多数应用都会使用 Jetpack、OkHttp、Guava、Gson 和 Google Play 服务 等第三方库,并且用 Kotlin 编写的应用始终包含 Kotlin 标准库。...启用 R8 来压缩您的应用 要在 release build 上启用 R8 压缩,需要在应用的主 build.gradle 文件中将 minifyEnable 属性设置为 true,如下所示: android...压缩后,应用大小缩小到 6.45 MB,包含 45,831 个方法和 1 个 DEX 文件。...; } } 如您所见,处理后的代码比原始代码短得多。
文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 在 Android Studio 工程中 , 启用了 " android # buildTypes # debug " 中的 testCoverageEnabled...buildTypes { release { // 是否开启优化混淆 minifyEnabled true // 是否启用资源压缩..., 未使用的资源会被优化 shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt...'), 'proguard-rules.pro' } debug { applicationIdSuffix ".jerry"...:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' // 矢量图支持库 , 支持
A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers...kim.hsl.databinding_demo' compileSdk 32 kotlinOptions { jvmTarget = '9' } } 修改后的完整配置文件...: plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android {...versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 启用...'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION
尤其是大量使用 Kotlin 扩展函数、Lambda 的代码库,内联效果明显。....** { *; }# 保留通过字符串名称动态调用的方法 -keepclassmembers class * { @com.example.annotation.Keep *; } 接口单一实现被合并后,...com.google.gson.annotations.SerializedName ; } 验证策略:先在 QA/Staging 跑一轮,再上 Release R8 全模式最好的验证方式是:开启 minifyEnabled true 并在 debug 构建类型里也启用...一旦有崩溃,立刻能看到 stacktrace。...Performance 监控关键指标 • 全量发布后,冷启动时间、ANR 率、渲染帧率全线改善 他们报告的具体数据: 指标 改善幅度 原因 冷启动时间 最高 35% 类加载减少 + 方法内联 ANR
ProGuard代码混淆在Android开发中,代码混淆是一项重要的安全措施。通过代码混淆,可以有效地保护应用程序的源代码不被轻易地反编译和逆向工程。...最终生成一个或多个输出的jar文件,这些文件包含了混淆后的代码。如何在Android项目中启用ProGuard1....测试和调试启用ProGuard后,建议在发布前进行充分的测试,确保应用的功能没有受到影响。如果遇到问题,可以通过查看日志和使用-printmapping选项生成映射文件来定位问题。...测试和调试在启用 ProGuard 后,建议进行以下步骤以确保应用正常运行:构建 Release 版本:使用 ....调整规则:根据测试结果调整 ProGuard 规则,确保关键类和方法不被混淆。ProGuard 是一个用于 Android 应用程序的代码优化和混淆工具。
R8 (可选,但推荐使用) R8 以前是用来优化和缩减应用体积的,它基本上就是 ProGuard 的一个替代方案。...R8 不是默认开启的,如果您希望使用它 (例如您想要这里讨论到的那些优化时),就需要启用它。...它将在所有其他编译工作后执行,来保证您获得的是一个缩减和优化过的应用。...’), ‘proguard-rules.pro’ } } } 枚举 现在,让我们讨论一下枚举。...探索 R8 与 Kotlin,然后用 Kotlin 写出更好的应用吧。
keep " : 不要混淆的类 ; # com 包名下的类不要混淆 -keep class com.**{*;} 三、混淆前后对比 ---- 混淆前编译的 APK 安装包 : \rm 3.6 MB 混淆后编译的...kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation "org.jetbrains.kotlin...:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' // 矢量图支持库 , 支持...混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat...命令执行目录 | 暴露更少信息 ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt ) 博客资源 :
1、basic.gradle apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin...指定在生成项目时要使用的 SDK 工具的版本,Android Studio 3.0 后不需要手动配置。...此处根据产品内容进行相关设置,如果仅仅支持中文,建议配置,进一步减少 apk 大小 resConfigs "zh" // 启用多 dex 文件 multiDexEnabled...// 签名配置 signingConfig signingConfigs.config // 启用资源缩减...hostType", "3" buildConfigField "boolean", "LOG_DEBUG", "false" } } // 生成构建后输出的