年前想着Google老大之前提醒过将项目升级到androidx,所以年前一通操作猛如虎把Android Studio唰唰升级到3.2.1,自然也把gradle升级到gradle-4.10.1-all。
没想到这只是开始作死的第一步,gradle升级的痛相信升级过的人都懂。
升级完项目后,不出所料的Android Studio呈现满江红的样式,十分酸爽。在我一次次修改,不断clean又build项目,天真的以为马上可以编译通过在运行成功时,现实总是冷冷的抽打我的脸,依旧有报错,R文件都无法生成,谈何运行。
改了3天,才差不多将各种报错问题修改完成,项目成功运行。
下面记录一下修改的内容,也方便以后查阅。
升级Android Studio后,在 Refactor ---> Migrate to AndroidX 路径下可以将整个项目升级到AndroidX。
所以接下来的修改也是在自动升级后的手动修改。
文末参考文章是Google官方的说明,可以查看里面更详细的指引和说明Migrating to AndroidX。
本文目录:
1.手动配置gradle.properties
2.app/build.gradle修改
3.java文件修改
4.布局文件xml修改
5.部分view不可用修改
6.其他问题
7.gradle命令帮助查找问题
8.参考文章
1.手动配置gradle.properties
android.enableJetifier=true
android.useAndroidX=true
2.app/build.gradle修改
修改前android.support | 修改后androidx |
---|---|
compile | implementation |
testCompile | testImplementation |
debugCompile | debugImplementation |
releaseCompile | releaseImplementation |
当然,这部分主要是因为gradle升级后提示需要的更新。
没写全,只写了主要的,Android Studio有提示,根据提示更新就行。
android{
//省略。。。。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
3.java文件修改
这里主要指import的修改,Android Studio自动帮助项目升级成androidx时,很多控件的路径在androidx中都变更了,所以需要全局搜索一键替换。
全局替换: Edit ->Find -> Replace in path
列举了一些常用的:
修改前android.support | 修改后androidx |
---|---|
import androidx.appcompat.widget.RecyclerView; | import androidx.recyclerview.widget.RecyclerView; |
import androidx.core.view.ViewPager; | import androidx.viewpager.widget.ViewPager; |
import androidx.core.view.PagerAdapter; | import androidx.viewpager.widget.PagerAdapter; |
import androidx.core.app.Fragment; | import androidx.fragment.app.Fragment; |
import androidx.core.app.FragmentManager; | import androidx.fragment.app.FragmentManager; |
import androidx.core.app.FragmentTransaction; | import androidx.fragment.app.FragmentTransaction; |
import androidx.core.content.LocalBroadcastManager; | import androidx.localbroadcastmanager.content.LocalBroadcastManager; |
import androidx.appcompat.widget.DefaultItemAnimator; | import androidx.recyclerview.widget.DefaultItemAnimator; |
import androidx.appcompat.widget.LinearLayoutManager; | import androidx.recyclerview.widget.LinearLayoutManager; |
import androidx.appcompat.widget.GridLayoutManager; | import androidx.recyclerview.widget.GridLayoutManager; |
import androidx.appcompat.widget.StaggeredGridLayoutManager; | import androidx.recyclerview.widget.StaggeredGridLayoutManager; |
import android.support.design.widget.CoordinatorLayout; | import androidx.coordinatorlayout.widget.CoordinatorLayout; |
import android.support.design.widget.CoordinatorLayout; | import androidx.coordinatorlayout.widget.CoordinatorLayout; |
import android.support.design.widget.TabLayout; | import com.google.android.material.tabs.TabLayout; |
import android.support.design.widget.AppBarLayout; | import com.google.android.material.appbar.AppBarLayout |
当整个项目因为未生成R文件满江红的时候,全局搜索替换这些常用控件会比较方便。
4.布局文件xml修改
在3.java文件修改中罗列了一些控件,同样也是全局搜索把这些对应的控件修改成androidx的就好。
列举几个:
修改前android.support | 修改后androidx |
---|---|
<android.support.v4.widget.NestedScrollView/> | <androidx.core.widget.NestedScrollView/> |
<android.support.v4.widget.Space/> | <Space/> |
<android.support.v7.widget.AppCompatTextView/> | <TextView/> |
<androidx.appcompat.widget.CardView/> | <androidx.cardview.widget.CardView/> |
注意!!!
不管是java还是xml也好,在Android Studio全局搜索的情况下还是有可能搜漏,所以可能还是需要挨个文件查看替换。
5.部分view不可用修改
之前手动拷贝了support包中的TabItem(TabLayout需要使用的一个类)出来使用,在升级到androidx后发现无法使用了。
support中的代码:
public TabItem(Context context, AttributeSet attrs) {
super(context, attrs);
final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
android.support.design.R.styleable.TabItem);
mText = a.getText(android.support.design.R.styleable.TabItem_android_text);
mIcon = a.getDrawable(android.support.design.R.styleable.TabItem_android_icon);
mCustomLayout = a.getResourceId(android.support.design.R.styleable.TabItem_android_layout, 0);
a.recycle();
}
a.getText()、a.getDrawable()、a.getResourceId()都报错,提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一个library group(groupId=androidx.appcompat)中被调用,
从TintTypedArray的源码可知,是在源码中做了限制的原因:
@RestrictTo(LIBRARY_GROUP)
public class TintTypedArray {}
6.其他问题
app module所依赖的一些library我也升级到了androidx,在将library中的build.gradle里的compile修改成implementation的时候注意,如果这里依赖的对象需要全局使用的话,就要使用api关键字了。
比如:
修改前:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
修改后:
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
}
7.gradle命令帮助查找问题
在我一次又一次编译项目时,始终找不到是java文件或者xml文件哪里出错了,logcat、message也不报错,这种时候是最愁的。
直到我找到了大杀器:gradle命令
在terminal本项目路径下使用下面这条命令来编译项目:
./gradlew compileDebugJavaWithJavac
编译不通过就会报错,报错信息里有报错的文件以及错误的位置,这条命令帮了大忙,可以说是相当感动了,双击回车就是666。
以上就基本上写完了,如果本文有错误或不妥之处欢迎大家指正和讨论,谢谢。
参考文章
如果对你有帮助的话,点赞、评论、赞赏都是对我的鼓励,也是支持我写下去的动力,谢谢!