如何在Android Studio上准备封闭源SDK模块?

android开发人员

背景

我正在开发一个非常流行的应用程序,以至于它的一部分应该成为SDK(可供开发人员使用),并且该应用程序将拆分为2个应用程序(均使用SDK)。

据我所知,创建SDK模块有多种方法(在Eclipse上以前称为“项目”):

  1. 完全开源(Android库)-所有源和资源都是开源的,可以修改。例如Facebook的SDK和大量的Github仓库。

  2. 单个Jar文件,可以将其关闭。

问题

遗憾的是,我无法将SDK开源,因此应该相对保护它而不是窥探眼睛(混淆等)。

这里的问题是,SDK需要使用自己的一些资源(可绘制,字符串等),到目前为止(因为我在创建SDK方面没有太多经验),我发现了两种方法处理SDK的资源:

  1. 使用反射和/或“ context.getResources()。getIdentifier”。这很混乱,因为我失去了代码的整个“ R”用法。另外,正如我在此处所写,它也存在“可样式化”的问题这也使得很难找到未使用的资源。

  2. 甚至更糟的方法:将资源放在资产文件夹中,以古怪的方式将文件放在jar文件中,...

请注意,SDK的一部分包括自定义视图(例如,从TextView扩展的类),因此,即使我确实将SDk分为2个模块(资源和Java文件),也都可能存在依赖性问题(每个都使用另一个)。

问题

是否可以通过某种方式解决此问题?

SDK的代码部分是否有可能保持开源状态,照常访问“ R”文件,从而使我和任何使用SDK的人都容易实现?

然后,如何通过Android Studio将jar文件混淆后生成该jar文件?并且可以准备将​​其通过gradle使用吗?

我可以将SDK的Android库制作成混淆的jar文件,而不用担心“ R”文件吗?我之所以这样问,是因为这样我可以同时享受两个世界:对于我们的应用程序,它将保持开源,而对于第三方应用程序,则将成为封闭源。


编辑:看到这应该很容易,我自己尝试过。我创建了一个全新的POC项目,该项目具有一个名为“ sdkmodule”的Android库模块,并将其添加到该类中:

public class SdkClass
      {
      public String doIt(Context context)
        {
        return context.getResources().getString(R.string.app_name);
        }
      }

然后,我制作了应用程序的模块以使用此模块,并在其中编写了以下代码:

  @Override
  protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SdkClass sdkClass=new SdkClass();
    Log.d("AppLog","string from SDK:"+sdkClass.doIt(this));
    Log.d("AppLog","string with same ID name from app:"+getResources().getString(R.string.app_name));
    }

我期望的是,第一个日志将打印SDK模块中的字符串,第二个日志显示当前项目的字符串,但是我得到了一个例外:

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/example/user/sdkmodule/R$string;

再次尝试,我得到了与应用本身相同的字符串(使用SDK模块的字符串)。并且,在另一轮运行中,SDK根据需要生成了所需的字符串。

怎么会这样?我该怎么办 ?

此外,我尝试在SDK本身中进行第二个活动,并在那里创建了一个资源,该资源与应用程序本身具有相同的资源名称(用于其布局中的textView),但具有不同的资源名称价值,但是当我完成这项活动时,我已经看到了该应用程序使用的内容。

这是压缩的项目(忽略文件夹的名称,我也想尝试口味):

https://drive.google.com/file/d/0B-PZZGk2vPohX25WUDNKTmotUTg/view?usp=sharing
约书亚·卡莫迪(Joshua Carmody)

Android的档案(AAR)格式,你想要做什么。它就像一个特定于Android的JAR文件,包含已编译的代码,但包含其自己的资源和清单。您还可以将混淆处理作为构建过程的一部分。默认情况下,当前版本的Android Studio(1.2)和Gradle会自动为您在项目中创建的所有库模块生成.AAR文件。

您可以将应用程序模块更改为库项目,只需将其更改apply plugin: 'com.android.application'apply plugin: 'com.android.library'模块的Gradle文件即可发布AAR文件。MODULENAME/build/outputs/aar每次构建后,.AAR文件都将放置在您的文件夹中。一些更多的信息可以在这里找到

编辑1,问题更新后:

最终的APK编译后,AAR中的资源将与app模块合并。应用程序资源将覆盖库的资源。这可能是设计使然,允许使用第三方库的人们在创建应用时自定义其资源,而无需重建库。我认为解决资源冲突问题的最简单方法就是将sdkmodule资源命名为更独特的名称。为什么不做字符串键之类的R.string.com_example_sdk_name呢?

