最近导入android10 Launcher3的项目到AS上遇到了各种问题导致编译不能继续,下面我们一个一个解决:
1.
'variant.getJavaCompile()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()' 这个错误警告很有可能是gradle版本的问题,
我们这份代码中默认的gradle版本是3.3.0,结合上面警告中被替换的得信息我们可能需要更老版本的gradle。 所以修改为3.2.1版本试试就可以了。
2. failed to find Platform SDK with path: platform; android-Q
这个很明显是
COMPILE_SDK的问题了
gradle.properties中的定义:
结合sdk location目录: C:\Users\user\AppData\Local\Android\Sdk
根本就没有android-Q目录,所以我们改成android-29.
3.各种找不到类:
很明显需要导入framework.jar。 我们去out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar拷贝到当前项目的libs/目录下。
然后又报错:
我们可以看到
getIdentifier() 属于
@SystemApi 所以AS默认是看不到的,
我们需要添加几行代码让AS能够看到这些系统隐藏接口。
allprojects {
repositories {
mavenCentral()
google()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
// Xbootclasspath/p:是 Java 编译的寻址优先设置,先找缺省路径还是全路径
options.compilerArgs.add('-Xbootclasspath/p:libs/framework.jar')
}
}
gradle.buildFinished {
pushDownSDK(".idea/modules/app/app.iml");
}
}
//在app/app.iml中,把jdk的顺序调整到最后
def pushDownSDK(iml) {
def imlFile = file(iml)
try {
def parsedXml = (new XmlParser()).parse(imlFile)
def jdkIndexOf = parsedXml.component[1].orderEntry.findIndexOf { it.'@type' == 'jdk' }
if (jdkIndexOf <= 1) {
def jdkNode =parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
parsedXml.component[1].remove(jdkNode)
new Node(parsedXml.component[1], 'orderEntry',['type': 'jdk', 'jdkName': 'Android API 28 Platform', 'jdkType': 'Android SDK'])
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml)
imlFile.text = writer.toString()
println "Push File: $iml jdk priority ok"
groovy.xml.XmlUtil.serialize(parsedXml,new FileOutputStream(imlFile))
}
} catch (Exception e) {
// do nothing
}
}
最后从out目录中导入其他几个依赖的jar包:
程序包com.google.protobuf.nano不存在的问题需要到out目录中找到libprotobuf-java-nano.jar导入。
程序包android.stats.launcher.nano不存在
import android.stats.launcher.nano.LauncherExtension; 需要导入launcherprotosnano.jar
各种systemui的库找不到, 导入MtkSystemUISharedLib.jar
然后修改几处已经过时的接口,最后编译顺利通过。