您的位置:首页 > 移动开发 > Android开发

android manifest和gradle配置的部分详解

2017-02-20 16:38 351 查看
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xin.futureark">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!--
manifest层:
package:应用的包名, 当使用setComponent打开另一个app的界面或组件时,需要填写的;
xmlns:android="http://schemas.android.com/apk/res/android":命名空间的声明,使得各种Android系统级的属性能让我们使用。当我们需要使用自定义属性时,可以将其修改为res-auto,编译时会为我们自动去找到该自定义属性;
android:sharedUserId="android.uid.system":将当前应用进程设置为系统级进程,拥有此属性后,我们的应用就可以无视用户,无法无天地处理很多事情,比如擅自修改手机system分区的内容、静默安装等;
uses-permission:权限声明,也可以声明自定义的权限;
android:installLocation="auto"|"internalOnly"|"preferExternal":安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal
选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)
选择auto,系统将会根据存储空间自己去适应
选择internalOnly是指必须安装到内部才能运行
(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)
-->
<!--
application层:
android:theme:当前应用的每个界面都默认设置一个主题,可以后续在activity标签层单独覆盖此Theme;
allowBackup:关闭应用程序数据的备份和恢复功能,注意该属性值默认为true;[建议false]
hardwareAccelerated:开启硬件加速,一般应用不推介使用。就算非要使用也最好在某个Activity单独开启,避免过大的内存开销;
taskAffinity:设置Activity任务栈的名称,可忽略;
supportsRtl:是否愿意支持从右到左(原来RTL就是right-to-left 的缩写...)的布局;4.2以上默认为true;
android:process="":应用程序运行的进程名,它的默认值为<manifest>元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候
android:taskAffinity:拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是<manifest>元素中设定的package名

-->
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name=".app.Myapp"
android:theme="@style/AppTheme">
<activity
android:name=".ui.MainActivity"

android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!--
activity层:
android:configChanges="orientation|screenSize|fontScale":当界面大小,方向,字体等config参数改变时,Activity就会重新执行onCreate的生命周期。而当设置此属性后,就可以强制让Activity不重新启动,而是只会调用一次onConfigurationChanged方法,所以可以在这里做一些相关参数改变的操作;
android:exported="true":将当前组件暴露给外部。属性决定它是否可以被另一个Application的组件启动;
android:process:设置Activ
d78d
ity所启动的进程;
android:launchMode ="singleInstance":启动模式;
excludeFromRecents:设置为true后,当用户按了“最近任务列表”时候,该activity不会出现在最近任务列表中,可达到隐藏应用的目的。
android:windowSoftInputMode:activity中打开软件盘的模式;文章最后有介绍
android:clearTaskOnLaunch="false|true":比如A是 activity,B是被A触发的activity, 然后返回Home, 重新启动A,是否显示B界面;
android:exported="true":是否可被显示在最近打开的activity列表里,默认是false;
android:finishOnTaskLaunch="false":当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false
android:multiprocess="false":是否允许多进程,默认是false
android:stateNotNeeded="false":activity被销毁或者成功重启时是否保存状态

-->
<!--
receiver层:
android:permission="com.android.settings.permission.SWITH_SETTING":这是receiver中处理一些操作需要使用到此权限,后来查阅资料后发现是通过在</receiver>中添加permission标签,我可以发送一些敏感的广播,只有添加了该permission的receiver才能接收到,而不让其他的应用收到;
-->
<!--provider层contentProvider(数据存储)
<provider
android:authorities="list"
android:name="String"
android:enabled="true"
android:exported="true"
android:grantUriPermissions="true"
android:icon=""
android:initOrder="integer"
android:label="String Resource"
android:multiprocess="true"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable="true"
android:writePermission="string">
authorities:标识这个ContentProvider,调用者可以根据这个标识来找到它
grantUriPermission:对某个URI授予的权限
initOrder:这个属性用于定义内容提供器应该被实例化的顺序,这个顺序是相对与相同进程所拥有的其他内容提供器的。当内容提供器间有相互的依赖时,就需要设置这个属性,以确保它们能够按照其依赖的顺序被创建。这个属性值是一个简单的整数,大的数字要被优先初始化。
multiprocess:这个属性用于设定是否能够在每个使用该内容提供器的客户端进程中都创建一个内容提供器的实例,如果设置为true,这个能够在其每个客户端进程中创建一个实例,否则不可以。默认值是false。通常,内容提供器是在定义它的应用程序的进程中被实例化的。但是,如果这个属性被设置为true,系统就能够在每个要与该内容提供器进行交互的客户端进程中创建一个内容提供器的实例,这样就避免了进程间通信的开销。
permission:这个属性用于设定客户端在读写内容提供器的数据时必须要有的权限的名称。这个属性为同时设置读写权限提供了一种便利的方法。但是readPermission和writePermission属性的优先级要比这个属性高。如果readPermission属性也被设置了,那么它就会控制对内容提供器的查询访问。如果writePermission属性被设置,它就会控制对内容提供器数据的修改访问。
android:process:这个属性用于定义内容提供器应该运行在那个进程中的进程名称。通常,应用程序的所有组件都运行在给应用程序创建的默认进程中。它有与应用程序包相同的名称。<application>元素的process属性能够给其所有的组件设置一个不同的默认进程。但是每个组件都能够用它们自己的process属性来覆盖这个默认设置,从而允许把应用程序分离到不同的多个进程中。
如果这个属性值是用“:”开头的,那么在需要这个提供器的时候,系统就会给这个应用程序创建一个新的私有进程,并且对应的Activity也要运行在那个私有进程中。如果用小写字母开头,那么Activity则会运行在一个用这个属性值命名的全局进程中,它提供了对内容提供器的访问权限。这样就允许不同应用程序的组件能够共享这个进程,从而减少对系统资源的使用。
android:readPermission:这个属性用于设置查询内容提供器的数据时,客户端所必须要有的权限。
android:syncable:个属性用于设定内容提供器控制下的数据是否要与服务器上的数据进行同步,如果设置为true,则要同步,否则不需要同步。
writePermission:这个属性用于设置修改内容提供器的数据时,客户端所必须要有的权限。
</provider>
-->
<activity android:name=".base.BaseActivity">
</activity>
</application>
<!--这是在android1.6以后的新特性,支持多屏幕机制
<supports-screens
android:smallScreens="true"是否支持大屏
android:normalScreens="true"是否支持中屏
android:largeScreens="true"是否支持小屏
android:anyDensity="true">是否支持多种不同的密度
</supports-screens>
-->

