当前APK中META-INF文件夹的作用及MANIFEST.MF去向咨询
Android Studio Iguana签名APK中META-INF结构及MANIFEST.MF去向疑问
我知晓该问题已有诸多解答,但均不符合当前实际情况:使用Android Studio Iguana创建空视图Activity项目,生成签名APK并解压后,META-INF文件夹结构如下:
└─$ tree META-INF/ META-INF/ ├── androidx.activity_activity.version ├── androidx.annotation_annotation-experimental.version ├── androidx.appcompat_appcompat-resources.version ├── androidx.appcompat_appcompat.version ├── androidx.arch.core_core-runtime.version ├── androidx.cardview_cardview.version ├── androidx.coordinatorlayout_coordinatorlayout.version ├── androidx.core_core-ktx.version ├── androidx.core_core.version ├── androidx.cursoradapter_cursoradapter.version ├── androidx.customview_customview.version ├── androidx.documentfile_documentfile.version ├── androidx.drawerlayout_drawerlayout.version ├── androidx.dynamicanimation_dynamicanimation.version ├── androidx.emoji2_emoji2.version ├── androidx.emoji2_emoji2-views-helper.version ├── androidx.fragment_fragment.version ├── androidx.interpolator_interpolator.version ├── androidx.legacy_legacy-support-core-utils.version ├── androidx.lifecycle_lifecycle-livedata-core.version ├── androidx.lifecycle_lifecycle-livedata.version ├── androidx.lifecycle_lifecycle-process.version ├── androidx.lifecycle_lifecycle-runtime.version ├── androidx.lifecycle_lifecycle-viewmodel-savedstate.version ├── androidx.lifecycle_lifecycle-viewmodel.version ├── androidx.loader_loader.version ├── androidx.localbroadcastmanager_localbroadcastmanager.version ├── androidx.print_print.version ├── androidx.profileinstaller_profileinstaller.version ├── androidx.recyclerview_recyclerview.version ├── androidx.savedstate_savedstate.version ├── androidx.startup_startup-runtime.version ├── androidx.tracing_tracing.version ├── androidx.transition_transition.version ├── androidx.vectordrawable_vectordrawable-animated.version ├── androidx.vectordrawable_vectordrawable.version ├── androidx.versionedparcelable_versionedparcelable.version ├── androidx.viewpager2_viewpager2.version ├── androidx.viewpager_viewpager.version ├── com │ └── android │ └── build │ └── gradle │ └── app-metadata.properties ├── com.google.android.material_material.version ├── kotlinx_coroutines_android.version ├── kotlinx_coroutines_core.version ├── services │ ├── kotlinx.coroutines.CoroutineExceptionHandler │ └── kotlinx.coroutines.internal.MainDispatcherFactory └── version-control-info.textproto 6 directories, 46 files
奇怪的是,其中并未包含过往资料中提到的MANIFEST.MF、CERT.RSA或CERT.SF文件。以下是对应问题的解答:
当前META-INF文件夹的作用
- 版本信息文件(*.version):逐一记录项目依赖的AndroidX、Material、Kotlin协程等库的版本号,用于运行时校验依赖版本的一致性,避免因版本冲突引发运行异常。
- com/android/build/gradle/app-metadata.properties:存储APK构建的元数据,包含构建工具版本、模块标识等信息,辅助构建系统和运行环境识别APK的构建背景。
- services目录:存放Java Service Loader的配置文件,比如Kotlin协程的异常处理器、主线程调度工厂配置,用于动态加载对应的服务实现,是组件化库的服务发现机制。
- version-control-info.textproto:记录版本控制工具(如Git)的提交信息,方便开发者溯源APK对应的代码版本,辅助调试和问题定位。
MANIFEST.MF及签名文件的去向
从Android Studio Iguana对应的AGP(Android Gradle Plugin)8.0版本开始,签名相关文件(MANIFEST.MF、CERT.SF、CERT.RSA)不再存放在META-INF根目录,而是转移到了**APK的签名块(Signature Block)**中:
- 签名块是APK文件结构中的独立区域,专门存储签名元数据和证书,相比传统存储方式,能提升系统的签名验证效率,同时减少解压后文件的杂乱程度。
- 若需查看MANIFEST.MF内容,可通过
apksigner工具提取:执行命令apksigner verify --print-certs --verbose your-app.apk;也可以直接用unzip -p your-app.apk META-INF/MANIFEST.MF命令导出内容(虽然解压后看不到,但这些文件在APK内部仍以META-INF路径存在,只是解压工具默认不展示签名块中的内容)。
内容的提问来源于stack exchange,提问作者Bill Elim
相关产品推荐
相关产品推荐

