最近一直在做安卓开发,奈何手中的资料比较老,资料上的一些Import经常没有,十分让人头疼。

感谢简书上的【张晴天天天天天】做的整理。

在这里也记录一下备用。

升级Android Studio后,在 Refactor ---> Migrate to AndroidX 路径下可以将整个项目升级到AndroidX。

 
Migrate to AndroidX.png

所以接下来的修改也是在自动升级后的手动修改。

文末参考文章是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踩坑记录【转载】的更多相关文章

  1. 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(下)

    文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 6.Android APP开发中其它需要提醒的问题 android4.4在UI线程无法进行网络操作. ...

  2. Android开发在路上:少去踩坑,多走捷径

    转自:http://djt.qq.com/article/view/1193   最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, ...

  3. Android开发在路上:少去踩坑,多走捷径(转)

    最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1. 目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2. 目前, ...

  4. 【转】Android开发在路上:少去踩坑,多走捷径

    本文是我订阅"腾讯大讲堂"公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门"爬"公众号文章的网站倒是有.我觉得写的很不错. ...

  5. SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制

    SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制 前言 LZ最近升级SpringBoo框架到2.1.6,踩了一些坑,这里介绍的是文件上传大小限制. 升级前 #文件上传配置 ...

  6. manjaro xfce 18.0 踩坑记录

    manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...

  7. Spark Ignite踩坑记录

    Ignite spark 踩坑记录 简述 ignite访问数据有两种模式: Thin Jdbc模式: Jdbc 模式和Ignite client模式: shell客户端输出问题,不能输出全列: 针对上 ...

  8. IDFA踩坑记录

    IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...

  9. python发布包到pypi的踩坑记录

    前言 突然想玩玩python了^_^ 这篇博文记录了我打算发布包到pypi的踩坑经历.python更新太快了,甚至连这种发布上传机制都在不断的更新,这导致网上的一些关于python发布上传到pypi的 ...

随机推荐

  1. C语言和单片机C语言为什么会有差异?虽不同但理同!

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学的C语言有差异呢? 今天小编就来梳理我们平时所学的C语言与单片机C语言的有什么样的不同. 单片机c语言比 ...

  2. 第四章 NFS服务相关介绍

    一.NFS服务介绍 1.什么是NFS?是一个共享存储,文件服务器 2.NFS基本概述NFS是Network File System的缩写及网络文件系统.NFS主要功能是通过局域网络让不同的主机系统之间 ...

  3. JAVA中Object类方法详解

    一.引言 Object是java所有类的基类,是整个类继承结构的顶端,也是最抽象的一个类.大家天天都在使用toString().equals().hashCode().waite().notify() ...

  4. 【Azure Redis 缓存 Azure Cache For Redis】当使用Jedis客户端连接Redis时候,遇见JedisConnectionException: Could not get a resource from the pool / Redis connection lost

    问题情形 当在执行Redis一直指令时,有可能会遇见如下几种错误: 1) redis.clients.jedis.exceptions.JedisConnectionException: Could ...

  5. git学习(五) git diff操作

    git diff操作 git diff用于比较差异: git diff 不加任何参数 用于比较当前工作区跟暂存区的差异 git diff --cached 或者--staged 对比暂存区(git a ...

  6. 抽空学学KVM(七):虚拟机快照和克隆

    前几天学写了KVM中qume-info命令的使用,今天学学在虚拟化里面用处广泛的快照和克隆功能,snapshot和virt-clone.对于snapshot命令的使用其实很简单.进入virsh界面以后 ...

  7. tf-tensorboard的一些注意事项

    tensorboard --logdir = 绝对路径 1.注意的是绝对路径里面不能有中文 2. tensorboard  文件应放在一个最小子目录中

  8. 博客主题——cnbook

    主题预览 主题下载 gshang.cnbook.rar version:2020-05-29 gshang.cnbook@2.0.rar version:2020-08-25 .source-down ...

  9. RestfulApi 学习笔记——简单介绍(一)

    前言 什么是restapi? 直接看:http://www.ruanyifeng.com/blog/2014/05/restful_api.html 阮一峰的blog,即可明白,下面是一些例子,增强理 ...

  10. rs485通讯模块有什么作用

    rs485通讯模块是什么 rs485通讯模块我们可以分为几个部分来理解,rs485简单来说就是一个硬件,是一个物理接口.而这个接口要进行数据传输通讯,就需要采用网络协议和远端的服务器或者是其它网络设备 ...