From 2eb8b20d40c1e5170cd1682bb070ca94e3e22e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ryszard=20Wi=C5=9Bniewski?= Date: Wed, 2 Jun 2010 11:39:35 +0200 Subject: [PATCH] Use framework files from hard disk when building apk. --- src/brut/androlib/Androlib.java | 38 +++++++++++++++----- src/brut/androlib/ApkDecoder.java | 27 ++++++++++++-- src/brut/androlib/res/AndrolibResources.java | 2 +- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/src/brut/androlib/Androlib.java b/src/brut/androlib/Androlib.java index 60f00052..c6a90ad1 100644 --- a/src/brut/androlib/Androlib.java +++ b/src/brut/androlib/Androlib.java @@ -158,7 +158,8 @@ public class Androlib { new File(appDir, APK_DIRNAME).mkdirs(); buildSources(appDir, forceBuildAll, debug); - buildResources(appDir, forceBuildAll, framework); + buildResources(appDir, forceBuildAll, framework, + (Map) meta.get("usesFramework")); buildLib(appDir, forceBuildAll); buildApk(appDir, framework); } @@ -232,9 +233,11 @@ public class Androlib { } public void buildResources(ExtFile appDir, boolean forceBuildAll, - boolean framework) throws AndrolibException { + boolean framework, Map usesFramework) + throws AndrolibException { if (! buildResourcesRaw(appDir, forceBuildAll) - && ! buildResourcesFull(appDir, forceBuildAll, framework)) { + && ! buildResourcesFull(appDir, forceBuildAll, framework, + usesFramework)) { LOGGER.warning("Could not find resources"); } } @@ -263,7 +266,8 @@ public class Androlib { } public boolean buildResourcesFull(File appDir, boolean forceBuildAll, - boolean framework) throws AndrolibException { + boolean framework, Map usesFramework) + throws AndrolibException { try { if (! new File(appDir, "res").exists()) { return false; @@ -288,10 +292,7 @@ public class Androlib { apkFile, new File(appDir, "AndroidManifest.xml"), new File(appDir, "res"), - ninePatch, null, - new File[]{ - mAndRes.getAndroidResourcesFile(), - mAndRes.getHtcResourcesFile()}, + ninePatch, null, parseUsesFramework(usesFramework), false, framework ); @@ -379,6 +380,27 @@ public class Androlib { return VERSION; } + private File[] parseUsesFramework(Map usesFramework) + throws AndrolibException { + if (usesFramework == null) { + return null; + } + + List ids = (List) usesFramework.get("ids"); + if (ids == null || ids.isEmpty()) { + return null; + } + + String tag = (String) usesFramework.get("tag"); + File[] files = new File[ids.size()]; + int i = 0; + for (int id : ids) { + files[i++] = mAndRes.getFrameworkApk(id, tag); + } + + return files; + } + private boolean isModified(File working, File stored) { if (! stored.exists()) { return true; diff --git a/src/brut/androlib/ApkDecoder.java b/src/brut/androlib/ApkDecoder.java index 280a5c86..4b7a8c9e 100644 --- a/src/brut/androlib/ApkDecoder.java +++ b/src/brut/androlib/ApkDecoder.java @@ -17,6 +17,7 @@ package brut.androlib; import brut.androlib.err.OutDirExistsException; +import brut.androlib.res.data.ResPackage; import brut.androlib.res.data.ResTable; import brut.androlib.res.util.ExtFile; import brut.common.BrutException; @@ -24,8 +25,7 @@ import brut.directory.Directory; import brut.directory.DirectoryException; import brut.util.OS; import java.io.File; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; /** * @author Ryszard Wiśniewski @@ -165,9 +165,32 @@ public class ApkDecoder { meta.put("version", Androlib.getVersion()); meta.put("isFrameworkApk", Boolean.valueOf(mAndrolib.isFrameworkApk(getResTable()))); + putUsesFramework(meta); mAndrolib.writeMetaFile(mOutDir, meta); } + private void putUsesFramework(Map meta) { + Set pkgs = mResTable.listFramePackages(); + if (pkgs.isEmpty()) { + return; + } + + Integer[] ids = new Integer[pkgs.size()]; + int i = 0; + for (ResPackage pkg : pkgs) { + ids[i++] = pkg.getId(); + } + + Map uses = new LinkedHashMap(); + uses.put("ids", ids); + + if (mFrameTag != null) { + uses.put("tag", mFrameTag); + } + + meta.put("usesFramework", uses); + } + private final Androlib mAndrolib; private ExtFile mApkFile; diff --git a/src/brut/androlib/res/AndrolibResources.java b/src/brut/androlib/res/AndrolibResources.java index d4f01736..dc126275 100644 --- a/src/brut/androlib/res/AndrolibResources.java +++ b/src/brut/androlib/res/AndrolibResources.java @@ -301,7 +301,7 @@ final public class AndrolibResources { } } - private File getFrameworkApk(int id, String frameTag) + public File getFrameworkApk(int id, String frameTag) throws AndrolibException { File dir = getFrameworkDir(); File apk;