0

好的,所以我被扔进了战壕,想以最干净最体面的方式离开。

目前,我有 2 个 Android 项目,并且需要将文件打包到一个项目中并让它被另一个项目成功读取。这可能会令人困惑,所以让我解释一下。

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

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

有关此内容的更多信息,我强烈推荐 Nikolay Elenkov 的博客,因为他解释了在 Android 上进行安全保护的好方法!

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

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

回顾一下,我们有 2 个项目。一个 Packaged Jar Android 库,其中包含我们的 BKS 文件和一个需要读取它的应用程序。

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

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

潜在的解决方案:

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

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

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

  • 有一种超级秘密的方法可以读取另一个文件夹中的android库项目中的文件,这就是你的做法......

4

2 回答 2

0

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

不,你没有。

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

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

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

将文件放入应用程序的项目中,这assets/取决于res/raw/您。如果从源代码控制的角度来看,您希望文件驻留在库项目的 repo 中,请在应用程序项目中使用符号链接或硬链接,或使用提交挂钩,或在应用程序项目的位置制作副本。

或者,自己将文件打包到库 JAR 中,使用getResourceAtStream(). 我没有尝试过,但大概它有效。

于 2012-10-23T16:32:49.217 回答
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;
于 2012-10-23T16:53:04.667 回答