Androd插件化开发之Atlas资源打包工具补丁aapt的编译

我们先来看看Android Studio自动生成的R文件里的内容,你会发现,R文件里有很多内部类,而内部类里有很多int类型的值,他们都是以0x7f开头。

我们在编译一个Android应用程序的资源的时候,至少会涉及到两个包,其中一个是被引用的系统资源包,另外一个就是当前正在编译的应用程序资源包。每一个包都可以定义自己的资源,同时它也可以引用其它包的资源。那么,一个包是通过什么方式来引用其它包的资源的呢?这就是我们熟悉的资源ID了。资源ID是一个4字节的无符号整数,其中,最高字节表示Package ID次高字节表示Type ID,最低两字节表示Entry ID

Package ID相当于是一个命名空间,限定资源的来源。Android系统当前定义了两个资源命令空间,其中一个系统资源命令空间,它的Package ID等于0x01,另外一个是应用程序资源命令空间,它的Package ID等于0x7f。所有位于[0x01, 0x7f]之间的Package ID都是合法的,而在这个范围之外的都是非法的Package ID。前面提到的系统资源包package-export.apk的Package ID就等于0x01,而我们在应用程序中定义的资源的Package ID的值都等于0x7f,这一点可以通过生成的R.java文件来验证。

Type ID是指资源的类型ID。资源的类型有animator、anim、color、drawable、layout、menu、raw、string和xml等等若干种,每一种都会被赋予一个ID。

Entry ID是指每一个资源在其所属的资源类型中所出现的次序。注意,不同类型的资源的Entry ID有可能是相同的,但是由于它们的类型不同,我们仍然可以通过其资源ID来区别开来。

更多详情可以先了解一下下面的两篇文章的内容。

- Android资源管理框架(Asset Manager)简要介绍和学习计划

- Android应用程序资源的编译和打包过程分析

所有Atlas的插件,都需要在build.gradle文件中指定资源分区,也就是versionName后加上[0x1, 0x7f]之间的值,使用补丁aapt进行打包。

我们可以通过补丁aapt打印出package id看看,会发现package id就是我们指定的0x21

Atlas的Android资源可以大致分为两部分,系统层资源和应用层资源

系统层资源分为三部分主要(5.0一下版本分为两部分)

  1. 系统框架层 ,Android的核心框架层资源id为 0x01
  2. 共享资源层 ,这部分的资源id为0x00,跟开发者关系不大,我们不会直接使用这部分
  3. WebView层,资源id为0x02.(这个在Android 5.0开始有的)(GoogleWebView.apk)

应用层分为两部分,宿主层和组件层

  1. 组件层资源相互独立,互不冲突,(id分布从0x10 到 0x7e)
  2. 宿主层的资源还是0x7f,保持默认值。
  3. 其中,宿主层包含共享资源(类似于系统的共享资源),组件层可能依赖于宿主层的共享资源(计划1.0支持)

总结为以下这幅图

要实现资源的分区,就必须使用打过补丁的aapt进行资源的打包。下面我们对补丁aapt进行编译。

编译环境是Ubuntu 14.04,参考http://source.android.com/source/initializing.html进行环境配置。

$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip

环境变量的临时增加

$ mkdir ~/bin
$ PATH=~/bin:$PATH

下载repo工具,这一步需要翻墙,可以使用hosts,hosts见http://laod.cn/hosts/2015-google-hosts.html

 ~/bin/repo
$ chmod a+x ~/bin/repo" data-snippet-id="ext.dfb70ca035daa301892fdab6db24d112" data-snippet-saved="false" data-csrftoken="3QgdRyjo-vwXJ5G76P6wd5U-OyWItcw9AInM" data-codota-status="done">$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

git配置

$ git config --global user.email "[email protected]"
$ git config --global user.name "Your Name"

源码下载,使用清华大学的镜像

$ mkdir ~/Android
$ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest
$ repo sync

接下来就是等吧,等的时间看你的网速了。100M的速度,大概也要好几个小时吧,差不多一天,支持断点续传

配置环境

$ cd Android
$ . build/envsetup.sh

完成后进入以下目录

$ cd Android/frameworks/base

将openatlas中的base.patch拷到该目录下。应用该patch,应用前最好切换到对应的分支(大概是android5.1.1的分支,具体哪个分支不清楚)

$ patch -p1 < base.patch 

没有出错的话就应用成功了。

编译aapt,如果要编译windows的版本,注意加上USE_MINGW=1

$ USE_MINGW=1 make aapt

如果只是linux版的,就直接

$ make aapt

如果没有出错就编译成功了,对应的文件在

Android/out/host/windows-x86/bin

或者

Android/out/host/linux-x86/bin

替换原来的aapt即可。但是后来发现编译完成的aapt比作者提供的aapt大了好多。。。。原因未知。。

如果在编译过程中提示

android comparison of integers of different signs: ‘size_t‘ (aka ‘unsigned long‘) and ‘int‘ [-Werror,-Wsign-compare]

