Eclipse迁Android Studio后应用更新快捷方式消失,Manifest中Activity名被修改
这问题我之前帮朋友踩过同款坑,核心就是Android Studio的AGP(Android Gradle Plugin)打包逻辑和Eclipse的ANT不一样——AGP默认会把Manifest里的短类名(比如.StartUpActivity)展开成全限定名(be.abc.android.StartUpActivity),系统识别到启动组件的名称变了,就会把旧快捷方式判定为无效并删除。下面给你几个实测有效的解决办法:
方法1:强制AGP保留短类名
直接在模块级的build.gradle(或build.gradle.kts)里添加配置,告诉AGP不要自动展开短类名:
android { // 其他已有配置(比如compileSdk、defaultConfig等) manifestOptions { useFullQualifiedNames = false } }
同步Gradle后重新打包,生成的APK里Manifest的启动Activity就会保持原来的短类名,和Eclipse时代一致,旧快捷方式就能正常识别了。
方法2:添加Activity别名兼容旧组件名
如果方法1在你的AGP版本里不生效(比如某些较新的AGP版本可能调整了这个配置逻辑),可以用Activity别名的方式做兼容:
在Manifest里保留全限定名的启动Activity,同时添加一个用旧短类名的别名,让系统能匹配到旧快捷方式:
<!-- 主启动Activity,使用全限定名 --> <activity android:name="be.abc.android.StartUpActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 别名Activity,对应旧的短类名,指向主Activity --> <activity-alias android:name=".StartUpActivity" android:targetActivity="be.abc.android.StartUpActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias>
这样不管是新安装的用户(用全限定名启动)还是更新的老用户(旧快捷方式指向短类名),都能正常打开App,不会出现快捷方式消失的问题。
方法3:检查多风味的Manifest合并配置
因为你用到了多产品风味,要确保每个风味的Manifest里启动Activity的类名都是统一的短名,或者没有覆盖主Manifest的配置。如果某个风味的Manifest里写了全限定名,合并后也会导致最终Manifest的类名变化。可以通过AS的Merged Manifest功能(在Manifest编辑器底部)查看最终合并后的结果,确认启动Activity的类名是否符合预期。
问题根源补充
Eclipse的ANT打包是直接读取你写的Manifest内容,短类名会被系统自动解析成全限定名,但Manifest文件里保留的是短名;而Android Studio的AGP在打包时,会主动把所有短类名替换成全限定名写入最终的APK Manifest里。系统的快捷方式是绑定组件的完整名称的,所以当名称从.StartUpActivity变成be.abc.android.StartUpActivity时,系统就认为这是一个新的组件,旧快捷方式自然就失效被删除了。
内容的提问来源于stack exchange,提问作者Knarf

