ProGuard在Android JNI中的注意事项与优化策略

4星 · 超过85%的资源 需积分: 13 88 下载量 159 浏览量 更新于2024-09-11 2 收藏 28KB DOCX 举报
"ProGuard是一个强大的Java类文件压缩、优化和混淆工具,主要用途包括减少应用程序大小、提高运行效率和防止反编译。在Android开发中,ProGuard用于优化APK,移除未使用的代码,混淆剩余代码以增加安全性。然而,当涉及到JNI(Java Native Interface)时,需要注意ProGuard可能会优化掉与JNI相关的类和方法,导致运行时错误。为了解决这个问题,开发者可以在`Android.mk`中添加`LOCAL_PROGUARD_FLAGS`,并创建一个`proguard.flags`文件来排除不希望被优化的类和方法。" 在Android开发中,ProGuard的使用是相当常见的,它能够帮助开发者减小应用的体积,提升性能,并通过混淆代码增加安全性。但是,当项目中包含JNI代码时,由于ProGuard的优化可能导致与JNI相关的类和方法丢失,从而引发找不到变量或方法的错误。为避免这种情况,开发者需要采取以下步骤: 1. 在项目的`Android.mk`文件中,添加一行`LOCAL_PROGUARD_FLAGS:=-include$(LOCAL_PATH)/proguard.flags`。这指示Android构建系统在应用ProGuard时考虑指定的`proguard.flags`文件。 2. 创建一个名为`proguard.flags`的文件,并在其中列出需要保护的类和方法。例如,如果有一个类`oms.miracle.mobiletv.broadcast.ServiceContext`与JNI相关,不想被ProGuard优化,可以在`proguard.flags`文件中写入`-keepclass oms.miracle.mobiletv.broadcast.ServiceContext { *; }`。这将确保该类及其所有成员不会被混淆和优化。 ProGuard的其他关键参数包括: - `-include{filename}`:从指定的文件中读取额外的配置参数。 - `-basedirectory{directoryname}`:设置基础目录,以便解析相对路径的档案名称。 - `-injars{class_path}`:指定需要处理的输入JAR、WAR、EAR或目录。 - `-outjars{class_path}`:指定处理后的输出JAR、WAR、EAR或目录的名称。 - `-libraryjars{classpath}`:指定处理过程中所需的库文件。 - `-dontskipnonpubliclibraryclasses`:不跳过非公共的库类。 - `-dontskipnonpubliclibraryclassmembers`:不跳过包可见的库类成员。 保留选项如`-keep`和`-keepclassmembers`则用于保护特定类和成员不被优化或混淆。这些选项可以精确地控制哪些代码应该保持原样,对于那些有特殊需求或与非Java代码交互的类尤其重要。 通过理解和正确使用ProGuard,开发者可以在保证应用性能和安全性的前提下,有效地管理代码的大小和复杂性。同时,针对JNI的特殊需求,适时调整ProGuard配置是必不可少的。
2013-12-15 上传