点击小卡片,回复 “合集” 获取系统性的学习笔记和测试开发技能图谱 背景 从 Android 9(API 级别 28)开始,Android 平台对应用能使用的非 SDK 接口实施了限制,只要应用引用非...区分 SDK 接口和非 SDK 接口 一般而言,公共 SDK 接口是在 Android 框架软件包索引中记录的那些接口,非 SDK 接口的处理是 API 抽象出来的实现细节,因此这些接口可能会在不另行通知的情况下随时发生更改...为了避免发生崩溃和意外行为,应用应仅使用 SDK 中经过正式记录的类,这也意味着当您的应用通过反射等机制与类互动时,不应访问 SDK 中未列出的方法或字段。...级别): greylist 无限制,可以正常使用 blacklist 无论什么版本的手机系统,使用这些api,系统将会抛出异常 greylist-max-o 受限制的灰名单,APP运行在 版本APP运行在 版本10.0且运行在>10.0的手机会抛出异常 测试你的应用是否使用了非 SDK 接口 这里我们通过veridex工具进行测试,veridex
当 ProGuard(混淆)集成到 Android 构建中时,新的 com.android.feature Gradle 插件(用于构建 AIA (安卓即时应用程序)模块)根本不存在,并且 ProGuard...例如:base feature 编译,代码缩减和打包发生时无需查看 feature 1 和 2 中包含的任何代码。...在你构建你的可安装程序中启用 ProGuard(混淆)并修复所有的运行时异常 这是最困难的部分,也是唯一不容易复现的部分,因为每个项目所需的 ProGuard(混淆)配置规则会有所不同。...为你所有的即时应用功能启用 ProGuard(混淆) 在可安装的应用程序版本构建过程中,ProGuard(混淆)只运行一次:在使用 com.android.application 插件的模块中。...android.app.AlertDialog$Builder android.app.Notification$InboxStyle 最后使用[comm](https://linux.die.net
虽然有些错误会在构建应用时发生,您能及时发现,但是也有些错误您只能在运行时发现,所以请确保您的应用经过彻底的测试。 如何使用 ProGuard?...当您只从 XML 资源引用您的代码会时(通常使用底层的反射),这个情况也会发生。 在一次 Android 典型的构建过程中,AAPT(处理资源的工具)会生成一个额外的 ProGuard 规则文件。...这会在下面的场景中发生: 当 ProGuard 移除过多的类 在某些情况下,ProGuard 并不知道一个类或者方法被使用了,例如这个类仅在反射时被使用或者仅在 XML 中被引用。...当运行时发生了 ClassNotFoundException 或 MethodNotFoundException 异常意味着您肯定缺失了某些类或者方法,也许是 ProGuard 移除了他们,又或者是因为错误配置依赖而导致无法找到他们...这在许多情况下可以时您的应用避免崩溃的发生,但是这些配置并不是 100% 适合您的应用。您可以移除掉默认的 ProGuard 文件而使用您自己的。
ProGuardActivity.java package org.jssec.android.log.proguard; import android.app.Activity; import android.os.Bundle...为了在构建发行版时,确实删除了输出开发日志信息的代码,应该构建系统,使用某些工具自动执行代码删除。 “4.8.1 示例代码”中介绍的 ProGuard 可以用于此方法。...另一方面,为了使开发者输出程序异常的细节来记录,当异常发生时,在某些情况下,堆栈踪迹通过Log.e(..., Throwable tr)/w(..., Throwable tr)/i(..., Throwable...为了减少上述错误发生的风险,建议仅使用android.util.Log类的方法。 4.8.3 高级话题 4.8.3.1 发布版应用中日志输出的两种思路 发布版应用中有两种思考日志输出的方式。...使用Exception#printStackTrace()时 隐式输出到System.err时(当异常没有被应用捕获时,它会由系统提供给Exception#printStackTrace()。)
腾讯云移动开发平台 MobileLine 简介 移动开发平台(MobileLine)提供各种服务帮助您快速构建移动应用并推动业务增长。...优点 免费使用 零代码集成 闭环开发体验 高质量服务 崩溃监控服务(bugly) 专业、全面的异常监控解决方案。...接入后自动上报异常,支持崩溃分析/卡顿分析/错误分析等,按类型查看上报问题的列表;24小时实时监控和告警,让您及时发现异常问题,不错过每一次异常;丰富的现场出错数据,辅助您快速定位异常问题,提升解决效率...只要简单几步,设置完成后,就可以在控制台查看APP发生的异常信息。 [控制台] 如何集成到自己的APP呢?...一、首先我们在Android Studio创建一个APP [app] 包名为com.example.admin.myapplication 二、在 MobileLine 控制台上创建项目和应用 创建项目和应用
预计阅读时间: 18分钟 前言 随着APP的一次又一次迭代,APP的体积也越来越大,这时候,会引发这么一个问题,早期的错误异常如下: Conversion to Dalvik format failed...通过 ProGuard 移除未使用的代码 为版本构建启用代码压缩以运行 ProGuard。启用压缩可确保交付的 APK 不含有未使用的代码。...Dalvik 可执行文件分包支持库的局限性 Dalvik 可执行文件分包支持库具有一些已知的局限性,将其纳入APP应用构建配置之中时,我们应该注意这些局限性并进行针对性的测试: 启动期间在设备数据分区中安装...如果APP目标 API 级别低于 14,请务必针对这些版本的平台进行测试,因为应用可能会在启动时或加载特定类群时出现问题。...则可能会在运行期间发生崩溃。
Android Studio 默认的混淆方案及字段解读 开启混淆 参见google官方文档压缩代码和资源 要通过Proguard启动代码压缩,在build.gradle文件内相应的构建类型中添加minifyEnabled...通过试验,gradle 2.2之后,defaultProguardFile没有使用sdk目录下的proguard-android.txt,而是使用了gradle自带的proguard-android.txt...构建输出 构建时Proguard都会输出下列文件: (1)dump.txt —- 说明APK中所有类文件的内部结构 (2)mapping.txt —- 提供原始与混淆过的类、方法和字段名称之间的转换...中手动添加抛出异常时保留代码行号,并且重命名抛出异常时的文件名称,这样能方便定位问题: 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable 重命名抛出异常时的文件名称...-keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction
前言 随着APP的一次又一次迭代,APP的体积也越来越大,这时候,会引发这么一个问题,早期的错误异常如下: ? 较新版本的 Android 构建系统虽然显示的错误不同,但指示的是同一问题: ?...通过ProGuard移除未使用的代码 为版本构建启用代码压缩以运行 ProGuard。启用压缩可确保交付的 APK 不含有未使用的代码。...Dalvik 可执行文件分包支持库的局限性 Dalvik 可执行文件分包支持库具有一些已知的局限性,将其纳入APP应用构建配置之中时,我们应该注意这些局限性并进行针对性的测试: 启动期间在设备数据分区中安装...如果APP目标 API 级别低于 14,请务必针对这些版本的平台进行测试,因为应用可能会在启动时或加载特定类群时出现问题。...则可能会在运行期间发生崩溃。
除了缩减Java 代码外,还可以缩减使用过的资源。 缩减资源 当给App 打包时,Gradle 和Gradle 的Android 插件可以在构建期间删除所有未使用的资源。...自动缩减 最简单的方式是在你的构建中设置shrinkResources 属性。如果设置该属性为true,则Android 构建工具将自动判定哪些资源没有被使用,并将它们排除在APK 外。...使用此功能有一个要求,即必须同时启动ProGuard。这是因为缩减资源的工作方式是,直到代码引用这些资源被删除之前,Android 构建工具不能指出哪些资源没有被用到。...–nfo 当你使用该标志时,Gradle 会打印出许多关于构建过程的额外信息,包括最终构建不会输出的每个资源。...自动资源缩减有一个问题,即它可能移除了过多的资源,特别是那些被动态使用的资源可能被意外删除。为了防止这种情况的发生,你可以在res/raw/ 下的一个叫作keep.xml的文件中定义这些例外。
ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。...Proguard作用 Android中的“混淆”可以分为两部分,一部分是 Java 代码的优化与混淆,依靠 proguard 混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系...gradle 在四处地方寻找重复资源: src/main/res/ 路径 不同的构建类型(debug、release等等) 不同的构建渠道 项目依赖的第三方库 合并资源时按照如下优先级顺序: 依赖 ->...-keepattributes InnerClasses:保持内部类不被混淆 -keepattributes SourceFile,LineNumberTable:抛出异常时保留代码行号 3.2 保留选项...-keepattributes Exceptions #保持内部类不被混淆 -keepattributes Exceptions,InnerClasses #抛出异常时保留代码行号 -keepattributes
必要时,我们可以使用 Android Gradle 插件的 resConfigs 属性来移除您的应用不需要的备用资源文件(常见的有用于国际化支持的 strings.xml,适配用的 layout.xml...其实,我们在使用代码混淆时,ProGuard 对我们项目中大部分代码进行了混淆操作,为了防止编译时出错,我们应该通过 keep 命令保留一些元素不被混淆。...其他应用程序访问组件时可能会用到类的包名加类名,如果经过混淆,可能会无法找到对应组件或者产生异常。...幸运的是,ProGuard 为我们提供了补救的措施,在着手进行之前,我们先来看一下 ProGuard 每次构建后生成了哪些内容。...ProGuard 创建发布构建时都都会覆盖之前版本的 mapping.txt 文件,因此我们每次发布新版本时都必须小心地保存一个副本。
在 Android 日常开发过程中,混淆是我们开发 App 的一项必不可少的技能。只要是我们亲身经历过 App 打包上线的过程,或多或少都需要了解一些代码混淆的基本操作。那么,混淆到底是什么?...其实,我们在使用代码混淆时,ProGuard 对我们项目中大部分代码进行了混淆操作,为了防止编译时出错,我们应该通过 keep 命令保留一些元素不被混淆。...其他应用程序访问组件时可能会用到类的包名加类名,如果经过混淆,可能会无法找到对应组件或者产生异常。...幸运的是,ProGuard 为我们提供了补救的措施,在着手进行之前,我们先来看一下 ProGuard 每次构建后生成了哪些内容。...ProGuard 创建发布构建时都都会覆盖之前版本的 mapping.txt 文件,因此我们每次发布新版本时都必须小心地保存一个副本。
class/merging/* # 混淆时所采用的算法 -keep public class * extends android.app.Activity # 保持哪些类不被混淆 -keep...retrace.jar主要在debug时使用。...混淆之后的jar文件执行过程如果出现异常,生成的异常信息将很难被解读,方法调用的堆栈都是一些混淆之后的名字,通过retrace.jar可以将异常的堆栈信息中的方法名还原成混淆前的名字,方便程序解决bug...避免混淆泛型 # 这在JSON实体映射时非常重要,比如fastJson -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile...打包时忽略警告 当在导出时,发现很多could not reference class之类的warning信息,如果确认app运行中和那些引用没有什么关系的话,就可以添加-dontwarn标签,就不会在提示这些
时避免在客户端做处理,当心内存泄露 使用Robolectric单元测试,Robotium 做UI测试 使用Genymotion 作为你的模拟器 总是使用ProGuard 和 DexGuard混淆来项目...使用Gradle,完成以下工作很方便: 构建APP不同版本的变种 制作简单类似脚本的任务 管理和下载依赖 自定义秘钥 更多 同时,Android Gradle插件作为新标准的构建系统正在被Google...你是否使用ProGuard取决你项目的配置,当你构建一个release版本的apk时,通常你应该配置gradle文件。...更多例子请参考Proguard。 在构建项目之初,发布一个版本 来检查ProGuard规则是否正确的保持了重要的部分。...不要等到你的app要发布 "1.0"版本了才做版本发布,那时候你可能会碰到好多意想不到的异常,需要一些时间去修复他们。 Tips每次发布新版本都要写 mapping.txt。
使用方式:在 build.gradle 文件中配置 proguard-rules.pro 文件,然后在项目构建时执行混淆。...iOS APP加固代码实现 以下是使用 ProGuard 工具对 iOSAPP 进行代码混淆的示例: 在项目 build.gradle 文件中添加以下代码: buildTypes { release...在构建 release 版本时,自动启用混淆并将混淆后的 APK 文件输出到 app/build/outputs/apk/release 文件夹中。...在使用加固技术时,需要注意以下几点: 加固技术不能完全杜绝破解行为,只能增加攻击者的难度,在应用程序开发过程中需从多个方面提高应用程序的安全性。...加固需要经过充分测试与验证,确保应用程序没有异常,预期功能都正常运行。 在使用加固技术时,需要保护用户的隐私和数据安全,确保应用程序遵守安全规范和法律规定。
官方流程.png 虚线方框是打包APK的操作,现在开发Android都是使用的Android Studio基于gradle来构建项目,所有打包操作都是执行gradle脚本来完成,gradle编译脚本具有强大的功能...retrace.jar主要是在debug时使用。...,任何APP都要使用,可以作为模板使用,具体如下: # 代码混淆压缩比,在0和7之间,默认为5,一般不需要改 -optimizationpasses 5 # 混淆时不使用大小写混合,混淆后的类名为小写...避免混淆泛型,这在JSON实体映射时非常重要,比如fastJson -keepattributes Signature //抛出异常时保留代码行号,在异常分析中可以方便定位 -keepattributes...针对第三方jar包的解决方案 我们在Android项目中不可避免要使用很多第三方提供的SDK,一般而言,这些SDK是经过ProGuard混淆的,而我们所需要做的就是避免这些SDK的类和方法在我们APP
【混淆时不会产生形形色色的类名 】 -dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 ...* extends android.app.Application -keep public class * extends android.app.Service -keep public class...* extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】 public void *(android.view.View); }.../article/details/7100841 加入第三方jar包之后常出现的几个异常: proguard returned with error code 1.See console 情况1:...:78) [2011-10-21 13:22:32 - ZMKSMarket_Build_v1.0] at proguard.ProGuard.main(ProGuard.java:499) 抛出这样的异常的原因是第三方
proguard-android.txt文件作为默认的ProGuard配置文件。...具体的ProGuard配置,可以参照官网压缩代码和资源 Shrinking resources Gradle和Android Plugin在App打包的时候,会把没用的资源都删掉。...启用后,会在第一次启动构建的时候启动一个后台进程。当后续的构建启动时,都会使用这个后台进程,因此会节省一些启动的开销。这个进程会在你使用Gradle期间一直存在,而在空闲3个小时后关闭。...使用Daemon在短时间内构建是非常有用的。...以下为一个执行完多Module的构建任务的Report: ? Profile Report 这个Profile Report展示了每个阶段执行任务时所消耗的时间。
以我们的常用开发工具andorid studio 为例,Android Studio自身集成Java语言的ProGuard作为压缩,优化,混淆和预校验,并配合Gradle工具进行构建,我们只需要在工程应用目录的...大家看到了,有两个混淆文件,proguard-android.txt和proguard-rules.pro,proguard-rules.pro是我们需要自己编写的混淆文件,proguard-android.txt...android.app.Activity -keep public class * extends android.app.Application -keep public class * extends...自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的; 4,与服务端交互时,使用GSON、fastjson等框架解析服务端数据时...JS调用也需要保证写的接口方法不混淆,原因和第一条一样; 7,Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常
领取专属 10元无门槛券
手把手带您无忧上云