TODO List

待实现的功能

Small

###1 终极分离与去除警告

插件的string/app_namemipmap/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]用于插件签名校验。

现在的处理方法:

  1. i) 构造文本文件AndroidManifest.xml
  2. ii) 使用aapt -M打包,生成一个压缩包
  3. 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)
  }
“曾梦想仗剑走天涯 / 看一看世界的繁华 / 年少的心总有些轻狂 / 如今你四海为家”