日志使用技巧

image.png
image.png
image.png

Android Studio:新创建的目录不显示在文件夹视图中

我试图在/ res目录中创建一个新的文件夹 我添加了一个新目录 该文件夹不会出现在/ res文件夹中,即使它存在于finder中 案例和点我试图再次添加文件夹,我有一个消息告诉我它存在。 如果你可以建议我可以做些什么来解决这个问题,我会喜欢它! (是的,我已经重新启动程序,以及我的电脑) 最佳答案 原来在顶部有一个选择器,默认情况下,设置为显示Android。如果你轻击切换到“包”,你可以看到自己的包

Android Studio 3.4升级后的运行问题解决办法

原文请看Android Studio 3.4升级后的运行问题解决办法

Android Studio 3.4推出有一段时间了,升级之后又有几个问题需要处理,说明如下:

一、把Gradle升级到AS3.4配套的5.1.1版本
1、手工下载Gradle4.6并解压,下载地址是http://downloads.gradle.org/distributions/gradle-5.1.1-all.zip。将下载的压缩包解压到本地目录,比如解压到D:\Android\gradle-5.1.1 2、打开Android Studio,依次选择菜单“File”——“Settings”——“Build, Execution, Deployment”——“Gradle”,选中“Use Local gradle distribution”,然后输入Gradle5.1.1的解压目录。配置界面如下图所示:
Android Studio技巧 - 图4

二、在新建的项目中导入外部模块时报错 报错信息为“错误: 程序包android.support.v7.app不存在”,错误截图如下所示:
Android Studio技巧 - 图5
原因是AS3.4推出了AndroidX要取代原来的support库。创建新项目的时候,如果没有勾选“Use androidx. artifacts”,那么导入外部模块不会报错;只有勾选了“Use androidx. artifacts”,导入外部模块才会报上面的错。勾选界面如下图所示:
Android Studio技巧 - 图6
而且一旦勾选了“Use androidx.* artifacts”,后续创建其它项目的时候,该选项会变成默认选中,且为灰显不可取消,只有卸载重装AS才能恢复该选项。
如果不想卸载重装,也想继续使用AndroidX的话,则要在导入外部模块之后,修改模块的build.gradle,把原来support库的路径改为对应的AndroidX库的路径。举个例子 原来导入appcompat-v7的写法是下面这样:
implementation ‘com.android.support:appcompat-v7:28.0.0’
启用AndroidX之后,导入appcompat-v7的写法要改成下面这样:
implementation ‘androidx.appcompat:appcompat:1.0.0’

详细的support依赖库的新旧对应关系见下表:

支持库的旧路径 支持库的新路径
com.android.support.constraint:constraint-layout androidx.constraintlayout:constraintlayout:1.1.2
com.android.support.test.espresso:espresso-core androidx.test.espresso:espresso-core:3.1.0
com.android.support.test:runner androidx.test:runner:1.1.0
com.android.support:appcompat-v7 androidx.appcompat:appcompat:1.0.0
com.android.support:cardview-v7 androidx.cardview:cardview:1.0.0
com.android.support:design com.google.android.material:material:1.0.0-rc01
com.android.support:multidex androidx.multidex:multidex:2.0.0
com.android.support:palette-v7 androidx.palette:palette:1.0.0
com.android.support:recyclerview-v7 androidx.recyclerview:recyclerview:1.0.0
com.android.support:support-v4 androidx.legacy:legacy-support-v4:1.0.0

除了修改support库的路径,还要修改support控件的import导包代码,像AppCompatActivity原来的import语句是下面这样的:
import`` android``.``support``.``v7``.``app``.``AppCompatActivity``;

启用AndroidX之后,导入AppCompatActivity的代码要改成下面这样:
import`` androidx``.``appcompat``.``app``.``AppCompatActivity``;

详细的support控件的新旧对应关系见下表:

