我的AS没有android工具包,AS中导入framework/android包的技巧

前言

之前在平台发布过一篇关于AS导入二次开发系统包的文章,得到很多开发者的回馈和讨论,有兴趣的可以回看AS中导入framework.jar包编译,运行全部通过。加上最近使用团队开发模式,楼主也用到了Mac环境做开发。一些android/framework包的路径问题也暴露出来。小伙伴们都抱怨每次编译前都需要去project目录下build.gradle修改相关的路径参数。

89d8602c0e0c

小妖怪

抱着方便你(zhuang)我(bi)他,就研究了一些获取系统路径参数的办法。

准备

首先,准备一个系统包,

89d8602c0e0c

系统包。如果手上没有,可以在这里下载------android.jar包。这个包更改了网络部分,可以在自己项目中试试以下语句,会报错

LinkAddress mIpAddress = new LinkAddress(mIpAddr, prefixLength);

错误信息如下:

错误: 无法将类 LinkAddress中的构造器 LinkAddress应用到给定类型;

需要: 没有参数

找到: InetAddress,int

原因: 实际参数列表和形式参数列表长度不同

打开源码,这段构造函数是hide的。

/**

* Constructs a new {@code LinkAddress} from an {@code InetAddress} and prefix length, with

* the specified flags and scope. Flags and scope are not checked for validity.

* @param address The IP address.

* @param prefixLength The prefix length.

* @param flags A bitmask of {@code IFA_F_*} values representing properties of the address.

* @param scope An integer defining the scope in which the address is unique (e.g.,

* {@link OsConstants#RT_SCOPE_LINK} or {@link OsConstants#RT_SCOPE_SITE}).

* @hide

*/

public LinkAddress(InetAddress address, int prefixLength, int flags, int scope) {

init(address, prefixLength, flags, scope);

}

操作流程

首先,将android包放在lib目录下,并在项目的build.gradle目录的dependence下添加以下代码:

gradle 3.0以上

compileOnly files('libs/android.jar')

gradle 3.0以下

provide files('libs/android.jar')

这里是为了在编译和打包时只编译/打包进使用过得二次编码包。因为使用compile或者implementation会将整个android.jar包打入apk包中,还会造成dex打包错误。同时注释以下依赖

// implementation fileTree(include: ['*.jar'], dir: 'libs')

其次,这里无需再增加.iml的操作脚本。也就是如下脚本

//@Deprecated

preBuild {

doLast {

def imlFile = file(project.name + ".iml")

println 'Change ' + project.name + '.iml order'

try {

def parsedXml = (new XmlParser()).parse(imlFile)

def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }

parsedXml.component[1].remove(jdkNode)

def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"

new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])

groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))

} catch (FileNotFoundException e) {

// nop, iml not found

}

}

}

最后,在项目根目录build.gradle目录下,需要使用全局配置路径的方式来引入jar包。

//添加以下代码,使android.jar包编译先于系统下android.jar

gradle.projectsEvaluated {

tasks.withType(JavaCompile) {

options.compilerArgs.add("-Xbootclasspath/p:$rootDir${File.separator}app${File.separator}libs${File.separator}android.jar")

}

}

rootDir 项目的路径

$ {File.separator}引用当前系统的分隔符,windows与mac不相同

编译运行通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值