android开发导包升级到androidx踩坑记录【转载】
最近一直在做安卓开发,奈何手中的资料比较老,资料上的一些Import经常没有,十分让人头疼。
感谢简书上的【张晴天天天天天】做的整理。
在这里也记录一下备用。
升级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
作者:张晴天天天天天
链接:https://www.jianshu.com/p/b0800f590e6e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
android开发导包升级到androidx踩坑记录【转载】的更多相关文章
- 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(下)
文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 6.Android APP开发中其它需要提醒的问题 android4.4在UI线程无法进行网络操作. ...
- Android开发在路上:少去踩坑,多走捷径
转自:http://djt.qq.com/article/view/1193 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, ...
- Android开发在路上:少去踩坑,多走捷径(转)
最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1. 目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2. 目前, ...
- 【转】Android开发在路上:少去踩坑,多走捷径
本文是我订阅"腾讯大讲堂"公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门"爬"公众号文章的网站倒是有.我觉得写的很不错. ...
- SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制
SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制 前言 LZ最近升级SpringBoo框架到2.1.6,踩了一些坑,这里介绍的是文件上传大小限制. 升级前 #文件上传配置 ...
- manjaro xfce 18.0 踩坑记录
manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...
- Spark Ignite踩坑记录
Ignite spark 踩坑记录 简述 ignite访问数据有两种模式: Thin Jdbc模式: Jdbc 模式和Ignite client模式: shell客户端输出问题,不能输出全列: 针对上 ...
- IDFA踩坑记录
IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...
- python发布包到pypi的踩坑记录
前言 突然想玩玩python了^_^ 这篇博文记录了我打算发布包到pypi的踩坑经历.python更新太快了,甚至连这种发布上传机制都在不断的更新,这导致网上的一些关于python发布上传到pypi的 ...
随机推荐
- 基于python实现链式队列代码
""" 链式存储-队列 linkqueue.py 代码实现 思路: 1.入队, 2.出队, 3.判断空满 """ # 异常类 class Q ...
- GDB使用checkpoint复现bug
今天面试被问到一个问题,如何调试多进程的程序,我回答gdb attach [pid],之后又问如果程序中有些数据读取不对,但这种现象是偶然发生的,这时候要怎么操作,当时就懵了......,通过查找资料 ...
- .net npoi读word内容+目录
最近在做读npoi文档存入搜索引擎,实现快速查询word文档中内容并展示,效果希望带有目录导航. 网上有很多例子都是读写操作,很肤浅没有具体读到想要的东西所以自己就写了个demo,也有微软提供的off ...
- 对于类似经销商的实体中Place(CBM_PALCE_ID = NULL)的情况,如何获取省市信息(限foton)
在库里像上述描述的数据很多,这种情况需要拿fence里的经纬度,反查省市 String[] strArr = data.getFence().getValue().split(";" ...
- sqlsugar入门(2)-C#方法与sugar自定义函数的区别
1.使用tostring获取当天数据 var list = ssc.Queryable<Student>().Where(o => o.CreateTime.Value.ToStri ...
- php socket通信的简单实现
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Django项目之打分系统
打分系统 关注公众号"轻松学编程"了解更多. 项目GitHub地址:https://github.com/liangdongchang/VoteSys.git 1.开发需求 a. ...
- Django实现文件上传功能
文件上传 关注公众号"轻松学编程"了解更多. 1.创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置,MEDIA_ROOT=o ...
- 微信小程序-游记分享(无后台)
游记分享 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE2020 作业要求 https://edu.cnblogs.com/campus/zjcsxy/SE ...
- 较详细的gdb入门教程
本文主要介绍gdb的基础使用.若需了解一些技巧,请访问此篇博客:点这里 本篇教程适用于Windows,macOS及Linux,但由于Windows的自带终端很难用,所以体验可能不太好.Windows ...