插件的string/app_name、mipmap/ic_launcher在resources.arsc中被分离以减少插件包大小。
但是插件manifest的<application>标签仍包含对二者的引用,其资源ID在编译阶段被替换成了宿主的。
在对插件合并资源前,二者被访问了(何时尚未知),导致警告:
W/ResourceType: No known package when getting value for resource number 0x7f060014
W/ResourceType: No known package when getting value for resource number 0x7f030000
解决方法:过滤插件AndroidManifest.xml中的非保留资源。实现后插件将会更小,并再无缩减空间。
解决思路:修改AndroidManifest.xml二进制文件
要修改的代码(请先更新代码,以下内容已预置):
buildSrc/src/main/groovy/net/wequick/gradle/aapt/AxmlEditor.groovy
def slice(int pp, Map idMaps, List retainedTypes) {
// TODO: slice resources exclude `retainedTypes'
println retainedTypes
}
buildSrc/src/main/groovy/net/wequick/gradle/aapt/Aapt.groovy
void filterPackage(List retainedTypes, int pp, Map idMaps) {
File arscFile = new File(mAssetDir, 'resources.arsc')
if (retainedTypes.size() == 0) {
// Remove everything
mJavaFile.write('')
if (mSymbolFile != null) mSymbolFile.write('')
arscFile.delete()
return
}
def arscEditor = new ArscEditor(arscFile)
// Filter R.java
filterRjava(mJavaFile, retainedTypes, null)
// Filter R.txt
if (mSymbolFile != null) filterRtext(mSymbolFile, retainedTypes)
// Filter resources.arsc
arscEditor.slice(pp, idMaps, retainedTypes)
// Filter AndroidManifest.xml
File manifest = new File(mAssetDir, 'AndroidManifest.xml')
AXmlEditor xmlEditor = new AXmlEditor(manifest)
xmlEditor.slice(pp, idMaps, retainedTypes)
// Reset xml package id
File resDir = new File(mAssetDir, 'res')
resetAllXmlPackageId(resDir, pp, idMaps)
}
插件的string/app_name、mipmap/ic_launcher在resources.arsc中被分离以减少插件包大小。
但是插件manifest的
<application>标签仍包含对二者的引用,其资源ID在编译阶段被替换成了宿主的。在对插件合并资源前,二者被访问了(何时尚未知),导致警告:
解决方法:过滤插件
AndroidManifest.xml中的非保留资源。实现后插件将会更小,并再无缩减空间。解决思路:修改
AndroidManifest.xml二进制文件要修改的代码(请先更新代码,以下内容已预置):
buildSrc/src/main/groovy/net/wequick/gradle/aapt/AxmlEditor.groovy
buildSrc/src/main/groovy/net/wequick/gradle/aapt/Aapt.groovy