The following example demonstrates how to use ApkModule, TableBlock, and AndroidManifestBlock to programmatically construct a new APK, including defining resources (strings, drawables), setting manifest attributes, and adding a dummy DEX file.
import com.reandroid.apk.AndroidFrameworks;
import com.reandroid.apk.ApkModule;
import com.reandroid.apk.FrameworkApk;
import com.reandroid.archive.ByteInputSource;
import com.reandroid.arsc.chunk.PackageBlock;
import com.reandroid.arsc.chunk.TableBlock;
import com.reandroid.arsc.chunk.xml.AndroidManifestBlock;
import com.reandroid.arsc.chunk.xml.ResXmlAttribute;
import com.reandroid.arsc.chunk.xml.ResXmlElement;
import com.reandroid.arsc.coder.EncodeResult;
import com.reandroid.arsc.coder.ValueCoder;
import com.reandroid.arsc.value.Entry;
import java.io.File;
import java.io.IOException;
public class ARSCLibExample {
public static void createNewApk() throws IOException {
ApkModule apkModule = new ApkModule();
TableBlock tableBlock = new TableBlock();
AndroidManifestBlock manifest = new AndroidManifestBlock();
apkModule.setTableBlock(tableBlock);
apkModule.setManifest(manifest);
FrameworkApk framework = apkModule.initializeAndroidFramework(
AndroidFrameworks.getLatest().getVersionCode());
PackageBlock packageBlock = tableBlock.newPackage(0x7f, "com.example");
Entry appIcon = packageBlock.getOrCreate("", "drawable", "ic_launcher");
EncodeResult color = ValueCoder.encode("#006400");
appIcon.setValueAsRaw(color.valueType, color.value);
Entry appNameDefault = packageBlock.getOrCreate("", "string", "app_name");
appNameDefault.setValueAsString("My Application");
Entry appNameDe = packageBlock.getOrCreate("-de", "string", "app_name");
appNameDe.setValueAsString("Meine Bewerbung");
Entry appNameRu = packageBlock.getOrCreate("-ru-rRU", "string", "app_name");
appNameRu.setValueAsString("Мое заявление");
manifest.setPackageName("com.example");
manifest.setVersionCode(100);
manifest.setVersionName("1.0.0");
manifest.setIconResourceId(appIcon.getResourceId());
manifest.setCompileSdkVersion(framework.getVersionCode());
manifest.setCompileSdkVersionCodename(framework.getVersionName());
manifest.setPlatformBuildVersionCode(framework.getVersionCode());
manifest.setPlatformBuildVersionName(framework.getVersionName());
manifest.addUsesPermission("android.permission.INTERNET");
manifest.addUsesPermission("android.permission.READ_EXTERNAL_STORAGE");
//all appName entries created above have the same resource ids
manifest.setApplicationLabel(appNameDefault.getResourceId());
ResXmlElement mainActivity = manifest.getOrCreateMainActivity("android.app.Activity");
ResXmlAttribute labelAttribute = mainActivity
.getOrCreateAndroidAttribute(AndroidManifestBlock.NAME_label, AndroidManifestBlock.ID_label);
labelAttribute.setValueAsString("Hello World");
//Android os requires at least one dex file on base apk
ByteInputSource dummyDex = new ByteInputSource(new byte[0], "classes.dex");
apkModule.add(dummyDex);
File outFile = new File("test_out.apk");
apkModule.writeApk(outFile);
//Sign and install
}
}