TODO List
待实现的功能
Small
###1 终极分离与去除警告
插件的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)
}
###2 加速生成AndroidManifest.xml
资源类插件(如web.about)打包时,我们需要对其构造一个二进制的AndroidManifest.xml
文件,从而使得
packageManager.getPackageArchiveInfo
可以取得PackageInfo
,
进而得到插件的versionCode
[1]与signatures
[2]等信息。
其中[1]用于插件升级,[2]用于插件签名校验。
现在的处理方法:
- i) 构造文本文件
AndroidManifest.xml
- ii) 使用
aapt -M
打包,生成一个压缩包 - iii) 解压该压缩包,得到二进制
AndroidManifest.xml
要做的就是一步到位,直接生成二进制文件。
要修改的代码: buildSrc/src/main/groovy/net/wequick/gradle/aapt/AXmlEditor.groovy
def createAndroidManefist(Map options) {
// Do stuff.
}
buildSrc/src/main/groovy/net/wequick/gradle/aapt/Aapt.groovy
void manifest(Map options) {
// TODO: generate hex file without aapt
File file = new File(mAssetDir, 'AndroidManifest.xml')
AXmlEditor editor = new AXmlEditor(file)
editor.createAndroidManifest(options)
}