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

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即可:

 

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

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

2.在Java Library中运行

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

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

选择Java Library

设置Module的运行方式

添加Application

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

配置时注意两点:

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函数:

sout可以辅助打出print函数

这些可以在setting中通过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

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

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

混淆

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

使用混淆的配置如下:

打开项目对应的proguard文件

制定混淆策略,说明哪些类不混淆

AIDL

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

写一个serviceconnection去bind目标aidl

用intent去bindservice,需要传入aidl提供方约定的名称

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

打包APK自动改名

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

请求权限

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

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

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

处理权限申请的结果

数据库

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

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

在gradle中设置相关策略

注解编写数据表的类文件

编译项目后,自动生成数据库相关文件

多版本及开发测试

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

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

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

配置过程如下:

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

在build variants中,切换版本进行编辑调试

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

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

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

在debug时使用正式签名

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

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

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

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

在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的命名空间,用来引用自定义的属性:

然后,在下面的控件中,就可以根据命名空间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'

即可解决问题



 

猜你喜欢

转载自blog.csdn.net/feiyu1947/article/details/86526335