直接转载吧..很优秀
error: found an invalid color.
error: top-left corner pixel must be either opaque white or transparent.
strings.xml: Error: Unsupported type 'add-resource'
error: image must be at least 3x3 (1x1 image with 1 pixel border).
折腾环境
一个原始eclipse项目,坑多的那种(.9图不规范、string.xml不规范、Api过时等)
一个新的AS项目(包名需要与原始项目的一致)
折腾手记
迁移AndroidManifast
这里在eclipse中会比在AS中多一些值,比如VersionName、VerSionCode、CompileSDK等,这里需要按需添加到build.grdle文件中管理
其他部分,activity、service、broadcast均可照搬(前提:包名未修改)
迁移类
类迁移时需要注意的问题:
对应包名不要改,保持原有,否则错误会多到难以想象。
文件编码,eclipse的项目以前多为GBK,这里会有很多乱码问题,好在AS会提示编码错误,先按提示reload一次文件,再在右下角convert保存为UTF-8格式的文件
逐个迁移xml布局
xml布局中问题不大,只是xml中引用的资源文件比较多,迁移时需要注意。
逐个补全style以及图片资源
为什么要说逐个呢?主要是因为如果资源文件有问题,只会报AAPT2错误,并不会告诉你错在哪,所以需要逐个排查。特别对于.9图,边上没有黑线的,请用AS加上黑线,否则会报:
error: top-left corner pixel must be either opaque white or transparent.
解决办法:用AS打开.9图
检查边框,是否有宽度但是却没有黑线,如果一切正常,修改图中2x的地方,拖到其他值,保存,再拖回来,保存。
错误二:error: found an invalid color.
检查color.xml文件中是否存在不合法的颜色值,我的是部分不存在#号,如本来是:#FFFFFF 却少了#号
错误三:error: image must be at least 3x3 (1x1 image with 1 pixel border).
这种情况存在于直接用AS导入项目,手动逐个添加未遇到这个问题
错误四:strings.xml: Error: Unsupported type 'add-resource'
直接去掉。关于这个问题,在原始的String.xml还有一种表述方法:
<string name="wifi_and_mobile_skipped_message" product="tablet">
这种情况,会报key存在多种定义的错误,去掉product然后重新命名,用到的地方相应进行更改。
修复错误
这里会有很多问题,别急,慢慢来,列举一个常见的问题:
1. 内部interface的实现问题
OnClickListener myOnClickListener = new OnClickListener()
在eclipse中上面为常见做法,但是在AS中需要在这个接口使用时加上类名
View.OnClickListener myOnClickListener = new View.OnClickListener()
另外可以装上ali的p3c插件,规范提示会有很多,一个个修改。
2.AIDL 错误: 找不到符号 符号: 类 DisplayParm 位置: 程序包 com.xxx.aidl
在eclipse中,AIDL使用的Parm与AIDL处于同一个位置,因为都在java文件夹内
而在AS中,AIDL文件夹是与java文件夹并列的。
解决办法:把参数类文件 放到 java 文件夹下,包名和aidl文件夹中放 *** .aidl文件的包名一致
使用系统编译后生成的jar包作为apk的编译库
因为是系统应用,所以存在一些找不到的@hide注解的类或者方法
这里可以使用反射或者动态代理的方式解决,但是对于系统应用,这未免太麻烦。
去到你编译的系统的out目录,类似该位置:
/home/sdb/hongfeilong/Mst348_beta/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates
将classes.jar拷贝到你项目的libs中。使用gradle引用:
去掉新建项目的依赖,比如:
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
//这些删除 或者放在compileOnly files('libs/framework.jar')之后
因为这里是eclipse项目 可以去除,所以改为:
compileOnly files('libs/framework.jar')
如果你还需要其他jar包,可以按这种方式添加。另外:
在编译时加上你的framework,否则会编译不通过~
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:/libs/m658_framework.jar')
}
}
此外如果IDE出现错误提示,可以尝试在app的build.gradle中添加
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
}
}
}
此外~祝一切顺利。
参考:https://www.jianshu.com/p/5df58f943332
https://blog.youkuaiyun.com/peter_water/article/details/75452236
https://blog.youkuaiyun.com/mvpstevenlin/article/details/53283593
https://blog.youkuaiyun.com/baidu_30164869/article/details/51036405