Android 混淆提示 java.io.FileNotFoundException: ...\proguard-rules\release\aapt_rules.txt (系统找不到指定的路径)

本文介绍了解决Android Studio在进行应用混淆打包时出现的文件找不到的问题,提供了清理项目的具体步骤,并解释了不同构建选项的作用。

这个问题花了一些时间,在这里记录下来,首先先来说说Android的混淆。


混淆配置文件由三部分组成:(此段转载自:http://blog.youkuaiyun.com/thm521888/article/details/53905928

1.默认配置

   getDefaultProguardFile('proguard-android.txt')  或者 getDefaultProguardFile('proguard-android-optimize.txt')
   该文件路径:
a.新版本:Starting with version 2.2 of the Android plugin for Gradle
路径:
/home/mth/code/github_demo/A/build/intermediates/proguard-files/proguard-android.txt-2.2.3
b.旧版本
路径:
/home/mth/Android/Sdk/tools/proguard/proguard-android.txt

2.自定义混淆文件

proguard-rules.pro 这个简单

3.特别注意(这个默认文件很坑)

路径:
./app/build/intermediates/proguard-rules/release/aapt_rules.txt
据说该文件是在初始化ProcessAndroidResources时候生成的


至于具体的文件混淆规则这里不说了,网上一堆,接下来就是混淆中遇到的一个问题:

Android studio混淆打包的时候一直失败,提示Warning:Exception while processing task Java.io.FileNotFoundException: D:\...\app\build\intermediates\proguard-rules\release\aapt_rules.txt (系统找不到指定的路径。)

即有一个混淆的文件找不到了,但是这个文件是系统生成的,那怎么办,我们只需要在菜单栏选择build --> Clean Project ,然后在build --> Make Project即可,然后就能在这个路径下找到这个aapt_rules.txt文件了,再次build apk就不会报错了哦(注意:混淆的是release)


最后科普一下build菜单下的这些功能的区别:

1.Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk。

2.Make Selected Modules:编译指定的Module,一般是自上次编译后Module下有更新的文件,不生成apk。

3.Clean Project:删除之前编译后的编译文件,并重新编译整个Project,比较花费时间,不生成apk。

4.Rebuild Project:先执行Clean操作,删除之前编译的编译文件和可执行文件,然后重新编译新的编译文件,不生成apk,这里效果其实跟Clean Project是一致的,这个不知道Google搞什么鬼~~

5.Build APK:前面4个选项都是编译,没有生成apk文件,如果想生成apk,需要点击Build APK。

6.Generate Signed APK:生成有签名的apk。

相关的混淆解析可以参考该文章:

http://www.jianshu.com/p/0202845db617

http://blog.youkuaiyun.com/lovexjyong/article/details/24652085

Java应用中,当遇到`java.io.FileNotFoundException: keystore.p12: open failed: EROFS (Read-only file system)`错误时,通常表明程序试图在只读文件系统中创建或写入文件。此问题常见于Android开发环境,也可能出现在其他使用受限文件系统的环境中。 ### 1. 确认目标路径的可写性 确保应用程序尝试访问的目录是可写的。在Android系统中,某些目录默认为只读,例如 `/system` 或者 `/data` 的某些子目录,除非明确授予写权限[^2]。可以通过以下方式检查和更改路径- **内部存储**:使用 `Context.getFilesDir()` 或 `Context.getCacheDir()` 获取应用私有目录,这些目录通常是可写的。 - **外部存储**:需要请求 `WRITE_EXTERNAL_STORAGE` 权限,并且用户必须授权该权限。从 Android 10 开始,推荐使用作用域存储(Scoped Storage)机制访问共享存储空间中的文件[^4]。 示例代码: ```java File file = new File(context.getFilesDir(), "keystore.p12"); if (!file.exists()) { try { boolean created = file.createNewFile(); if (!created) { // 处理文件创建失败的情况 } } catch (IOException e) { e.printStackTrace(); } } ``` ### 2. 检查文件路径拼接是否正确 路径拼接错误可能导致程序尝试访问一个不存在或不可写的路径。确保路径字符串正确无误,避免因拼接错误导致路径指向只读区域[^4]。 ### 3. 文件操作权限设置 确保应用程序具有对目标路径的写权限。在 Android 中,需要在 `AndroidManifest.xml` 中声明权限,并在运行时请求权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 运行时请求权限的代码片段: ```java if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` ### 4. 使用合适的文件存储位置 选择合适的文件存储位置可以避免很多问题。对于敏感数据如密钥库文件 `keystore.p12`,建议将其保存在应用私有目录中,这样可以减少权限问题并提高安全性[^2]。 ### 5. 调试与日志分析 启用详细的日志记录有助于定位问题。检查日志中是否有其他相关的异常信息,这可能会提供关于问题根源的更多线索[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值