Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

终极分离与去除警告 #11

Closed
galenlin opened this issue Jan 18, 2016 · 0 comments
Closed

终极分离与去除警告 #11

galenlin opened this issue Jan 18, 2016 · 0 comments

Comments

@galenlin
Copy link
Member

插件的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)
  }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant