欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

正确配置你的 Android 项目

程序员文章站 2022-06-25 09:43:08
gitignore当你新建 Android 项目时,默认会生成 gitignore 文件,但并没有包含所有必要的规则。这里推荐大家使用 gitignore.io网站,只需要输入关键字,比如 Android, Intellij 再点击按钮,就能得到一个标准的 gitignore 文件啦。tools folder如果你的项目有很多的第三方脚本,规则列表或其他的文件,不要随意的将它们放在 root 目录下,新建一个 tools 文件夹,把它们都放在里面。通常你可以放入自定义的 gradle 脚本文件,...

gitignore

当你新建 Android 项目时,默认会生成 gitignore 文件,但并没有包含所有必要的规则。这里推荐大家使用 gitignore.io网站,只需要输入关键字,比如 Android, Intellij 再点击按钮,就能得到一个标准的 gitignore 文件啦。
正确配置你的 Android 项目

tools folder

如果你的项目有很多的第三方脚本,规则列表或其他的文件,不要随意的将它们放在 root 目录下,新建一个 tools 文件夹,把它们都放在里面。

通常你可以放入自定义的 gradle 脚本文件,proguard 规则和静态代码分析工具,例如:pmd, findbugs, lint。
正确配置你的 Android 项目

flavors

Flavors 用来实现多渠道打包,通常分为 dev 和 prod 两个 flavor:

productFlavors {
    dev {
        signingConfig signingConfigs.debug
        versionCode gitVersionCodeTime
        versionName gitVersionName
    }

    prod {
        signingConfig signingConfigs.release
        versionCode gitVersionCode
        versionName gitVersionName
    }
}

keystore

当你通过 Android Studio 运行或 debugging 你的项目时,Android Studio 会通过 Android SDK tools 自动生成 debug keystore 为你的应用签名。

但使用默认的 debug keystore 会有下面几个问题:

  • 有效期 365 天
  • 从不同计算机上安装应用程序需要先卸载
  • google 服务需要 keystore 的 SHA-1 fingerprint

所以,建议开发者自己生成 debug keystore 并提交到版本控制系统中。

signingConfigs {
   debug {
       keyAlias 'androiddebugkey'
       keyPassword 'android'
       storePassword 'android'
       storeFile file('../keystore/debug.keystore')
   }
   release {
       ...
   }
} 

proguard

Android proguard 主要有三个用途:

  • 消除未使用的代码 - 帮助你避免 64k 限制
  • 优化代码和 APK
  • 模糊代码 - 让 APK 难以被逆向工程

但是代码混淆和优化显著增加了编译的时间,不利于平时的开发调试。这也是为什么推荐针对 release 和 debug 使用不同的 proguard 规则。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                "$project.rootDir/tools/rules-proguard.pro"
        signingConfig signingConfigs.release
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                "$project.rootDir/tools/rules-proguard-debug.pro"
        signingConfig signingConfigs.debug
    }
}

对于用于 debug 的 proguard 文件,需要加上以下规则来强制 proguard 忽略掉警告、代码混淆和优化:

# Add project specific ProGuard rules here.
-dontobfuscate
-dontoptimize
-ignorewarnings

对于 release 的 proguard 文件设置规则就比较复杂了,因为几乎每一个库都有自己独特的规则。这里推荐一个开源项目:android-proguard-snippets,里面包含了几乎所有主流库的 proguard 规则。


strict mode

Android StrictMode能帮助开发者检测应用中可能出现的多种问题:

  • 可关闭的对象没有关闭
  • 在主线程中执行了文件读取或网络请求
  • URI 暴露

这里建议开发者在 debug build 时通过 detectAll 方法检测所有类型的问题:

if (BuildConfig.DEBUG) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());
}

像是忘记关闭 SQLiteCursor 这类问题出现时,日志中就会有提示:

StrictMode: 
A resource was acquired at attached stack trace but never released. 
See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
        at dalvik.system.CloseGuard.open(CloseGuard.java:184)
        at android.database.CursorWindow.<init>(CursorWindow.java:111)
        at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
        at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139)
        at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
        at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
        at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
        at com.dd.template.MainActivity.onCreate(MainActivity.java:124)

本文地址:https://blog.csdn.net/yangxu4536/article/details/107938702

相关标签: Android