【Android】常见问题集锦

赠人玫瑰,手有余香。但行好事,无问西东。

文章目录


1. 报错信息:Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not “opens java.io” to unnamed module @1a7525c8

现象:此问题出现在java9以上版本,打包时Android studio报错

在Java 9及更高版本中,模块化系统引入了严格的封装规则。当你打包项目为JAR并尝试运行时遇到类似“module java.base does not ‘opens java.lang’ to unnamed module”的错误,这是因为某个类或包试图反射访问java.base模块中的非公开API,而未命名模块(即不是以模块形式构建的JAR)没有被授予这种权限。

解决:将以下内容添加到gradle.properties.

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 \
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED

参考:【Error accessible: module java.base does not “opens java.lang“ to unnamed module @3ac3fd8b】

2. Package Name not found in /******/app/src/main/AndroidManifest.xml, and namespace not specified. Please specify a namespace for the generated R and BuildConfig classes via android.namespace in the module’s build.gradle file like so:

原因:未在清单文件中设置包名或者在gradle中命名空间,package 和 nameSpace 同样效果
解决:配置包名即可

3.项目包名重命名

  1. 修改包名设置,清单文件,gradle
  2. 修改包名目录,直接修改无效
    新建目录,在整体迁移
  3. 修改R文件名称
    例如:MainActivity中import com.ang.cafe.R 修改为 import com.ang.iot.cafe.R
    AndroidStudio —>Edit —>Find —> Replace in Path 替换既可;
    全局替换,快捷键:Ctrl + Shift + R

4. getResources().getColor(int)‘ 已经过时了

使用最新官方推荐的方法:
textView.setTextColor(ContextCompat.getColor(mContext,R.color.black))

5. android:windowIsTranslucent=true导致页面转场动画穿透

此方法是theme里面的属性设置,将window设置成透明,会导致activity转场动画穿透,看起来效果就是页面闪烁

6. Android自定义打包名称


android {
    //....
 
    applicationVariants.all{ variant ->
        variant.outputs.all{
            def createTime = new Date().format("MMddHHmm", TimeZone.getTimeZone("GMT+08:00"))
            def fileName = "YourProjectName_${defaultConfig.versionName}_${buildType.name}_${createTime}.apk"
            outputFileName = fileName
        }
    }
 
    //....

7. 检查和更新Android gradle插件

确保在 Demo/gradle/wrapper/build.gradle 文件中设置正确的 AGP(Android Gradle Plugin 的缩写,中文全称是 Android Gradle 插件) 版本。

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.0'
    }
}

8. Android 蓝牙无法连接或无法获取蓝牙权限是否获取

ps:Android 12 一加手机,检查手机权限时,蓝牙已经授权,但是无法获取蓝牙的授权状态依然是false。

从Android 12开始,过去的蓝牙权限被拆分成了3个新的权限,并且全都是运行时权限(需要动态申请):

BLUETOOTH_SCAN 用于使用蓝牙扫描附件其他的蓝牙设备
BLUETOOTH_ADVERTISE 用于允许当前的设备被其他的蓝牙设备所发现
BLUETOOTH_CONNECT 用于连接之前已经配对过的蓝牙设备

因此maxSdkVersion="30"以上的权限需要申请新增的蓝牙权限,上述3个权限属于组权限,理论上申请一个即可。

Android连接蓝牙设备问题(android.permission.BLUETOOTH)

9.组合文字设置:字体、颜色、下划线、图片、点击事件等

SpannableString spanString = new SpannableString("欢迎光临Harvic的博客"); 
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC); 
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
editText.setText(spanString); 

 // 设置富文本点击事件
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
               
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                super.updateDrawState(ds);
                // 设置文本颜色为蓝色
                ds.setColor(Color.BLUE);
            }
        };

Android中的SpannableString与SpannableStringBuilder详解

10. gerrit 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain

上传:gradle-wrapper.jar/ gradle-wrapper.properties
解决:添加gradle
$ git add -f android/gradle/wrapper/gradle-wrapper.jar

11. android打包报错 AAPT: error: IDAT: incorrect data check. AAPT: error: file failed to compile.

16:56:02 > A failure occurred while executing
com.android.build.gradle.internal.res.Aapt2CompileRunnable 16:56:02
Android resource compilation failed 16:56:02 ERROR:/******/src/main/res/drawable-mdpi/code.png: AAPT: error:file failed to compile.

在app/build.gradle文件中添加下列代码

aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

12、bash: …/gradlew: 没有那个文件或目录

gerrit需要上传gradlew文件

13、 bash: …/gradlew: 权限不够

使用 git update-index --chmod=+x 增加文件的执行权限
使用git update-index --chmod=-x 撤销文件的执行权限。

这些命令都是直接作用于Git索引(也称为暂存区)的,它们不会直接修改工作区中的文件权限。所以,如果你想要在文件权限改变后将其提交到版本库中,你需要在操作之后再执行git add 以更新索引,并在提交提交之前执行git commit命令。

14、快速修改导入的R文件包名

例如:MainActivity中import com.ang.cafe.R 修改为 import com.ang.iot.cafe.R

AndroidStudio —>Edit —>Find —> Replace in Path 替换既可;