不,默认情况下不会混淆AAR库,但是您可以在Gradle构建文件中为AAR库设置ProGuard来解决这一问题。也可以使用其他工具。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Android Studio中创建SDK

来自分类常见问题

如何在Ubuntu上安装Android SDK?

来自分类Dev

如何在Ubuntu上安装Android Studio?

来自分类Dev

如何在Android Studio上导入slidemenu?

来自分类Dev

如何在Android Studio上添加VitamioDependecny

来自分类Dev

如何在Ubuntu上加载Android Studio?

来自分类Dev

如何在 Android Studio 上设置 webdav?

来自分类Dev

如何在Android Studio中设置早期的Android SDK版本

来自分类Dev

如何在Android Studio的“ android / sdk”中找到“文档”?

来自分类Dev

如何在Android Studio中“选择Android SDK”?

来自分类Dev

如何在AMD Ryzen(Android Studio)上使用Android Emulator?

来自分类Dev

如何在Android Studio中删除导入的模块

来自分类Dev

如何在Android中更改ImageView源

来自分类Dev

在Studio无法找到时,如何在Mac上找到Android SDK?

来自分类Dev

如何在Windows上离线安装Android Studio SDK软件包?

来自分类Dev

如何在后台更新Android Studio中的SDK

来自分类Dev

如何在Worklight Studio中设置Android SDK目标

来自分类Dev

如何在Android Studio中导入Facebook SDK?

来自分类Dev

如何在Android Studio中导入Dropbox Chooser SDK?

来自分类Dev

如何在Worklight Studio中设置Android SDK目标

来自分类Dev

如何在 Android Studio 中配置 Superpowered SDK

来自分类Dev

如何在模块之间共享Android lintOptions

来自分类Dev

如何在Android中构建模块

来自分类Dev

如何在MapBox Android SDK上使用FitBounds?

来自分类Dev

如何在Windows 8上安装Android SDK

来自分类Dev

我如何在 Android Studio 上的 RecyclerView 上 setOnClickListener

来自分类Dev

如何在Android Studio中实现搜索?

来自分类Dev

如何在Android Studio中使用断言

来自分类Dev

如何在Android Studio中解决ClassNotFoundException

Related 相关文章

  1. 1

    如何在Android Studio中创建SDK

  2. 2

    如何在Ubuntu上安装Android SDK?

  3. 3

    如何在Ubuntu上安装Android Studio?

  4. 4

    如何在Android Studio上导入slidemenu?

  5. 5

    如何在Android Studio上添加VitamioDependecny

  6. 6

    如何在Ubuntu上加载Android Studio?

  7. 7

    如何在 Android Studio 上设置 webdav?

  8. 8

    如何在Android Studio中设置早期的Android SDK版本

  9. 9

    如何在Android Studio的“ android / sdk”中找到“文档”?

  10. 10

    如何在Android Studio中“选择Android SDK”?

  11. 11

    如何在AMD Ryzen(Android Studio)上使用Android Emulator?

  12. 12

    如何在Android Studio中删除导入的模块

  13. 13

    如何在Android中更改ImageView源

  14. 14

    在Studio无法找到时,如何在Mac上找到Android SDK?

  15. 15

    如何在Windows上离线安装Android Studio SDK软件包?

  16. 16

    如何在后台更新Android Studio中的SDK

  17. 17

    如何在Worklight Studio中设置Android SDK目标

  18. 18

    如何在Android Studio中导入Facebook SDK?

  19. 19

    如何在Android Studio中导入Dropbox Chooser SDK?

  20. 20

    如何在Worklight Studio中设置Android SDK目标

  21. 21

    如何在 Android Studio 中配置 Superpowered SDK

  22. 22

    如何在模块之间共享Android lintOptions

  23. 23

    如何在Android中构建模块

  24. 24

    如何在MapBox Android SDK上使用FitBounds?

  25. 25

    如何在Windows 8上安装Android SDK

  26. 26

    我如何在 Android Studio 上的 RecyclerView 上 setOnClickListener

  27. 27

    如何在Android Studio中实现搜索?

  28. 28

    如何在Android Studio中使用断言

  29. 29

    如何在Android Studio中解决ClassNotFoundException

热门标签

归档