支持控件的旧包名 支持控件的旧包名
android.support.v4.app.Fragment androidx.fragment.app.Fragment
android.support.v4.app.FragmentActivity androidx.fragment.app.FragmentActivity
android.support.v4.app.FragmentManager androidx.fragment.app.FragmentManager
android.support.v4.app.FragmentPagerAdapter androidx.fragment.app.FragmentPagerAdapter
android.support.v4.view.ViewPager androidx.viewpager.widget.ViewPager
android.support.v4.view.PagerAdapter androidx.viewpager.widget.PagerAdapter
android.support.v4.view.PagerTabStrip androidx.viewpager.widget.PagerTabStrip
android.support.v4.view.PagerTitleStrip androidx.viewpager.widget.PagerTitleStrip
android.support.v7.app.AppCompatActivity androidx.appcompat.app.AppCompatActivity
android.support.v7.widget.Toolbar androidx.appcompat.widget.Toolbar
android.support.v7.widget.RecyclerView androidx.recyclerview.widget.RecyclerView
android.support.v7.widget.GridLayoutManager androidx.recyclerview.widget.GridLayoutManager
android.support.v7.widget.LinearLayoutManager androidx.recyclerview.widget.LinearLayoutManager
android.support.v7.widget.StaggeredGridLayoutManager androidx.recyclerview.widget.StaggeredGridLayoutManager
android.support.v7.widget.CardView androidx.cardview.widget.CardView
android.support.v7.graphics.Palette androidx.palette.graphics.Palette

一次解决找不到 android.support.v7.XXX 问题

原文一次解决找不到 android.support.v7.XXX 问题

对于类似以下错误

Error inflating class android.support.v7.widget.RecyclerView Didn’t find class “android.support.v7.widget.RecyclerView”

Error inflating class android.support.v7.widget.Toolbar Didn’t find class “android.support.v7.widget.Toolbar”

Error inflating class android.support.v7.widget.appcompat Didn’t find class “android.support.v7.widget.appcompat”


很有可能是因为android.support的v4、v7版本混乱冲突导致的
网上其他解决办法都导向统一版本号、清除缓存重新加载等方式,这里提供一种最新方法:改用androidx

文章目录
AndroidX与support包的关系
Androidx使用方式
例:recyclerView

AndroidX与support包的关系

androidx 是对 android.support.xxx 包的整理后产物。由于之前的support包过于混乱,所以,google推出了 androidX。

新的Android扩展库(AndroidX)取代了使用七年之久的Android支持库,旨在简化相关工作,并为该库未来的发展打下坚实的基础。 Android支持库允许开发人员在旧版本的Android上支持新的OS特性,或者回退到等效的功能,是一种可以部分地减轻Android生态系统碎片化的有效方式。按照谷歌的说法:

然而,在其自然发展的过程中,出现了多个让许多开发人员为之困惑的选项。其中一个例子是存在以“v7”命名的组件和包,这是该库需要的原始Android SDK级别,目前需要的最小版本是14(Android 4.0)。

自2018年5月Androidx发布少量组件不够稳定的alpha测试版一年后,已经完成多个组件的稳定版并持续更新中更多信息可参考Androidx官方文档

Androidx使用方式

在build.gradle中用

implementation ‘androidx.xxx(组件名):xxx(组件名):1.0.0(版本号)’

替换

implementation ‘com.android.support.v7.widget.xxx(组件名):x.x.x(版本号)’

并在xml文件中用

替换对应组件标签

例:recyclerView

在build.gradle中用

implementation ‘androidx.recyclerview:recyclerview:1.0.0’

替换

implementation ‘com.android.support:recyclerview-v7:x.x.x’

并在xml文件中用

替换对应组件标签

由于Androidx中是对于support包的整合升级,可能还需要修改组件相应代码,如recyclerView组件中,若使用还需要在Activity/fragment的代码中修改

manager.setOrientation(LinearLayoutManager.VERTICAL);
的参数 LinearLayoutManager.VERTICALRecyclerView.VERTICAL

其他不同组件版本号及命名方式可能各不相同,具体可参考Androidx官方文档

android.support升级到androidx踩坑记录

原文android.support升级到androidx踩坑记录

年前想着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。
Android Studio技巧 - 图7
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

  1. android.enableJetifier=true
  2. android.useAndroidX=true