全局替换快捷键:Ctrl + Shift + R

15、Could not find scan-2.2.0.300.jar (com.huawei.hms:scan:2.2.0.300).

Searched in the following locations:

解释:gerrit 会去gradle配置的maven服务器查找依赖,先是本地配置的外网镜像,然后是本地的依赖,外网访问较慢或安全问题一般无法访问。增加huawei的maven镜像配置到本地maven仓库

16、Error: The drawable “bg_app” in drawable-night-mdpi has no declaration in the base drawable folder or in a drawable-densitydpi folder; this can lead to crashes when the drawable is queried in a configuration that does not match this qualifier [MissingDefaultResource]

解释:缺少白天模式的引用背景图,在白天黑夜模式切换时可能会出现crash.

17、Apps registering for non-system broadcasts should use the ContextCompat#registerReceiver APIs with flags set to either RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED.

以下为提示信息原文

In Android U, all receivers registering for non-system broadcasts are required to include a flag indicating the receiver’s exported state. Apps registering for non-system broadcasts should use the ContextCompat#registerReceiver APIs with flags set to either RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED.

意思是Android14 普通应用注册广播registerReceiver会报错,提示需要添加一个参数RECEIVER_EXPORTED 或者 RECEIVER_NOT_EXPORTED。
从Android13开始,注册静态广播时,需设置对其他应用的可见性。

解法:

if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
    context.registerReceiver(new LocaleChangeReceiver(), filter, Context.RECEIVER_EXPORTED);
} else {
    context.registerReceiver(new LocaleChangeReceiver(), filter);
}

18、adb server version (41) doesn’t match this client (39); killing

现象:Android studio 可以连接adb设备,但是切换到命令行运行adb,显示此问题,调用多次adb devices可以显示设备,命令行可用,但Android studio无法识别到设备

分析:实际是因为ubutun升级了Android studio,之前老款的Android studio配置的adb环境变量一直未升级,导致环境变量配置的是旧版adb39版本,与客户端41不匹配

解决:将新版Android studio的adb拷到环境变量配置里面,原有的删除,重启运行即可

19、ubutun系统连接adb设备提示no permission (user in plugdev group)

  1. sudo vim /etc/udev/rules.d/51-android.rules 创建一个规则文件
  2. 文件中输入如下内容
    SUBSYSTEM==“usb”, MODE=“0660”, GROUP=“plugdev”, SYMLINK+=“android%n”
  3. :wq 保持退出,使用cat命令查看
    cat /etc/udev/rules.d/51-android.rules
  4. 重新插拔USB设备,可弹出允许调试按键,输入adb devices即可解决

Ubuntu18.04提示adb设备没有权限 no permission (user in plugdev group)-最简单方法

20、gerrit编译错误:Failed to apply plugin ‘com.android.internal.application’.

现象: A problem occurred evaluating project ‘:app’.
10:30:01 > Failed to apply plugin ‘com.android.internal.application’.
10:30:01 > The option ‘android.enableBuildCache’ is deprecated.
10:30:01 The current default is ‘false’.
10:30:01 It was removed in version 7.0 of the Android Gradle plugin.
10:30:01 The Android-specific build caches were superseded by the Gradle build cache (https://docs.gradle.org/current/userguide/build_cache.html).

分析:系老版本android环境配置问题,gradle.properties中此项设置android.enableBuildCache已经在7.0版本开始被移除,编译缓存优化的问题gradle从7.0以后已经被优化,有更好的方法,故此方法被废弃。

20、隐藏HMS scan 扫码界面,相册的方法

现象:HMS scan层级较深且未开发界面控件设置方法,自定义或者更换扫码,工作量和时间均大
思路:在application中,通过registerLifeCycle在onActivityCreated中通过获取获取界面的控件再去隐藏

/**
     * 隐藏华为扫码界面图库按钮,相册权限非必要
     *
     * @param view 待遍历的视图
     */
    private void traverseView(View view) {
        if (view instanceof ViewGroup) {
            ViewGroup group = (ViewGroup) view;
            for (int i = 0; i < group.getChildCount(); i++) {
                View child = group.getChildAt(i);
                // 根据特征匹配(例如:ImageButton 且内容描述为 "从相册选择")
                if (child instanceof ImageView) {
                    ImageView button = (ImageView) child;
                    if ("图库".equals(button.getContentDescription())) {
                        button.setVisibility(View.GONE);
                        return;
                    }
                }
                traverseView(child);
            }
        }
    }

21、安装APK提示Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]

解法:在AndroidManifest.xml 添加配置“android:extractNativeLibs=“true”,设置so库压缩,并且对齐
原因:此属性默认为false,即android打包的时候默认是对so库不进行压缩,so库较大会出现上述提取失败的情况。

一文了解 APK瘦身属性android:extractNativeLibs

22、 adb: failed to install game.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package <package_name>]

意思是说安装包没有 V2 或更高等级的签名。
现象:系adb给apk签名时提示报错,签名用的jarsigner,签出的签名是V1类型。
解法:推荐使用ApkSigner进行签名,可以签V2签名,但需要注意签名前对APK文件进行4字节对齐

Android R 不再支持 APK Signature Scheme v1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值