Tips:折腾前请先思考工期,以及明确你的需求,然后再动刀,不推荐直接导入。
折腾环境
一个原始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 3×3 (1×1 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.csdn.net/peter_water/article/details/75452236
https://blog.csdn.net/mvpstevenlin/article/details/53283593
https://blog.csdn.net/baidu_30164869/article/details/51036405
本站由以下主机服务商提供服务支持:
0条评论