我正在开发一个非常流行的应用程序,以至于它的一部分应该成为SDK(可供开发人员使用),并且该应用程序将拆分为2个应用程序(均使用SDK)。
据我所知,创建SDK模块有多种方法(在Eclipse上以前称为“项目”):
完全开源(Android库)-所有源和资源都是开源的,可以修改。例如Facebook的SDK和大量的Github仓库。
单个Jar文件,可以将其关闭。
遗憾的是,我无法将SDK开源,因此应该相对保护它而不是窥探眼睛(混淆等)。
这里的问题是,SDK需要使用自己的一些资源(可绘制,字符串等),到目前为止(因为我在创建SDK方面没有太多经验),我发现了两种方法处理SDK的资源:
使用反射和/或“ context.getResources()。getIdentifier”。这很混乱,因为我失去了代码的整个“ R”用法。另外,正如我在此处所写,它也存在“可样式化”的问题。这也使得很难找到未使用的资源。
甚至更糟的方法:将资源放在资产文件夹中,以古怪的方式将文件放在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
在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] 删除。
我来说两句