Android 支持库允许开发人员在旧版本的 Android 上支持新的 OS 特性,我们常用的 support v4、v7就是支持库,Google 2018 IO 大会推出了 Android 新的扩展库 AndroidX,用于替换原来的 Android 支持库。
不知道大家都迁移到AndroidX了没有,我有个开发Android项目的基础框架,里面集成了常用的第三方库和工具类,方便快速开发新项目。最近也是迁移到了 AndroidX,下面记录迁移的过程和遇到的一些问题。
升级Android Studio,升级后的版本是3.3.2
在 gradle.properties 里面加上
android.useAndroidX=true
android.enableJetifier=true
其中,android.useAndroidX=true 表示当前项目启用 AndroidX,android.enableJetifier=true 表示将依赖包也迁移到 AndroidX。
然后出现了一个报错信息:
Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.
compile 已经被弃用,把 build.gradle 里面的 compile 全部改成 implementation
-
执行 Refactor > Migrate to AndroidX
Migrate 失败,出现了下面的问题:
compileSdkVersion 原来是27,改成28:
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.baseproject"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
...
}
再一次 Migrate,还是失败:
Gradle version 改成 4.10.1
(原来4.1
),Android Plugin Version 改成 3.3.2
(原来3.0.1
):
- 再次 Migrate to AndroidX 成功后,出现很多编译错误,一个个文件处理,删除后重新import:
//旧的
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import androidx.core.app.Fragment;
import androidx.core.app.FragmentManager;
import androidx.core.app.FragmentTransaction;
import androidx.core.view.PagerAdapter;
import androidx.core.view.ViewPager;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
//新的
import androidx.annotation.LayoutRes;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;
- 运行的时候出现下面的问题:
FAILURE: Build failed with an exception.
* What went wrong:
Could not resolve all files for configuration ':app:debugAnnotationProcessorClasspath'.
> Failed to transform file 'butterknife-compiler-8.8.1.jar' to match attributes {artifactType=processed-jar} using transform JetifyTransform
> Failed to transform '/Users/xieyue/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife-compiler/8.8.1/b2f4505a1babb7b7c11abbbf8ea4c90b18c3aeac/butterknife-compiler-8.8.1.jar' using Jetifier. Reason: The given artifact contains a string literal with a package reference 'android.support.v4.content' that cannot be safely rewritten. Libraries using reflection such as annotation processors need to be updated manually to add support for androidx.. (Run with --stacktrace for more details.)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 5s
6 actionable tasks: 1 executed, 5 up-to-date
参考 butterknife 官网的处理办法:
android {
...
// Butterknife requires Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
}
然后就可以正常编译和运行了。
大概的迁移流程就是这样,每个项目迁移时遇到的问题可能都不一样,大家遇到问题多上网找找办法,方法总比问题多。也欢迎大家关注我的公众号:JairusTse的日常。
最后,附上项目的码云地址:https://gitee.com/jairustes/project_framework