找到对应文件中的代码,进行强制转换为int后再比较(不知是否有影响,源码没仔细看),所以最好切换到对应的分支上再应用patch

替换原aapt,进行测试,如果插件运行正常,差不多就成功了。下图是打印的结果,发现package已经被修改了,运行结果图就不贴了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 02:21:47

Androd插件化开发之Atlas资源打包工具补丁aapt的编译的相关文章

Android插件化开发之Atlas插件适配

前三篇文章,介绍了OpenAtlas的一些基本用法以及patch的aapt的编译方法. - Android插件化开发之Atlas初体验 - Android插件化开发之Atlas生成插件信息列表 - Android插件化开发之Atlas资源打包工具补丁aapt的编译 OpenAtlas的原则就是避免引入冗余的库.也就是宿主中提供了第三方库后,插件中就不要再引入该库,编译的时候以provided形式提供即可.最简单的例子就是v4,v7兼容库,应该避免引入.为了让我妈的插件脱离OpenAtlas也能独

Android插件化开发之Atlas生成插件信息列表

上一篇文章,[Android插件化开发之Atlas初体验]( http://blog.csdn.net/sbsujjbcy/article/details/47446733),简单的介绍了使用Atlas的整个流程,但是如果你没有实践过的话估计还是一头雾水,从这篇文章开始,慢慢的切入细节.这篇文章的主题是生成插件信息列表. 细心的你或许发现了上篇文章中我们使用了一个叫openatlasbundler的项目生成了so以及一个json文件,说白了这个so只不过就是apk重命名的,而这个json文件中包

Android插件化开发之Atlas初体验

OpenAtlas一款强大的Android非代理动态部署框架,目前已经处于稳定定状态. 与传统的代理方式插件不同,OpenAtlas需要对注册动态部署的组件到manifest文件. 初体验,只不过就是把程序跑起来,跑通,后面的路还很长.这个过程中也是遇到了不少问题,刚开始拿到这个项目真是无处下手(没有看到有wiki),后来百度搜索了下找到四篇博文,大概就是OpenAtlas的作者写的吧 Android OpenAtlas初识 Android OpenAtlas之二 基本结构 OpenAtlas之

Android插件化开发之OpenAtlas插件启动方式与插件启动广播

到现在为止已经写了6篇文章了 Android插件化开发之OpenAtlas初体验 Android插件化开发之OpenAtlas生成插件信息列表 Android插件化开发之OpenAtlas资源打包工具补丁aapt的编译 Android插件化开发之OpenAtlas插件适配 Android插件化开发之解决OpenAtlas组件在宿主的注册问题 Android插件化开发之OpenAtlas中四大组件与Application功能的验证 这篇文章主要介绍一下OpenAtlas插件的几种启动方式,在Atl

Android插件化开发之Hook StartActivity方法

第一步.先爆项目demo照片,代码不多,不要怕 第二步.应该知道Java反射相关知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之Java反射机制研究 http://blog.csdn.net/u011068702/article/details/49863931 第三步.应该知道Java静态代理知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之静态代理模式 http://blog.csdn.net/u011068702/article/detai

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一.温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉,猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二.介绍 我们知道在Android中可以跟java一样实现动态加载jar,但是Android使用德海Dalvik VM,不能直接加载java打包jar的byte code,需要通过dx工具来优化Dalvik

【转载】浅谈游戏开发之2D手游工具

浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK: 其它  全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,会走很多弯.独立工作室Sheado.net公司的Chad Ata在博客中分享了他们从一开始进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助.

【Cocos2d-Js基础教学(5)资源打包工具的使用及资源的异步加载处理】

[转载]http://www.cnblogs.com/zisou/p/cocos2dx-js5.html   TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包. 如果用过的同学可以直接看下面的资源的异步加载处理 首先为什么用TexturePacker? 1,节省图片资源实际大小 2,减少我们游戏中大量资源带来的内存负荷 3,方便游戏对纹理资源的内存管理 游戏开发到后期,我们或许都会遇到的瓶颈就是需要对游戏包进行"瘦身"和内存优化.那么使用TextureP

教你快速高效接入SDK——打包工具的实现(反编译资源动态整合打渠道包)

整套u8sdk的核心思想,就是让我们的SDK接入成本,能够控制在1,而不是N.啥意思呢?就是,我开发第一款游戏的时候,我接了这些SDK,当我开发第二款,第三款游戏的时候,这套SDK可以尽可能的复用,而不是每开发一款游戏,又从头去接各个渠道sdk.所有的游戏都能够使用同一套SDK接入框架,来快速完成SDK的接入工作.那么,在U8SDK里,我们怎么做到呢?请看我们总体的思路: 游戏A,游戏B,游戏C是三款不同的游戏,对于他们来说,他们只需要调用U8SDK抽象层提供的接口,就完成了所有SDK的接入工作