<!--这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。
<uses-configuration
android:reqFiveWayNav="true"
android:reqHardKeyboard="true"
android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" |   "twelvekey"]
android:reqNavigation=["undefined" | "nonav" | "dpad" |  "trackball" | "wheel"]
android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"]>
</uses-configuration>
<uses-feature android:glEsVersion="integer"
android:name="string"
android:required=["true" | "false"] />
-->
</manifest>
build.gradle:
apply plugin: 'com.android.application'//作为主程序的标识
apply plugin: 'com.neenbedankt.android-apt'
//apply plugin 声明了接下来要用到哪些插件的内容,上图表明使用了 androd 插件,这里之所以能用 android 插件,
// 是因为主目录中声明了 Gradle for Android 的依赖,这里才能使用。

android {
compileSdkVersion 25//当前向前兼容sdk的版本
buildToolsVersion "25.0.2"//构建工具的版本

//defaultConfig 代码块用于配置应用的默认属性,可以覆盖 AndroidManifest.xml 中的属性
defaultConfig {
applicationId "xin.futureark"   //应用程序的id,在市场上使用的包名
minSdkVersion 15                //最小sdk版本支持
targetSdkVersion 25             //目标sdk版本
versionCode 1                   //应用程序版本号
versionName "1.0"               //应用程序版本名称
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false   //混淆是否开启
//混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
//启用zipAlign
//zipAlignEnabled true
//zipalign:是一款重要的优化apk应用程序的工具。
//apk包的本质是一个zip压缩文档,优化的目的是使包内未压缩的数据能够有序的排列,从而减少应用程序运行时的内存消耗.

//它允许我们动态替换我们在AndroidManifest文件里定义的占位符
//manifestPlaceholders = [umeng_app_key: "替代的内容",umeng_app_secret:"替换的内容"]
}
// 配置签名
signingConfigs{
release {
storeFile file("C:\\Users\\Admin\\Desktop\\keystore\\key.jks")
storePassword "123456"
keyAlias "key"
keyPassword "12345678"
}
}
//dex多分包
//    一些在二级Dex加载之前,可能会被调用到的类(比如静态变量的类),需要放在主Dex中.
// 否则会ClassNotFoundError. 通过修改Gradle,可以显式的把一些类放在Main Dex中.
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
// 设置multidex.keep文件中class为第一个dex文件中包含的class,如果没有下一项设置此项无作用
dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
//此项添加后第一个classes.dex文件只能包含-main-dex-list列表中class
dx.additionalParameters += '--minimal-main-dex'
}
}
}

dependencies {
//依赖外部的类库
compile fileTree(include: ['*.jar'], dir: 'libs')//编译本地 jar 包
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support:multidex:1.0.0'
}


Android:windowSoftInputMode:设置窗口软键盘的交互模式
stateUnspecified:如果界面上有需要获取焦点的,键盘不一定弹出,如果有滑动(如ScrollView) 就会弹出键盘;

stateUnchanged状态不改变:假如当前界面键盘是隐藏的,那么跳转之后的界面,软键盘也是隐藏的;如果当前界面是显示的,那么跳转之后的界面,软键盘也是显示状态。

stateHidden:键盘状态一定是隐藏,不管上个界面什么状态,也不管当前界面有没有输入的需求。因此,可以设置这个属性,来控制软键盘不自动的弹出;

stateAlwaysHidden:让软键盘隐藏 暂时不明确;

stateVisible:可以将软键盘召唤出来,即使在界面上没有输入框的情况下也可以强制召唤出来。

stateAlwaysVisible:与stateVisible属性有小小的不同,[stateVisible:跳到下个界面键盘是隐藏的,跳回来也是隐藏的

stateAlwaysVisible:跳到下个界面键盘是显示的,跳回来也是;]

adjustUnspecified默认:系统会根据界面选择不同的模式。如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以
滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。如果布局里面没有滚动的控件,那么软键盘可能
就会盖住一些内容; 布局里面有滑动控件,系统会自动的缩小整个界面的大小

adjustResize:这个属性表示Activity的主窗口总是会被调整大小,从而保证软键盘显示空间。 对于没有滑动控件的布局

adjustPan:屏幕大小并不会调整来保证软键盘的空间,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进
输入的输入框肯定在用户的失业范围里面,从而让用户可以看到自己输入的内容。对于没有滚动控件的布局来说,这个其实就是
默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。但是对于有滚动控件的布局来说,则不太一样;





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: