Xamarin.Android 使用 ApkTool 编辑 apk 包名称导致崩溃
Posted
技术标签:
【中文标题】Xamarin.Android 使用 ApkTool 编辑 apk 包名称导致崩溃【英文标题】:Xamarin.Android edit apk package name with ApkTool causes crash 【发布时间】:2015-06-08 01:25:47 【问题描述】:我需要能够更改现有 .apk 的包名称,以便同时运行我在 Visual Studio 中使用 Xamarin 创建的 android 应用程序的实例。但是,当我需要更改此包名称时,我将无法可靠地访问具有 Xamarin 许可证的计算机,因此我不能简单地编辑清单预构建。我尝试使用 ApkTool 解压缩 apk,编辑清单,然后重新打包并重新签署 apk。但是,虽然我能够将这个新的 apk 与原始 apk 并排安装在设备上,但新的应用程序实例无法启动。我收到以下错误:
"monodroid" "在 '(null)' 或 '/storage/emulated/0/Android/data/com.newpackagename/files/.override' 中找不到程序集。假设这是快速部署的一部分。正在退出..."
我认为这意味着在构建后以某种方式更改包名称已经丢失了一些到程序集的链接。但是,即使在搜索了整个解压缩的 apk(文件夹和文件内)之后,我也找不到对原始包名称的剩余引用。所以我想弄清楚如何重新获得这些程序集以允许我的应用程序运行。我知道这是非常不寻常的,它甚至可能不是正确的方法,但我需要能够在不访问 Xamarin 的情况下更改我的包名称。这似乎是最有希望的解决方案。
【问题讨论】:
我认为 Mono DLL 需要保存在 APK 中的 STORED 下,但是当前 Apktool (2.0 RC4) 公开版本中的一个错误会压缩所有资源。这已在此处修复 - github.com/iBotPeaches/Apktool/commit/… 这是很好的信息。那么你会建议克隆当前的 github 项目并从源代码构建,还是尝试以前的 RC(例如 RC3)? 该错误是在 2.0 开发开始时引入的,它引入了复制未知文件的能力。这在 1.5.2 中不存在,只需克隆项目并构建当前迭代即可。那应该可以。 @ConnorTumbleson 你能把这些 cmets 作为答案吗?它实际上解决了问题,作为答案,它会更真实:) @Eugene 可以,将 cmets 写入答案。 【参考方案1】:Xamarin 依赖于在最终构建的 apk 中存储 aapt
(Android 资产打包工具)未知的文件。这些文件通常插入到具有STORED
压缩类型的apk 根目录内的assemblies
文件夹中,以便Xamarin 无需解压缩即可访问这些文件。
Apktool 用于忽略 aapt
会忽略的所有文件。 IE。如果文件不是该数组的文件夹/文件
private final static String[] APK_STANDARD_ALL_FILENAMES = new String[]
"classes.dex", "AndroidManifest.xml", "resources.arsc", "res", "lib", "libs", "assets", "META-INF" ;
比 Apktool 会忽略它。但是,在2.0.x
的开发过程中尝试包含这些未知文件。
Java 7 NIO 库的一个错误导致所有“未知”文件都存储为DEFLATED
。这将DLLs
的存储格式从STORED
更改为DEFLATED
,因此出现此错误。
此错误已于 3 月 25 日修复 - https://github.com/iBotPeaches/Apktool/commit/628286c022e3a872d6ab6bfb3431579f98743c25
截至 2015 年 4 月 8 日 - 没有包含此修复程序的官方版本。在2.0.0 Gold
发布之前,您可以自己build Apktool。
【讨论】:
以上是关于Xamarin.Android 使用 ApkTool 编辑 apk 包名称导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 C# 从 Xamarin.iOs 和 Xamarin.Android 连接到 MySql
有没有办法使用 Xamarin.Forms PCL 项目中的 Devexpress.Xamarin.Android.Charts
抽屉布局在 Xamarin.Android.Support.Core.UI 和 Xamarin.Android.Support.V4 中都存在
如何使用 DependencyService 和接口委托将 xamarin.android 特定功能的方法传递给 xamarin.forms?