Android开发中的问题集锦

1:编译签名apk后如何输出日志

Android开发中的问题集锦_第1张图片

2:低版本手机上无法安装apk

Android打包生成DEX文件过程中, 单个DEX文件可被引用的方法总数被限制为65536,超出会导致应用无法安装。

  • 需要在app.gradle中进行引用Multidex支持库,将一个dex拆分为多个:

1> defaultConfig {
...
...

// Enabling multidex support.
multiDexEnabled true
}
...
}

dependencies { compile 'com.android.support:multidex:1.0.0' }

application中重写以下方法:

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base); MultiDex.install(this);
}

  • 直接在Application -- onCreate方法中添加

   MultiDex.install(this);

3:Android 9.0设备访问页面报  net::ERR_CLEARTEXT_NOT_PERMITTED 

9.0新加的限制,对未加密url直接放弃请求 (http的url均不可以),如想正常访问需在Application中添加红框中的内容

Android开发中的问题集锦_第2张图片

4:Android Studio/Idea AAPT2 错误

AAPT 全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。在 Android SDK 目录下可以找到它。

1 > com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error

2 > 在高版本中禁用AAPT2配置作废,报错信息如下 :

The option 'android.enableAapt2' is deprecated and should not be used anymore.

Use 'android.enableAapt2=true' to remove this warning. It will be removed at the end of 2018..

出现以上2种问题的公共解决方式为以下第二和第三条

  •  在 gradle.properties 文件中,增加 “android.enableAapt2=false”,禁用AAPT2 (仅在错误1中可用)
  • 构建 App 的时候,打开 Build 窗口,点击 “Toggle View” 切换到文本输出,根据gradle 的执行输出查看排除问题进行解决
  • 查看程序目录/gradle目录是否存在中文,如果有则根据本章5的步骤进行修改

 5:更改gradle缓存目录

在这里说下我更改缓存目录的原因,因为我用户名称之前是中文的(实属脑残党)所以用新版Android Studio时AAPT2检测异常,又无法禁用,网上有好几种方式更改后不觉得有用,所以只能永久的更改目录啦。

把C:\Users\xx\.gradle目录删除掉,然后在其他盘新建目录(换盘符是因为.gradle文件夹的内容会不断增加,切记不要有中文,不然换盘符没意义)

设置系统变量:GRADLE_USER_HOME,变量值为自己新建的.gradle目录

Android开发中的问题集锦_第3张图片

为什么要配置变量呢,因为在gradle-wrapper.properties文件中有配置此路径,至于能不能直接在这里更改路径应该也可以,自己试下吧

Android开发中的问题集锦_第4张图片

系统变量配置成功后,根据下图内容进行选择后重新build下即可,如果出现异常:Unexpected lock protocol found in lock file. Expected 3, found 0.可能是有缓存之类的没清除,按照图2清除掉缓存即可。可以查看原目录下是否有生成.gradle,有Bug的话请留言赐教 ^ ^      

Android开发中的问题集锦_第5张图片

Android开发中的问题集锦_第6张图片

6:安卓通知栏使用

NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification builder = new NotificationCompat.Builder(IntentActivity.this)
        .setContentTitle("通知信息")
        .setContentText("通知内容")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.mipmap.ic_cool)
        .build();
manager.notify(1,builder);

Notification必须包含标题,标题内容,小图标三个属性,否则会发生异常,通知栏中将不显示通知内容

7:java.lang.RuntimeException: Unable to instantiate service xx.MyServiceActivity$MyService: java.lang.InstantiationException: class xx.MyServiceActivity$MyService has no zero argument constructor

项目中的服务是内部类,然后创建时报错,根据错误提示在MyService中添加了无参的构造函数,依然报错.....

然后将内部MyService类声明成静态类后,完美解决。

8:service

如果startService()、 bindService()一起被调用的话,onCreate()方法只在startService()时调用一次;销毁服务时需要调用unBindService()和stopService(),否则服务还存在。

当使用startService()启动服务时,当前Activity被销毁,那服务依然存在;当使用bindService()启动服务时,Activity销毁则服务也被销毁。

9:scrollView + listView动态布局

当listView列表中的控件有Button的时候,会导致listView.setOnItemClickListener()事件无效

解决方式:

1> 将列表中的Button控件换成TextView

2> 将listView布局替换成LinearLayout

10:vivo x9安装apk报 -- 解析包错误

解决方式:

