美文网首页
Android工程常用配置和开发技巧

Android工程常用配置和开发技巧

作者: 蓝灰_q | 来源:发表于2017-03-21 18:26 被阅读160次

    Android工程经常需要做一些基本设置,如混淆、多版本、申请权限等,在这里做一下汇总,以便查阅。

    目录

    Android Studio中直接运行Java的main函数

    Android Studio的快捷代码(如psvm)

    Activity样式

    MultiDex

    混淆配置

    AIDL接口

    打包APK自动改名

    请求权限

    数据库

    多版本及开发测试

    在debug时使用正式签名

    一些好用的插件

    清理空间

    自定义属性

    一些有趣的小问题

    Android Studio中直接运行Java的main函数

    很多时候,我们只想验证某些纯Java的API,或验证某些语言特性,在Android端运行这种代码需要经历漫长的编译-安装-运行的过程,太慢,繁琐,我们可以在AndroidStudio中直接运行纯Java的main函数(不能含有Android的API),有两种方法可以做到。

    1.在Android工程中即可运行

    可以直接运行一个有main函数的Java文件。

    其实只要新建一个Java文件,然后屏蔽顶部的package即可:

    运行main

    注意只能处理纯Java类,虽然可以调用Android的各种类如Activity,但是运行时会报错,因为缺少各种环境。

    另外,这种用法有个缺陷:有点慢,会走gradle编译(permission:assemble debug),不过比编译App要好多了。

    2.在Java Library中运行

    这种做法稍微复杂,但可以运行一整个Module模块。

    具体需要先新建一个Java libaray的Module。

    新建Module 选择Java Library 设置Module的运行方式 添加Application

    然后配置运行方式去运行这个Module

    配置Main class

    配置时注意两点:

    1.选好Main class,一直选到class文件

    2.在Use classpath of module中,选择lib

    最后就可以像运行App那样去运行它了

    运行即可

    这种运行方式速度较快,而且是以Module为单位运行的,可以实现一些复杂的逻辑。

    参考:android studio编写运行java main的三种方法(亲测)

    Android Studio的快捷代码(如psvm)

    Android Studio脱胎于IntelliJ IDEA,后者支持通过特定字母组合打出特定代码段,大大加快我们写Bug(误)的速度,例如:

    psvm可以辅助打出main函数:

    psvm

    sout可以辅助打出print函数

    sout

    这些可以在setting中通过live templates配置

    配置live templates

    Activity样式

    Activity可以配置很多样式,例如可以隐藏顶部状态栏,不显示顶部状态栏即为全屏,有两种设置方式:

    1.在style.xml中定义一个样式,并在manifest文件中使用(针对整个app)。

    定义全屏样式 在manifest中设置theme

    2.在activity代码中设置属性(仅针对单个activity)。

    代码设置全屏

    MultiDex

    App打包的dex有函数数量上限,app越做越大,就很容易超限,需要配置为multidex,在打包时把一个dex拆分为多个,规避数量上限问题。

    google官方给出了配置方式,需要在gradle中引入multidex,并让app继承multidexapplilcation。

    在gradle中引用multidex 在gradle中启用multidex

    如果你的Application已经继承了其他的Applicatioin,你可以在你的Applicatioin里override一下attachBaseContext(),调用MultiDex.install(this)来支持multidex。

    继承multidexapplication

    (其实在Android里,很多情况下都需要你extend其他Application,这就限制了我们自己对Application的扩展方式,如果我们想自己抽象一些Application的行为,最好是使用接口和依赖注入方式去实现,这样耦合度低,容易扩展应用)

    在manifest文件中使用继承的multidexapplication

    混淆

    apk打包时都需要混淆,这可以防止别人根据你的apk安装包逆向读懂你的代码,注意是读懂,他还是能读到代码的,但是里面的变量和类名都会变成a、b、c这样毫无意义的东西。

    使用混淆的配置如下:

    在gradle中启用混淆 打开项目对应的proguard文件 制定混淆策略,说明哪些类不混淆

    AIDL

    AIDL跨进程通信是app间调用的手段,主要是通过引用接口和bind到serviceconnection实现的。

    引用对应的接口文件及其package 写一个serviceconnection去bind目标aidl 用intent去bindservice,需要传入aidl提供方约定的名称

    然后就可以通过serviceconnection去调用aidl接口中提供的函数了

    打包APK自动改名

    我们提交apk时,需要给apk文件改名字,加上版本号,生成日期等,以便沟通和管理,这个工作可以在gradle里配置一下,自动完成。

    打包apk时自动带上版本号和日期

    请求权限

    Android把权限分的很细,需要什么都需要在manifest文件中去配置

    配置权限

    但是Android现在对权限管理越来越严格了,很多权限不只需要manifest中配置,还需要用户打开app时手动确认,这需要在代码中动态检查和申请权限。

    动态检查和请求权限

    不止要申请权限,因为用户可能拒绝申请,所以还需要监听,在提出申请的Activity中,覆写指定函数,去监听用户的处理结果。

    监听用户对权限申请的处理 处理权限申请的结果

    数据库

    Android中有很多数据库可用,例如原始的SQLite,能自动生成数据库的GreenDao,最近很火性能不错的Realm等。

    这里先记录一下greendao的应用,首先在gradle中添加引用并配置生成策略,然后用注解的方式编写数据表的类文件,写完后build一下工程,greendao就会自动生成数据库相关文件

    引用greendao 在gradle中设置相关策略 注解编写数据表的类文件 编译项目后,自动生成数据库相关文件

    多版本及开发测试

    AS支持多版本发布,可以同时生成多个不同渠道的apk,不过速度不是很快。

    关于多渠道打包,可以参考《Gradle多渠道打包的原理、实践与辅助开发》

    个人更喜欢用多版本来方便开发,在mock版本中模拟各种数据,测试业务场景,同时不对prod正式版造成任何影响。

    配置过程如下:

    在gradle中定义多版本

    (多版本还可以帮助加速调试,你要为不同的版本配置不同的minSdkVersion,例如在开发的mock里设置minSdkVersion=21,这样在运行mock版本时编译速度更快)

    在project视图下,为各版本编写不同的内容 在build variants中,切换版本进行编辑调试

    搭好了多版本开发的基本架子,接下来就可以用多版本去辅助开发,例如,在mock开发版本中增加一个功能,即启动时清空数据库,同时prod正式版中没有这个特性。

    在所有版本中增加一个Mock专用的类

    可以在所有版本中增加一个类,启动时调用这个类的函数。

    调用mock类

    这个函数仅在mock版本中实现,在prod版本中,只是一个空函数,这样既能实现mock版本的特殊功能,又不会干扰到prod版本,最重要的是,发布前不需要改代码。

    在debug时使用正式签名

    按照一般的工程惯例,AS在开发时使用一个临时的apk签名,在release时使用另一个正式的签名,这样可以很好地把开发和发布区分开,也能很好地保护app产品。

    但是,在实际开发过程中,经常需要在debug时会使用正式签名,例如,联调第三方库,或者在已经安装了正式版的设备上调试app,这时如果使用临时apk签名的话,签名会被拒绝,无法调试。

    这时,我们可以通过gradle配置,在debug时使用正式签名,具体方法如下:

    在gradle里配置signingConfigs项

    注意,storefile这个参数里指向的路径,需要放一个正式签名的jks文件。

    在defaultConfig下,增加signingConfig项 在buildTypes下,分布为release和debug设置使用的签名

    这样,在debug时也可以使用正式的apk签名,可以更方便地去调试了。

    一定注意,在上线的时候要删除掉这个签名文件,并且注释掉这段话!

    一些好用的插件

    1.GsonFormat 在AS上使用

    可以方便地把json字符串映射为对应的Java数据对象

    2.JSONView 在Chrome上使用

    json字符串结构化显示

    3.Octotree 在Chrome上使用

    在github网站上能像在IDE一样查看源码

    4.Postman 在Chrome上使用

    监听和发起网络请求

    5.Advertising Terminator 在Chrome上使用

    屏蔽广告

    6.Click&Clean 在Chrome上使用

    分类查找和清理缓存

    更多插件见:吐血推荐珍藏的 Chrome 插件

    清理空间

    Android Studio长期运行下来,很容易积累起十多个G的垃圾数据,而且是在C盘,清理方法如下:

    打开C:\Users\{你的用户}\AppData\Local\Temp

    清空

    实际上,C:\Users\用户名\AppData里面一般有三个文件夹,分别是Local,LocalLow,Roaming,简单地来说,都是用来存放软件的配置文件和临时文件的,里面有很多以软件名称或软件公司命名的文件夹,理论上都可以删除。

    代码检查

    Android Studio提供了不错的Analyze工具,可以从代码级别自动帮你排查冗余、泄漏、SDK版本兼容等问题,平时可以多运行一下Analyze->Inspect Code

    自定义属性

    Android允许自定义控件属性,关键字declare-styleable,需要增加res/mystyle.xml文件,属性内容如下:

    自定义属性

    formate可以允许多种类型,如 format = "reference|color",就是既允许填引用@drawable/xxx,又允许直接填颜色值#00FF00

    如果某个attr是需要选择一个数据填入的,如 android:gravity="top",还需要定义flag <flag name="oldman"value="60" />

    declare-styleable中的name是为自定义控件的代码准备的,代码根据这个名字找到自定义属性:

    代码找到自定义的属性值

    在xml文件中引用时,需要写一个xml的命名空间,用来引用自定义的属性:

    xml命名空间

    然后,在下面的控件中,就可以根据命名空间levideoview来配置自定义参数了。

    更多内容可参考declare-styleable的使用(自定义控件) 以及declare-styleable中format详解

    一些有趣的小问题

    ·关于MAC中找不到SDK文件夹的问题

    需要在Users/用户名/ 这个文件夹下,右键,“查看显示选项”,勾选“显示资源库文件夹”,这样就可以看到用户目录下的Library文件夹,SDK的路径就在Library/Android/SDK中

    查看资源文件夹

    ·MAC中使用adb的问题

    Mac装完AS后,不能直接使用adb,会报无效命令,需要步骤如下

    1.打开终端,如下命令:

    yourMacBook-Pro:~ you$ echo $HOME

    /Users/you

    yourMacBook-Pro:~ you$ touch .bash_profile

    yourMacBook-Pro:~ you$ open -e .bash_profile

    打开bash文件

    2.bash文件默认为空,在文件中填写你的Android SDK的tools地址,然后保存文件

    export PATH=${PATH}:/Users/you/Library/Android/sdk/platform-tools:/Users/you/Library/Android/sdk/tools

    3.回到终端,刷新bash

    yourMacBook-Pro:~ you$ source .bash_profile

    搞定,可以用adb了

    ·关于MAC中配置API Source的问题

    默认情况下,查看Android API部分的源码,只能看到函数的参数和范围,看不到代码细节,需要配置API Source源码。

    最简单的做法是,在弹出的提示框中,选择download:

    下载API源码

    然后关闭AS再重新打开即可。

    ·关于R中的String换行问题

    1.对齐问题

    我们知道,R中定义String换行,都要用\n,例如XXX\nYYY,就会把X和Y分成两行去输出

    不过,我们会发现,为了阅读方便,我们更习惯在string.xml中这样定义:

    XXX\n

    YYY

    乍看起来没有问题,但如果你把这样的String输出到界面上,你会发现,这两行

    没对齐!

    第二行YYY前面多了半个空字符。

    如果把\n放到第二行呢?

    XXX

    \nYYY

    这次对齐了!实际上,你把TextView的边框画出来,做个对比,就会发现,手动换行产生的那个空字符,换到了XXX的末尾,只不过平时看不出来罢了

    2.\n变\\n问题

    前后台交互时、用Intent传数据时,经常会发现\n被转义成了\\n,而且是各种环境自动转的。

    所以,在收到传送来的\n时,先检查一下有没有\\n是一种什么行为?

    是一种受惯了伤害,形成条件反射的行为啊。

    ·编译时在style里应用了Theme.AppCompat.Light.DarkActionBar,出现No resource found that matches the given name的问题

    因为这个主题实在appcomat v7里引用的,如果你的app版本较低(最低兼容版本),就需要显式地引用appcompat v7,在gradle里添加compile'com.android.support:appcompat-v7:23.4.0'

    即可解决问题

    相关文章

      网友评论

          本文标题:Android工程常用配置和开发技巧

          本文链接:https://www.haomeiwen.com/subject/oeesmttx.html