在Android应用程序中打包文件(但不在res或资产中)

时间:2012-10-23 16:25:28

标签: android ssl https io bouncycastle

好的,所以我被扔进了一个战壕,想以最干净最可敬的方式离开。

目前我有2个Android项目,并且我需要在一个项目中打包文件并让其他人成功阅读。这可能令人困惑,所以让我解释一下。

我有2个Android项目。一个名为Engine的android库项目和应用程序本身。

引擎处理网络通信和许多其他后台任务,这些任务无头地进行操作并且不与UI交互。引擎可以访问主应用程序的上下文,但没有别的。在我开发这个引擎的过程中,我遇到了一些有趣的东西。 Https(不要逃避)以及它在Android应用程序中出现的问题。有很多关于Android应用程序如何可怕地不安全并且非常容易受到MITM攻击的博客文章。这是我在这个引擎中不能忽视的一个问题,因为它是一个非常真实的威胁。

有关此内容的更多阅读,我强烈推荐Nikolay Elenkov的blog,因为他解释了在Android上做出安全保护的好方法!

我离题了,因为这个问题已经解决了。对我来说,解决方案是使用存储在.bks文件中的自定义密钥库。您再次无需担心如何创建它或如何创建它。真正的麻烦是,如何将这个文件打包到JAR中时读取它。

对于最终版本,Engine将打包为jar并包含在应用程序中。 将引擎打包到jar中的警告是res文件夹中的任何内容都不会被编译而无法读取。根据定义,无论项目是jar还是库项目,库项目中的任何资产都不会响应。

所以回顾一下,我们有2个项目。一个打包的Jar安卓库,包含我们的BKS文件和一个需要读取它的应用程序。

如果BKS文件位于assets /或res /文件夹中,则无法恢复。

有没有人知道如何访问此文件?

潜在的解决方案:

  • 将文件存储在lib目录中并阅读?

  • 将BKS存储在远程服务器上并在启动时加载它?

  • 找到另一种处理ssl证书的方法(不,我不会只接受任何和所有证书!)

  • 这是一个超级秘密的方式来读取另一个文件夹中的android库项目中的文件,这是你怎么做的......

2 个答案:

答案 0 :(得分:0)

  

所以回顾一下,我们有2个应用程序

不,你没有。

  

One Packaged Jar Android库,包含我们的BKS文件和一个需要阅读的应用程序。

这是一个应用程序,而不是两个。根据您的描述,您有两个项目,但有一个应用程序

  

有没有人知道如何访问此文件?

将文件放在应用程序的项目中,无论是assets/还是res/raw/都取决于您。从源代码控制的角度来看,如果您希望文件驻留在库项目的repo中,请在应用程序项目中使用符号链接或硬链接,或使用提交挂钩或其他东西在应用程序项目的位置进行复制。

或者,自己将文件打包到库JAR中use getResourceAtStream() to read it in。我没试过这个,但可能是有效的。

答案 1 :(得分:0)

我能想到的一种方法是使用内容提供商。在您拥有BKS文件的引擎中实现内容提供程序。不要为实现insert(),delete()等而烦恼。只需将这些函数与空体一起使用即可。使用托管游标实现查询功能,并使用BKS文件的内容填充游标。从您的应用程序查询此内容提供商。

我做了类似的事情来交换两个应用程序之间的偏好。

SharedPreferences prefs = null;
   String[] columns = new String[] { "mycolumn"};
   Context otherAppsContext = null;
   try {
       otherAppsContext = mContext.createPackageContext("com.blah.blah", Context.CONTEXT_IGNORE_SECURITY);
   } catch (NameNotFoundException e) {
   }
   prefs = otherAppsContext.getSharedPreferences("com.blah.blah_preferences_public",Context.MODE_WORLD_READABLE|Context.MODE_MULTI_PROCESS);
   isConfigured = prefs.getBoolean("mycolumn", false);
   Object[]values = new Object[] {isConfigured==true?1:0};
   Log.d(TAG,"isConfigured " + isConfigured);
   MatrixCursor c = new MatrixCursor(columns);
   c.addRow(values);
   return c;