修改或生成Android resources.arsc和已编译的清单

时间:2016-11-11 09:37:51

标签: java android resources apk

我想创建一个应用程序,允许用户根据我提供的一些静态代码生成APK。 Java代码不会改变,我只需修改AndroidManifest.xml和资源(修改resources.arsc或从头开始创建一个新代码,因为我有R.java可用)。

资源的数量和名称不会改变,只是字符串的内容和drawables内容被修改(意味着R.java不需要再次生成)

所以,假设我可以预编译所有内容并将其放入应用程序,有没有办法在设备上没有java编译器的情况下执行此操作?我可以把aapt和aidl二进制文件放到APK中。最后唱歌不是一个问题。

1 个答案:

答案 0 :(得分:1)

查看此应用:ThemeDIY,您还可以查看演示here

此应用程序允许用户选择各种资产(可绘制资源,ttf文件等)来自定义他们的主题,然后一起编译和组装以获取apk文件。

它使用kellinwood的ZipSigner库来签署apk,使用lingala Zip4j来创建zip文件。

我认为你想做的事情一样,选择/修改资源(保持资源名称相同)并生成apk。

因此,您的解决方案是将静态内容(即apk的内容,如其清单文件,jar文件,dex文件,res文件夹等)准备好放在文件夹中,创建一个副本作为临时文件夹,修改资源内容(而不是名称)根据用户需要,然后最终创建此临时文件夹的zip并签名以获得所需的.apk文件(不需要java编译器)。

希望它有所帮助!

<小时/> 更新

好的,在评论中讨论后,我想出了以下内容(详细说明了下面提到的整个过程):

我们需要从我们的应用程序创建一个apk(修改资源后)。因此,apk生成所需的东西:

  • classes.dex file
  • manifest.xml文件
  • res文件夹
  • android.jar文件(你可以在像/platforms/android-/android.jar这样的位置找到它)

所需工具:

  • AAPT
  • DX
  • 的jarsigner
  • zipalign

除了第一步之外,所有步骤都在app的运行时在android中完成。

<小时/> 首先我们需要的是classes.dex文件,可以生成:

dx --dex --output=classes.dex SomeJar1.jar SomeJar2.jar ..

这些jar是你编译的类(这一步可以在windows / linux中完成,因为它们是静态内容)。

现在,在运行时在android app cache目录的temp文件夹中为我们的apk生成所需的东西:

getApplictionContext().getCacheDir() + "/tmp/"

将classes.dex,AndroidManifest.xml和res /文件夹复制到上面的文件夹中。

(您可能希望最初在应用程序的原始文件夹中保留classes.dex,AndroidManifest.xml和res文件夹,然后使用FileInputStream类在运行时将其复制到上面的tmp文件夹中(就像我们在java中一样)。 / p>

现在,根据需要修改此缓存的tmp目录中的res文件夹。

修改后,它的包装初始apk的时间,我们需要从我们的Android应用程序运行以下命令:

aapt package -f -M AndroidManifest.xml -S res/ -I android.jar -F MyProject.apk.unaligned

所以,现在代码变成了android:

StringBuilder sb= new StringBuilder();
sb.append("aapt package -f -M");
sb.append(getApplicationContext().getCacheDir());
sb.append("/tmp/AndroidManifest.xml -S ");
sb.append(getApplicationContext().getCacheDir());
sb.append("/tmp/res -I ");
sb.append(getApplicationContext().getCacheDir());
sb.append("/tmp/android.jar -F ");
sb.append(getApplicationContext().getCacheDir());
sb.append("/apk/MyProject.apk.unaligned");
sb = Runtime.getRuntime().exec(sb.toString());

所以,现在我们在这个apk中有了resources.arsc和加密清单的初始apk。但我们需要添加classes.dex文件,因此我们运行以下命令:

aapt add -f MyProject.apk.unaligned classes.dex

从android我们写道:

StringBuilder sb = new StringBuilder();
sb.append("aapt add -f");
sb.append(getApplicationContext().getCacheDir());
sb.append("/apk/MyProject.apk.unaligned ");
sb.append(getApplicationContext().getCacheDir());
sb.append("/tmp/classes.dex");
sb = Runtime.getRuntime().exec(sb.toString());

签署包,使用命令:

jarsigner -storepass <keystore password> -keystore <keystore filename> MyProject.apk.unaligned <key name>

(可以转换为Android代码,与上面类似)

最后,使用命令对齐它:

zipalign 4 MyProject.apk.unaligned MyProject.apk

(同样,这可以转换为Android代码,与上面相同)

所以,现在我们已经准备好了android apk,无论是安装它还是将其复制到sd卡中,你可能会喜欢。

上面的所有代码都经过测试,工作正常!

希望现在这有帮助!