转载自:https://blog.csdn.net/xudailong_blog/article/details/85013539

11:在Android studio目录下更改gradle build tools 版本

按照标识的目录找到build.gradle.ftl文件,编辑修改并保存,build tools版本默认为Android Studio Ide的版本号

gradle-projects目录下是各种项目模板配置文件,默认新建的是NewAndroidProject项目

Android开发中的问题集锦_第7张图片

Android开发中的问题集锦_第8张图片

Android开发中的问题集锦_第9张图片

12:Android ANR文件生成类型

APP出现Anr的时候默认会在/data/anr/下生成anr的日志文件traces.txt,每次生成都会替换文件内容,但因Android手机的多样性,SDK版本的更新,有些手机的anr文件会丢失,有些生成的文件名称会改变,经过测试多款手机大致分为:

1>  正常生成 /data/anr/traces.txt 文件

 每次发生anr,文件都会被替换,文件内容为最后一次出现anr时的日志

2>  生成/data/anr/traces_包名.txt文件

  根据应用包名生成anr日志文件

3> 生成/data/anr/traces_包名_年月日.txt文件

 根据应用包名和发生时间生成日志文件

4> 在/data/anr/下没有anr的日志文件

可以通过adb bugreport抓取日志,但是抓取的日志种类比较多,文件会很大,根据以下图片所说内容,并没有在当前项目路径下生成文件,应该会有默认的路径,但是没找到,后续找到会更新这里

13:命令获取文件md5值

certutil -hashfile libcomm.so MD5

14:不将第三方库打入jar包

Android开发中的问题集锦_第10张图片

15:获取so库路径

  Context.getApplicationInfo().nativeLibraryDir + "so库名称"

16:AndroidStudio升级到3.5最新版本

 编译报错:D:\A_work\.gradle\caches\modules-2\modules-2.lock ,打开多个as项目导致,关闭掉多余项目即可,是否还有其它原因还未证实

17:AndroidStudio LogCat窗口找不到的解决办法

Android开发中的问题集锦_第11张图片

Android开发中的问题集锦_第12张图片

按图的步骤操作即可找到,或者直接用快捷键Alt+6

18:部分真机设备连接正常不显示日志的解决办法

实测 MX6 :打开【设置】中的【开发者选项】,页面底部找到【性能优化】,打开【高级日志输出】,勾选【全部允许】即可

其他类型的设备可以自行测试,但我觉得应该不会差太多

19: Android studio编译报错“android:TextAppearance.Material.Widget.Button.Inverse not found”

更改v7版本与api一致,重新编译

20:子线程中解析Crash日志并发送导致Anr的解决方式

自定义CustomCrashHandler类实现Thread.UncaughtExceptionHandler,在uncaughtException类中开启子线程解析错误日志并发送,如果不将异常提交给默认的异常处理器 ,会导致ANR

public class CustomErrorHandler implements Thread.UncaughtExceptionHandler {
    private ErrorPriCallback mErrorPriCallback;

    public CustomErrorHandler() {
    }

    private Thread.UncaughtExceptionHandler otherHandler;

    /**
     * 初始化,注册Context对象, 获取系统默认的UncaughtException处理器, 设置该CrashHandler为程序的默认处理器
     *
     * @param errorPriCallback 异常出现后处理方式回调
     */
    public void init(ErrorPriCallback errorPriCallback) {
        mErrorPriCallback = errorPriCallback;
        otherHandler = Thread.getDefaultUncaughtExceptionHandler();//之前这里没有加,导致anr
        Thread.setDefaultUncaughtExceptionHandler(this);
    }


    public void setHandler(Thread.UncaughtExceptionHandler handler) {
        otherHandler = handler;
    }

    /**
     * 异常发生时,系统回调的函数,我们在这里处理一些操作
     */
    @Override
    public void uncaughtException(final Thread thread, final Throwable ex) {

        // 提示用户程序即将退出

        new Thread(new Runnable() {
            @Override
            public void run() {
                PApmLog.trace("crash-----> uncaughtException ");
                // 崩溃信息
                mErrorPriCallback.priInfo(CRASH, thread, ex);

                // 如果有其他的handler在此处理
                if (otherHandler != null) {
                    PApmLog.trace("crash-----> uncaughtException "+otherHandler);
                    otherHandler.uncaughtException(thread, ex);
                }
            }
        }).start();

    }

}

你可能感兴趣的:(Android)