2.app/build.gradle修改

修改前android.support 修改后androidx
compile implementation
testCompile testImplementation
debugCompile debugImplementation
releaseCompile releaseImplementation

当然,这部分主要是因为gradle升级后提示需要的更新。
没写全,只写了主要的,Android Studio有提示,根据提示更新就行。

  1. android{
  2. //省略。。。。
  3. compileOptions {
  4. sourceCompatibility JavaVersion.VERSION_1_8
  5. targetCompatibility JavaVersion.VERSION_1_8
  6. }
  7. }

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

注意!!!
不管是java还是xml也好,在Android Studio全局搜索的情况下还是有可能搜漏,所以可能还是需要挨个文件查看替换。

5.部分view不可用修改

之前手动拷贝了support包中的TabItem(TabLayout需要使用的一个类)出来使用,在升级到androidx后发现无法使用了。
support中的代码:

  1. public TabItem(Context context, AttributeSet attrs) {
  2. super(context, attrs);
  3. final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
  4. android.support.design.R.styleable.TabItem);
  5. mText = a.getText(android.support.design.R.styleable.TabItem_android_text);
  6. mIcon = a.getDrawable(android.support.design.R.styleable.TabItem_android_icon);
  7. mCustomLayout = a.getResourceId(android.support.design.R.styleable.TabItem_android_layout, 0);
  8. a.recycle();
  9. }

a.getText()、a.getDrawable()、a.getResourceId()都报错,提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一个library group(groupId=androidx.appcompat)中被调用,
从TintTypedArray的源码可知,是在源码中做了限制的原因:

  1. @RestrictTo(LIBRARY_GROUP)
  2. public class TintTypedArray {}

6.其他问题

app module所依赖的一些library我也升级到了androidx,在将library中的build.gradle里的compile修改成implementation的时候注意,如果这里依赖的对象需要全局使用的话,就要使用api关键字了。
比如:

  1. 修改前:
  2. dependencies {
  3. compile fileTree(dir: 'libs', include: ['*.jar'])
  4. }
  5. 修改后:
  6. dependencies {
  7. api fileTree(dir: 'libs', include: ['*.jar'])
  8. }

7.gradle命令帮助查找问题

在我一次又一次编译项目时,始终找不到是java文件或者xml文件哪里出错了,logcat、message也不报错,这种时候是最愁的。
直到我找到了大杀器:gradle命令
在terminal本项目路径下使用下面这条命令来编译项目:

./gradlew compileDebugJavaWithJavac

编译不通过就会报错,报错信息里有报错的文件以及错误的位置,这条命令帮了大忙,可以说是相当感动了,双击回车就是666。
以上就基本上写完了,如果本文有错误或不妥之处欢迎大家指正和讨论,谢谢。

参考文章

adb的一些命令和进入模拟器data目录的一些坑

来源链接

Android中我们经常用到模拟器来测试,查看data目录下的文件、数据库。在真机上,data是无法通过Android studio查看文件的,需要root,很麻烦。不过真机上的data目录可以用过手机的文件管理器读取到,也可以电脑来查看,比较麻烦。在Android studio中可直接查看模拟器的data目录。不过很多高版本的模拟器可能也无法看到,这时我们可以用adb命令来查看。

例如查看数据库文件,可以这么做:在cmd命令窗口,输入adb shell ,之后输入 cd /data/data/<你的包名>/databases/,有些模拟器就可以直接进入,但有些模拟器会提示Permission denied,那么就表示模拟器需要root,模拟器root很容易,直接输入 su root ,此时模拟器就root成功了,之后再键入之前的命令,就可以进入databases目录下,ls就可以查看此目录下所有的数据库文件。如果你想查看某一个数据库,直接键入 sqlite3 xx.db,之后提示sqlite的版本,此时就可以直接键入 .table ,就可以查看所有的表了,做你想做的事情。

adb命令特别多,介绍一篇博客,可以详细了解adb命令

文章地址:http://www.jianshu.com/p/56fd03f1aaae

github地址:https://github.com/BolexLiu/MyNote