一个远古的系统Settings从eclipse到Android Studio的迁移记


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 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')

如果你还需要其他jar包,可以按这种方式添加。另外:

在编译时加上你的framework,否则会编译不通过~

此外如果需要去除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

 

声明:TIL|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA[ZH]协议进行授权

转载:转载请注明原文链接 - 一个远古的系统Settings从eclipse到Android Studio的迁移记


Life is very interesting. In the end, some of your greatest pains become your greatest strengths.