修改Android Gradle plugin的aapt路径
2016-07-26 16:50
1146 查看
最近在做一套Andorid插件化方案,在解决资源id冲突的问题时,采用的是修改aapt的方式来做的,修改aapt的方式遇到的最大的问题就是编译插件的时候得替换sdk中的aapt,或者采用自己写的脚本来编译,这样开发过程肯定是很不方便的。因此本文尝试在Gradle plugin上修改aapt路径。
https://android.googlesource.com/platform/tools/base/+/gradle_2.0.0/build-system/ 其中
经过一段艰苦的grep源码之后,可以看到插件中取aapt的方式都是
重点在这:
而这个path是在
准备工作
首先下载一份Gradle plugin的源码:https://android.googlesource.com/platform/tools/base/+/gradle_2.0.0/build-system/ 其中
gradle_2.0.0是分支名,可以按照最新的分支来修改。
经过一段艰苦的grep源码之后,可以看到插件中取aapt的方式都是
重点在这:
BuildToolInfo buildToolInfo = mTargetInfo.getBuildTools(); String aapt = buildToolInfo.getPath(BuildToolInfo.PathId.AAPT);
而这个path是在
BuildToolInfo构造的时候通过调用
com.android.sdklib.BuildToolInfo#add(com.android.sdklib.BuildToolInfo.PathId, java.io.File)来添加到一个map中的,因此我们只要再调用这个方法,替换map中的值即可替换aapt路径了。
具体方案
替换的方式很简单,只要理清楚了Gradle plugin中的一些类的关系就可以获得这个BuildToolInfo对象了,因为Groovy本身是完全兼容Java语法的,因此直接使用Java的反射方式来修改。具体代码如下:/** * 修改Aapt路径 */ Task modifyAaptPathTask = task('modifyAaptPath') << { android.applicationVariants.all { variant -> BuildToolInfo buildToolInfo = variant.androidBuilder.getTargetInfo().getBuildTools() Method addMethod = BuildToolInfo.class.getDeclaredMethod("add", BuildToolInfo.PathId.class, File.class) addMethod.setAccessible(true) String newAaptPath = "youpath/aapt" addMethod.invoke(buildToolInfo, BuildToolInfo.PathId.AAPT, new File(rootDir, newAaptPath)) println "[LOG] new aapt path = " + buildToolInfo.getPath(BuildToolInfo.PathId.AAPT) } } /** * 在preBuild task执行前修改aapt path */ preBuild.doFirst { modifyAaptPathTask.execute() }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories