精华内容
下载资源
问答
  • android-tech-docs:Android官方技术文档翻译
  • android-tech-docs, Android官方技术文档翻译
  • Moses技术文档,了解翻译转换过程。Moses技术文档,了解翻译转换过程。
  • 各种英文技术文档翻译,以学习新技术、锻炼英文以及节约阅读时间为目的。 原文均以官方文档为准。 由于英文水平有限,翻译难免出现问题和译文生硬,望见谅。 欢迎大鸟批评指教。欢迎大家共同学习与研究。
  • android官方技术文档翻译——aar 格式

    千次阅读 2014-11-28 23:22:37
    本文译自androd官方技术文档《AAR Format》,原文地址:http://tools.android.com/tech-docs/new-build-system/aar-format。 本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41574853。转载请注明...

    本文译自androd官方技术文档《AAR Format》,原文地址:http://tools.android.com/tech-docs/new-build-system/aar-format

    本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41578499。转载请注明出处。翻译如有错讹,敬请指正。




    AAR 格式

    “aar”包是 Android 的类库项目的二进制发行包。

    文件扩展名是 .aar,maven 项目类型应该也是 aar,但文件本身是带有以下各项的 zip 文件:
    • /AndroidManifest.xml (mandatory)
    • /classes.jar (mandatory)
    • /res/ (mandatory)
    • /R.txt (mandatory)
    • /assets/ (optional)
    • /libs/*.jar (optional)
    • /jni/<abi>/*.so (optional)
    • /proguard.txt (optional)
    • /lint.jar (optional)
    这些条目是直接位 zip 文件根目录的。

    R.txt 文件是 aapt带参数 --output-text-symbols的输出结果。

    展开全文
  • Android官方技术文档翻译——清单合并

    万次阅读 多人点赞 2015-01-13 09:12:43
    本文译自Android官方技术文档《 Manifest Merger 》,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger。 翻译不易,转载请注明CSDN博客上的出处: ...

    本文译自Android官方技术文档《Manifest Merger》,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger。

    翻译不易,转载请注明CSDN博客上的出处:

    http://blog.csdn.net/maosidiaoxian/article/details/42671999

    翻译工作耗时费神,如果你觉得本文翻译得还OK,请点击文末的“顶”;如有错讹,敬请指正。谢谢。


    清单合并


    本文档主要介绍新的清单合并工具。

    这个新的合并工具是gradle android 插件的 0.10 版中引入的。截至 0.11 版本,该 gradle 插件默认情况下都是使用此合并工具。

    如果想恢复使用旧的清单合并工具,可以在你的 build.gradle 中添加以下配置:

    android {
    useOldManifestMerger true
    }

    Manifest 文件排序


    一般情况下,有三种类型的清单文件需要合并成一个最终的应用程序清单,这里按照优先级顺序列出:

    1. Product flavors 和构建类型所指定的清单文件。

    2. 应用程序的主清单文件。

    3. 类库的清单文件。


    第一种类型的清单文件通常会重写清单的内容,因为它专门提供用于特定的交付的应用程序。然后,第三种类型的清单文件通常会被合并入上一步产生的主清单中。合并的规则取决于每个节点类型,可以使用“tools:”命名空间属性来更改。


    由于多个product flavors和构建类型,这些清单文件合并的结果的组合可能会是一个矩阵。然而,对于每一个组装的步骤,每一个flavor group和构建类型的值都只能选择一个,导致出现了潜伏的覆盖主清单文件的清单文件的排序列表。


    例如,下面的 FlavorGroups: abi,density,API,Prod/Internal 导致形成了以下可能的flavors的矩阵:



    ABI

    Density

    API

    Prod/Internal

    x86

    mdpi

    9

    prod

    arm

    high

    14

    internal

    mips

    xhigh

    15

     
     

    xxhigh

      

    这样就形成了3x4x3x2 种可能的组合。然而,对于每一次执行组装,只能是一个group里的falvor,定义在原始的 build.gradle 的flavor group 的属性形成了一个可能要合并的清单 文件的列表,并且这个列表由高优先级到低优先级排序。


    例如,构建 x86-high-15-prod 的 variant ,会查找以下的清单文件以进行合并

    1. x86/AndroidManifest.xml

    2. high/AndroidManifest.xml

    3. 15/AndroidManifest.xml

    4. internal/AndroidManifest.xml


    在这个有序列表中,每个文件根据其在列表中的顺序都有一个优先级,合并工具将使用这个优先级来决定哪个XML元素或属性将覆盖一个较低优先级的设置。


    因此,合并工具的输入将如下:

    • 由flavor或编译类型的清单文件按优先级组成的有序列表,这些会被经常引用作为 flavors的清单。

    • 主清单文件

    • 由一些类库声明(或依赖传递而有的)的清单文件组成的有序列表。

    • 用于占位符和XML产生的注入值

    Android 清单文件合并


    在一个清单文件中的每个元素都可以根据它的元素类型(比如activity,intent-filter)和一个可选的键值(key value)来识别。一些元素,如“activity”,必须有一个key,因为在一个Andr​​oidManifest.xml中可能存在多个这样的元素。其他的元素,像“application”,就不要求一定要有一个key,因为只能有一个这样的元素。


    元素的类型和键值对代表了一个清单元素的身份。


    合并的activity的始终是两个相同类型的元素之间,一个来自更高优先级的清单文件,一个来自较低优先级的清单文件。每一个合并的activity都有一个默认的行为,这一点将在随后进行描述。此外,在节点或一个指定的属性上的每个默认合并的activity都可能会被including工具的指定标记所覆盖。


    合并过程中还会把对每一个节点的合并结果记录下来,这将在“日志”章节描述。

    元素和属性的合并过程

    隐式声明

    一些属性都会有默认值(默认定义在在线 文档中)。当一个较高优先级的元素没有定义默认值为X的属性时,如果一个较低优先级的元素也恰好定义了一个值同样是X的属性,那么这个属性仍然会被添加到合并的元素中 (当然它的值是X), 因为它表示了类库对这个属性的值的一个明确的选择,从而不去考虑把默认值作为它的值,而是为某特性设置一个正确的值(以防默认值发生改变)。


    大多数有默认值的属性,如果在低优先级的属性中已经定义了值,那么默认值将被manifest合并工具忽略;定义的值会被合并,因为在默认值 和一个设置的值之间,并没有冲突。在生成的合并的元素中,这个属性会被设置为设定的值。


    然而,下面列出的几种情况例外:


    <uses-feature android:required>

    默认值为 true。在与其他属性合并时,将使用“或”的合并策略。这时因为如果任何一个库需要该特性,那么生成的应用程序也将需要此特性。

    <uses-library android:required>

    同 uses-feature:required。

    <uses-sdk android:minSdkVersion>

    默认值为 1。

    将使用更高优先级文件的版本,但导入一个较新版本的库时将会产生错误。      

    <uses-sdk android:maxSdkVersion>

    同 uses-sdk:minSdkVersion

    <uses-sdk android:targetSdkVersion>

    同 uses-sdk:minSdkVersion


    自动升级

    当导入一个target SDK 版本比项目低的库时,它可能需要显式声明地授予权限 (可能还需要进行其他更改),以使得类库在以后运行时能正常运行。这将由清单合并工具自动进行。

    占位符支持

    当属性值包含一个占位符 (见下面的格式)时,合并工具将把此占位符的值换成一个注入的值。注入的值是在build.gradle里面定义的。

    占位符值的语法是 ${name},因为@符号已经预留给了链接。在最后的文件合并发生之后,并且生成合并后的 android 的清单文件输出之前,带有占位符的所有值将都会被替换为注入的值。如果变量名是未知的,将导致构建失败。


    占位符字符串可以有一个前缀或后缀,以实现只替换部分的内容。


    示例:


    android:authority="${applicationId}.foo"

    android:authority=”com.acme.${localApplicationId}”

    android:authority=”com.acme.${localApplicationId}.foo”


    隐式占位符 ${applicationId} 的值将由现有的build.gradle的 applicationId值自动提供。


    示例:


    <activity

    android:name=".Main">

        <intent-filter>

        <action android:name="${applicationId}.foo">

            </action>

    </intent-filter>

    </activity>


    通过以下的gradle的声明:


    android {

       compileSdkVersion 19

       buildToolsVersion "19.0.2"


       productFlavors {

           flavor1 {

               applicationId = "com.android.tests.flavorlib.app.flavor1"

           }

    }


    一旦合并,<action android:name> 将会是

    <action android:name=“com.android.tests.flavorlib.app.flavor1.foo”>


    对于自定义的占位符替换,可以使用以下的 DSL 来配置占位符的值:


    android { defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } productFlavors { free { } pro { manifestPlaceholders = [ activityLabel:"proName" ] } }


    它将替换下面声明中的占位符:
    <activity android:name=".MainActivity" android:label="${activityLabel}" >

    合并策略的常见描述


    XML的合并可能是在节点级别上的合并,也可能是在属性级别上的合并。


    在节点级别上,默认的合并策略是,只要没有冲突就合并属性和子元素。当两个相同标识的元素具有相同的属性,并且属性的值不同时,就会出现冲突。


    举个例子:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@theme1”/>


    与下面的声明进行合并时不会产生冲突:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation=”landscape/>


    同样

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@theme1”/>


    与下面的声明合并时也不会产生冲突,因为在这两个元素中都定义的"theme"属性具有相同的值。

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme="@theme1"

    android:screenOrientation=”landscape/>


    但是,

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@theme1”/>


    与下面的声明合并时就会产生冲突,因为在这两个元素中定义的"theme"属性的值并不相同。

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@theme2”

    android:screenOrientation=”landscape/>


    现在,每个元素都可以有子元素和规则,用于匹配那些将遵循同样的基本原则的属性,它们具有相同标识的子元素将匹配在一起。如果一个子元素仅存在于其中一个父元素,并不会冲突。


    标记


    标记是在工具(tools)命名空间中的一个特别的属性,用来描述对如何解决冲突所采取的决定。


    所有标记都属于 Android 工具命名空间,因此您必须包含至少一个标记的任何 AndroidManifest.xml 中声明该命名空间:

    xmlns:tools="http://schemas.android.com/tools"


    示例:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.android.tests.flavorlib.app"

       xmlns:tools="http://schemas.android.com/tools">


       <application

           android:icon="@drawable/icon"

           android:label="@string/app_name"

           tools:replace=”icon, label”/>

    </manifest>


    当要合并的元素之间存在冲突时,必须显式添加一些标记来指导清单合并工具(Manifest Marger)。在节点级别,应使用 tools:node 属性,在属性级别,应使用 tools:attr 属性。


    tools:node 标记


    当一个节点存在冲突并且需要解决时,就应该要有一个 tools:node="maker_value" 的属性存在。  


    <tools:node> 属性值

    清单合并工具的行为

    <tools:node="merge">

    这是节点合并的隐式的默认模式,节点只要不冲突就会被合并。

    <tools:node="replace">

    用注解的那一个替换低优先级的声明。

    <tools:node="strict">

    当另一个具有相同标识的节点存在并且不是严格相等时,将导致构建失败。

    <tools:node="merge-only-attributes">

    只合并较低优先级的声明中的属性。

    <tools:node="remove">

    从生成的 XML 中删除所注解的元素。不论是否可能冲突,低优先级的声明都不会被合并进去。

    <tools:node="removeAll">

    移除所有相同节点类型(不是关键必须的)的元素 。


    tools:attr 标记


    在任何特别的元素中,可能会有许多与标记相关的属性,用于解决所有属性的冲突问题。


    <tools:strict=”x, y, z”>

    属性默认的隐式模式,会在当尝试合并有不同值的低优先级属性声明时产生错误。

    <tools:remove=”x, y, z”>

    当合并时,从任何较低优先级的声明中删除 x、 y、 z 属性。

    <tools:replace=”x, y, z”>

    把任何低优先级声明的x,y,z属性的值替换为所提供的值(必须是在同一节点上)。


    选择器


    每一个 tools:node 或 tools:attr 声明都可以通过一个 tools:selector 的属性进行扩展,这个属性是合并策略是否应该被应用到当前的低优先级的 XML 的描述的上下文信息。例如,当仅在一个特定的库,而不是任何的库,才需要删除一个权限时,它会非常有用:


       <permission

             android:name="permissionOne"

             tools:node="remove"

             tools:selector="com.example.lib1">

    tools:overrideLibrary 标记

    这是一个特殊的标记,仅与use-sdk的声明一起使用,用于在导入的库的最小SDK版本比应用程序的最小SDK版本还要新时,对这个库是否导入进行重写。
    如果没有这样的标志,清单合并就会失败。这个标记将允许用户忽略最低的SDK版本而选择哪些库可以被导入。 

    例如,在main android 清单中: 
    <uses-sdk android:targetSdkVersion="14" android:minSdkVersion="2"

    tools:overrideLibrary="com.example.lib1, com.example.lib2"/>


    将允许具有以下清单的库被导入而不出错: 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

            package="com.example.lib1">        <uses-sdk android:minSdkVersion="4" />    </manifest>

    日志


    在清单合并期间的每个操作或决策都需要是

    • 被记录的

    • 枨式化以让计算机能够解析的

    • 按节点排序的 (因为一个节点的多个属性可能会产生好几种合并决定)


    日志记录不会被组织为最终产生输出文件的事件和决策的线性集合。相反,为了方便开发人员,日志文件将按输入文件中发生冲突的顶级XML节点来进行组织 (无论当我们想想文件的节点删除的时候,它是否存在 于输出文件中)。

    日志记录:


    一个日志记录既是一个节点记录 (描述在该特定节点上采取的所有操作),也是一个包含错误消息和警告的消息记录。


    日志文件 = 日志记录*

    日志记录 = 节点记录 | 消息

    消息

    消息=文件:行号:列号 严重性:\n描述

    描述=(\t内容\n)*


    名称

    file

    生成日志条目的输入文件

    line-number

    生成日志条目的输入的文件行号

    column-number

    生成日志条目的输入文件列号

    严重性

    Error, Warning, Info

    description

    日志条目有效载荷(译者注:有效载荷即记载着信息的那部分数据)


    示例


    /Users/jedo/src/app/src/main/AndroidManifest.xml:3:9 Error:

    Attribute activity@screenOrientation value=(portrait) from AndroidManifest.xml:3:9

    is also present at flavorlib:lib1:unspecified:3:18 value=(landscape)

    Suggestion: add 'tools:replace="icon"' to <activity> element at AndroidManifest.xml:1:5 to override

    节点记录


    名称

    node-type

    XML 节点类型

    node-key

    节点的键的属性值

    record-type

    [Action |Log ] *


    node-type#node-key\n

    \t(node_action:Action)*

    \t\t(attribute_action:Action)*

    操作格式

    名称

    action-type

    added | rejected | implied

    target

    node | attribute

    target-name

    节点的键名称或属性名称

    origin

    原始值的位置

    示例:

    application

    ADDED from AndroidManifest.xml:10:5

    MERGED from flavorlib:lib2:unspecified:3:5

    android:label

    ADDED from AndroidManifest.xml:12:9

    REJECTED from flavorlib:lib2:unspecified:3:55

    android:icon

    ADDED from AndroidManifest.xml:11:9

    REJECTED from flavorlib:lib2:unspecified:3:18



    receiver#com.example.WidgetReceiver

    ADDED from ManifestMerger2Test0_main.xml:60:9

    android:labelADDED from ManifestMerger2Test0_main.xml:61:13

    android:iconADDED from ManifestMerger2Test0_main.xml:62:13

    android:nameADDED from ManifestMerger2Test0_main.xml:63:13

    构建错误


    当发生构建错误时,则应显示特定节点失败的日志,并在后面有一段向用户描述的错误消息。举个例子:


    更高优先级的声明

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation="portrait"

    android:theme=”@theme1”/>


    和一个较低优先级的声明:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation=”landscape/>


    会同时产生日志文件和输出结果(能让人类,计算机以及IDE都能识别的确切格式还未确定)。


    /Users/jedo/src/app/src/main/AndroidManifest.xml:3:9 Error:

    Attribute activity@screenOrientation value=(portrait) from AndroidManifest.xml:3:9

    is also present at flavorlib:lib1:unspecified:3:18 value=(landscape)

    Suggestion: add 'tools:replace="icon"' to <activity> element at AndroidManifest.xml:1:5 to override


    Blame

    通过元素或属性所在的一些指示,可以获取一个“blame”类型的输出,以限制合并的XML中产生的每一个元素和属性。

    合并策略


    每个元素类型都有一特定的默认合并策略附属于它。例如,大部分的元素类型,像activity或application都有一个默认合并策略,这个策略是所有属性和子元素都会被合并(假设没有冲突)到所生产的元素当中。不过,其他元素,如顶级的manifest,默认合并策略是只合并子元素。这意味着较低优先级的 AndroidManifest.xml 的manifest 元素的属性都没有资格能够合并进去。


    每个元素也可以拥有或不拥有一个与它关联的键。例如,application没有键,在每一个 AndroidManifest.xml 中只能有一个 <application>元素。 大部分带键的元素都使用“ android:name 属性”来表示它们的键值,或其他内容等

    合并

    没有冲突的属性会被合并,子元素也会依据它们各自的合并策略进行合并。

    只合并子元素

    属性不会被合并,只有子元素会根据它们各自的合并政策进行合并。

    总是合并

    始终保持元素的“原样”,并添加到生成的合并文件里的共同的父元素中。


    元素合并策略和键的列表


    节点类型

    合并策略

    action

    合并

    android:name 属性

    activity

    合并

    android:name 属性

    application

    合并

    没有键

    category

    合并

    android:name 属性

    data

    合并

    没有键

    grant-uri-permission

    合并

    没有键

    instrumentation

    合并

    android:name 属性

    intent-filter

    总是合并

    子元素的action和categories android: name attribute。允许相同的键有多个声明。

    manifest

    只合并子元素

    没有键

    meta-data

    合并

    android:name 属性

    path-permission

    合并

    没有键

    permission-group

    合并

    android:name 属性

    permission

    合并

    android:name 属性

    permission-tree

    合并

    android:name 属性

    provider

    合并

    android:name 属性

    receiver

    合并

    android:name 属性

    screen

    合并

    属性 screenSize

    service

    合并

    android:name 属性

    supports-gl-texture

    合并

    android:name 属性

    supports-screen

    合并

    没有键

    uses-configuration

    合并

    没有键

    uses-feature

    合并

    首先是属性名称,如果不存在,则接着是 glEsVersion 属性

    uses-library

    合并

    android:name 属性

    uses-permission

    合并

    android:name 属性

    uses-sdk

    合并

    没有键

    自定义元素

    合并

    没有键


    包名称智能替换

    有些属性是包依赖属性,意思就是说这些属性支持通过由清单节点中的package属性提供的包设置,对部分完全限定的类名称的智能替换。


    下面描述的每个属性都可以有一个局部的类名称,这个类名称是以一个点或不包含任何点开头的。


    示例:


    <manifest

       xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.example.app1">


       <application>

           <activity android:name=".Main" />

       </application>

    </manifest>


    将被扩充成:


       <application>

           <activity android:name="com.example.app1.Main" />

       </application>


    这是独立于build.gradle里的任何包设置的(译者注,关于package和applicationId可以看一下我的系列博客中的另一篇文章的介绍)。例如,你build.gradle 包含以下内容:


    android {

       compileSdkVersion 19

       buildToolsVersion "19.0.2"


       productFlavors {

           flavor1 {

               applicationId = "com.android.tests.flavorlib.app.flavor1"

           }

    }


    扩充的结果仍然是

    <activity android:name=”com.example.app1.Main”>


    如果你需要让注入的值作为扩充的属性值,可以使用 ${applicationId} 占位符,例如:


    <manifest

       xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.example.app1">


       <application>

           <activity android:name="${applicationId}.Main" />

       </application>

    </manifest>


    下面是可以使用这种智能替换的能力包独立属性的列表:

    节点类型

    属性的本地名称

    activity

    name, parentActivityName

    activity-alias

    name, targetActivity

    application

    name, backupAgent

    instrumentation

    name

    provider

    name

    receiver

    name

    service

    name


    属性标记示例

    重写来自库的属性


    使用 tools:replace="x, y, z" 将会重写从外部库的activity 的XML声明中导入的 x,y,z 属性。


    更高级别的声明

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation="portrait"

    android:theme="@theme1"

    tools:replace=”theme”/>


    和一个较低优先级的声明:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme="@olddogtheme"

    android:windowSoftInputMode="stateUnchanged"

    android:exported="true" >


    将产生:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation="portrait"

    android:theme="@theme1"

    android:windowSoftInputMode="stateUnchanged"

    android:exported="true"/>

    删除来自库的属性。


    使用 tools:remove="x, y, z" 将会在产生的XML中删除 x,y,z 属性的声明。


    更高优先级的声明

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:hardwareAccelerated="true"

    tools:remove="android:theme,android:screenOrientation" />


    和一个较低优先级的声明:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation="landscape"

    android:theme="@olddogtheme"

    android:windowSoftInputMode="stateUnchanged"

    android:exported="true"/>


    将产生:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:hardwareAccelerated="true"

    android:windowSoftInputMode="stateUnchanged"

    android:exported="true"/>


    强制更新属性值


    毫无疑问,所有声明属性几乎都带有“strict”的合并策略,所以如果两个要合并的元素都有一个同样名称的属性但值却不同,就是一个需要明确解决的冲突。


    所以,一个较高优先级的声明

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@newdogtheme”/>


    和一个较低优先级的声明:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@olddogtheme”/>


    与一个较高优先级的声明

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@newdogtheme”

    tools:strict=”theme”/>


    和一个较低优先级的声明:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme=”@olddogtheme”/>


    是完全等价的,并且都将不能正确地合并,除非添加一个 tools:replace="theme" 的属性。

    混合操作


    如果用户想要删除某些属性且重写其他属性同时保存另一组的原始属性,只需依次添加所有标记。


    例如:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:windowSoftInputMode="stateUnchanged"

    android:theme="@theme1"

    tools:remove="android:exported, android:screenOrientation"

    tools:replace="android:theme"/>


    和一个较低优先级的声明:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:screenOrientation="landscape"

    android:theme="@olddogtheme"

    android:exported="true"/>


    将产生:

    <activity

     android:name="com.foo.bar.ActivityOne"

    android:theme="@theme1"

    android:windowSoftInputMode="stateUnchanged" />


    需要注意的是,如果低优先级的声明中包含 android:windowSoftInputMode或者未明确标记为删除或替换的任何属性,将生成一个构建错误。

    元素标记示例

    移除元素

    如果要删除任何一个库的某个元素,需要在更高优先级的文件中声明

    <activity-alias

    android:name="foo.bar.alias">

    <meta-data

    android:name="zoo"

    tools:node="remove"/>

    </activity-alias>


    与下面进行合并

    <activity-alias

    android:name="foo.bar.alias">

    <meta-data

    android:name="zoo"

    android:value="@string/bear"/>

    </activity-alias>


    将产生:

    <activity-alias

    android:name="foo.bar.alias">

    </activity-alias>


    移除所有元素

    如果要作任何一个库的一个特定类型的所有元素,需要在更高优先级的文件中声明

    <activity-alias

    android:name="foo.bar.alias">

    <meta-data  

    tools:node="removeAll" />

    </activity-alias>


    与下面进行合并

    <activity-alias

    android:name="foo.bar.alias">

    <meta-data

    android:name="zoo"

    android:value="@string/bear"/>

    <meta-data

    android:name="cage"

    android:value="@string/iron"/>

    </activity-alias>


    将产生:

    <activity-alias

    android:name="foo.bar.alias"

    </activity-alias>


    元素替换

    <activity-alias

    android:name="foo.bar.alias"

    tools:node="replace">

    <meta-data

    android:name="zoo"/>

    </activity-alias>


    与下面进行合并

    <activity-alias

    android:name="foo.bar.alias">

    <meta-data

    android:name="cage"

    android:value="@string/iron"/>

    </activity-alias>


    将产生:

    <activity-alias

    android:name="foo.bar.alias">

    <meta-data

    android:name="zoo"

    tools:node="remove"/>

    </activity-alias>

    选择器示例

    使用包名称来选择库这里,我们有三个库要合并进一个主清单文件中。

    主清单

    <manifest

       xmlns:android="http://schemas.android.com/apk/res/android"

       xmlns:tools="http://schemas.android.com/tools"

       package="com.example.main">


       <permission

             android:name="permissionOne"

             tools:node="remove"

             tools:selector="com.example.lib1">

       </permission>

       <permission

             tools:node="removeAll"

             tools:selector="com.example.lib3">

       </permission>

       <permission

                android:name="permissionThree"

                android:protectionLevel="signature"

                tools:node="replace">

       </permission>


    </manifest>


    与库1 


    <manifest

       xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.example.lib1">


       <permission android:name="permissionOne"

                android:protectionLevel="signature">

       </permission>

       <permission android:name="permissionTwo"

                android:protectionLevel="signature">

       </permission>

    </manifest>


    和库2 


    <manifest

       xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.example.lib2">


       <permission android:name="permissionThree"

                android:protectionLevel="normal">

       </permission>

       <permission android:name="permissionFour"

                android:protectionLevel="normal">

       </permission>

    </manifest>


    及库3 


    <manifest

       xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.example.lib2">


       <permission android:name="permissionFive"

                android:protectionLevel="normal">

       </permission>

    </manifest>


    将产生:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

       package="com.example.main" >


       <permission

           android:name="permissionThree"

           android:protectionLevel="signature" >

       </permission>

       <permission

           android:name="permissionTwo"

           android:protectionLevel="signature" >

       </permission>

       <permission

           android:name="permissionFour"

           android:protectionLevel="normal" >

       </permission>


    </manifest>




    展开全文
  • Android Lint是在ADT 16(和 Tools 16)引入的一个新工具,可以扫描Android ...缺少翻译(和未使用的翻译) 布局性能问题(老的layoutopt工具会用于查找所有这样的问题,和除此之外更多的问题) 未使用的资源 不一致

    本文译自androd官方技术文档《Android Lint》,原文地址:http://tools.android.com/tips/lint

    本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41592783。转载请注明出处。翻译如有错讹,敬请指正。



    Android Lint

    Android Lint是在ADT 16(和 Tools 16)引入的一个新工具,可以扫描Android 项目源码中潜在的bug 。它可同时作为一个命令行工具,以及集​​成在Eclipse(如下所述),和IntelliJ(详细信息)中。这个架构是有意独立于IDE的,因此它有希望与其他的IDE,其他的构建工具和持续集成系统集成。


    以下是它进行扫描的一些错误类型的例子:

    • 缺少翻译(和未使用的翻译)
    • 布局性能问题(老的layoutopt工具会用于查找所有这样的问题,和除此之外更多的问题)
    • 未使用的资源
    • 不一致的数组大小(当在多个配置中定义数组)
    • 可访问性和国际化问题(硬编码字符串,缺少contentDescription等)
    • 图标问题 (如丢失密度、 重复图标、 错误尺寸等)
    • 可用性问题 (如不在文本字段上指定输入的类型)
    • 清单错误
    以及其他更多的问题。

    请参阅 此文档以了解当前 lint 检查的问题的完整列表。
    有关如何取消显示(suppress)特定的 lint 警告信息,请参阅 取消警告显示的文档.

    如果你对编写自定义的lint 检查有兴趣,可以参阅 编写新的 Lint 检查编写自定义 Lint 规则

    命令行用法

    在 SDK 工具目录有一个命令行工具叫做  lint
    如果在你的path上已经配置了 SDK 的 tools/ 目录,您可以使用“ lint”来调用它。只需指向一个特定的 Android 项目目录。你也可以指向一个随机的目录,(如果它不是一个 Android 的项目)将以递归方式搜索,并将检查该目录下的所有项目。(你还可以指定通过空格分隔的多个项目)。
    $ lint /src/astrid/
    Scanning GreenDroid-GoogleAPIs: ..
    Scanning stream: ...
    Scanning api: ...........................
    Scanning GDCatalog: .......................
    Scanning GreenDroid: ...........................................................
    Scanning tests: ...
    Scanning filters: ....
    Scanning tests: .....
    Scanning astrid: ....................................................................................................................................................
    Scanning simple: .......
    api/res/values-ca: Error: Locale ca is missing translations for: sync_SPr_bgwifi_key, sync_SPr_forget_key, sync_SPr_interval_values, sync_SPr_logged_in_prefix... (2 more) [MissingTranslation]
    astrid/res/values-ca: Error: Locale ca is missing translations for: DLG_cancel, DLG_dismiss, DLG_ok, EPr_deactivated... (117 more) [MissingTranslation]
    api/res/values-cs: Error: Locale cs is missing translations for: sync_SPr_bgwifi_key, sync_SPr_forget_key, sync_SPr_interval_values, sync_SPr_logged_in_prefix... (2 more) [MissingTranslation]
    (many lines omitted)
    43 errors, 466 warnings

    禁用检查

    每种错误类型的“ID”都显示在错误消息后面的括号中,如上面的“MissingTranslation”。

    您可以通过添加 --disable argument,禁用一个特定的检查,或一列的检查,例如: 
    $ lint --disable MissingTranslation,UnusedIds,Usability:Icons /src/astrid/

    注意,您也可以列出类别,比如上面的“Usability:Icons”,就是用性类别的图标子类别。 

    有些检查默认情况下牌禁用状态。可以通过添加 --enable标志启用它们。

    最后,您可以通过 --check标志指定运行哪些确切的检查。这让你可以在代码库中查找一个具体的问题,比如: 
    $ lint --check MissingPrefix /src/astrid/

    如果要找出哪个 id 和类别是可用的,请运行 
    $ lint --list
    Valid issue categories:
    Correctness
    Security
    Performance
    Usability
    Usability:Icons
    Accessibility
    Internationalization

    Valid issue id's:
    "ContentDescription": Ensures that image widgets provide a contentDescription
    "DuplicateIds": Checks for duplicate ids within a single layout
    "StateListReachable": Looks for unreachable states in a <selector>
    "InefficientWeight": Looks for inefficient weight declarations in LinearLayouts
    "ScrollViewSize": Checks that ScrollViews use wrap_content in scrolling dimension
    "MergeRootFrame": Checks whether a root <FrameLayout> can be replaced with a <merge> tag
    ...

    使用 --show命令加上 id 列表或类别 (或不带参数查看全部)可以获取指定的问题的解释:

    $ lint --show MissingPrefix
    MissingPrefix
    -------------
    Summary: Detect XML attributes not using the Android namespace

    Priority: 8 / 10
    Severity: Warning
    Category: Correctness

    Most Android views have attributes in the Android namespace. When
    referencing these attributes you *must* include the namespace prefix,
    or your attribute will be interpreted by aapt as just a custom
    attribute.

    HTML 报表

    这个命令行工具还可以生成HTML报告。这相比普通的 lint 输出有一定的优势:
    • 它包含每个问题相关的更长的解释,并通过一个More info 的属性提供关于这个问题的更详细信息的链接。
    • 它包含有错误的实际的源代码行 (上下各有三行代码的一个窗口)。
    • 它可以包含关联到该源代码文件的链接
    • 对于错误图标,为能够比较起见,在报告中会显示图标本身
    要生成 HTML 报告,只需要添加 --html 文件名 作为参数:
    $ lint --html /tmp/report.html

    默认情况下,链接到源代码文件将只使用本地的 file:// 路径资源。您可以通过 --url 选项把 URL 重新映射向不同的前缀。例如:
    $ lint --html /tmp/report.html --url /src/MyProj=http://buildserver/src/MyProj

    其他命令行选项

    运行 lint --help以获取可用参数的相关信息。

    Eclipse 中的用法

    : 此文档是在 lint 首次发布时编写的。Eclipse 集成已经有了显著的提高。欲了解更多最新的详细信息,请参阅 新的Eclipse Lint UI(New Eclipse Lint UI)

    Lint 在 ADT 16及更高的版本上集成。该集成 提供了上述 Lint 命令行版本的几个功能:
    • 自动修复许多警告
    • Lint 可以在各种编辑器操作中自动运行
    • 屏幕某些错误类型及特定的错误实例
    • 配置问题检查严重程度
    • 从 lint 视图直接跳转到问题源码

    Lint 自动化

    在以下情况时 lint 会自动运行:
    • 导出 APK。在这种情况下,会以特殊模式运行 lint,它将只查找致命错误 (这样会更快),并且如果发现了任何错误的时候会中止导出。你可以在 Lint 选项中关闭它。
    • 编辑并保存和 XML 文件,例如布局文件或清单文件。在这种情况下,所有适用于给定文件的文件范围检查都会运行,并且会为任何已发现的问题加上编辑器的标记。
    • 使用布局编辑器。每个 UI 操作后,在布局文件上会运行文件范围检查 (如各种 layoutopt 规则),并且结果将显示在一个特别的 lint 窗口(当发现错误时它可以从显示在布局编辑器的右上角的错误标记中打开)。

    Lint 窗口

    要在一个项目上运行 Lint,请在包浏览器中选择项目,然后单击 Lint 工具栏上的功能(见下面的图片)。

    或者您可以在项目上右击,在 Android Tools 子菜单中,有一个“运行 Lint”的功能。它将打开一个 Lint 窗口,其中包含各种错误。选择一个错误将会在右侧的文本区显示相关联的解释。

    如果 lint 视图上有任何错误,你可以在错误上双击,来跳转到相关联的源代码位置。每个警告图标将显示其严重程度,并具对于已修复的警告(见下一节)会有一个小灯泡重叠。

    该窗口也有一个操作栏(在右上角),它可以让你
    • 再次运行 lint 检查以刷新结果 (在刷新期间它会变成一个 Stop 按钮,用于中止检查)
    • 如果有错误,运行与此错误相关联的修复
    • 忽略此修复
    • 删除警告标记
    • 删除所有的警告标记

    快速修复

    许多 lint 警告有自动修复功能。例如,各种 layoutopt 修复的替换提示 (如替换 wrap_content 为 0dp)。 
    • 从 lint 视图中,单击灯泡来调用一个修复程序。
    • 从布局编辑器警告摘要中,单击修复按钮来修复。
    • 从 XML 代码编辑器中,调用快速修复 (Ctrl+1 或Command+1)并选择与该警告关联的快速修复。

    取消错误警告的显示

    从编辑器快速修复菜单中,你也可以选择
    • 仅忽略此文件中的这个警告
    • 忽略此项目中的这个警告
    • 在此期间忽略此警告。
    • 通过添加注解或属性忽略此广告, 此处有解释。


    (如果你在 quickfix 列表找不到 lint 的修复操作,请参阅 已知 Bug 章节)

    这些选择都存储项目里名为 lint.xml的文件中,可以通过命令行工具读取。因此,您可以在 UI 中忽略警告,并在你的源项目关联的 lint.xml文件中进行记录,其他运行着的lint将不会看到你已经忽略的警告(大概是因为已经手动验证了)。

    选项

    要编辑用于所有项目备用选项的 lint 全局选项,可以调用正常的 Eclipse 选项对话框,并选择 Android > Lint Options:


    如果你选择了一个问题,您可以在右下角的下拉列表中编辑其严重程度。这使您可以把某些问题指定为 Error(即会在启用了靠近顶部的对话框中的选项的情况下中止导出 APK)。

    要完全关闭问题检查,请选择“Ignore”作为严重程度。 
    请注意此操作不会编辑每个项目的 lint 设置
    。打开项目设置对话框 (右击该项目),你将在这里找到 Android Lint 的属性页。在选项对话框中手动严重性编辑也会与取消显示的错误一起被记录在 lint.xml文件中,所以您的团队中的其他人将会获得你对这个项目编辑的相同的严重性设置。 

    展开全文
  • 本文译自androd官方技术文档《 Tools Attributes 》:http://tools.android.com/tech-docs/tools-attributes 本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41510581。转载请注明出处。翻译如有...

    本文译自androd官方技术文档《Tools Attributes》:http://tools.android.com/tech-docs/tools-attributes

    本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41510581。转载请注明出处。翻译如有错讹,敬请指正。


    工具属性

    Android 有一个专用的XML命名空间,用于使工具可以记录XML文件里的信息,并且在打包程序的进行把信息剥离到不会带来运行时期和下载大小的负面影响的程度。  这个命名空间的 URI 是  http://schemas.android.com/tools ,并且它通常被绑定到  tools:  前缀中:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        ....
    这份文档记录了我们当前使用的工具属性。( 注: 这些属性可能会随着时间在以后中改变。)

    tools:ignore

    此属性可以在任何 XML 元素上设置,它是一个逗号分割的lint 问题ID的列表,表示了应该要在此元素或它的任何子元素上递归忽略的lint问题的ID。
    <string name="show_all_apps" tools:ignore="MissingTranslation">All</string>

    使用: Lint


    tools:targetApi

    此属性像 Java 类中的 @TargetApi 批注解一样: 它允许您指定一个 API 级别,可以是整数或代码名称,表示此元素需要在此级别之上运行。

        <GridLayout  tools:targetApi="ICE_CREAM_SANDWICH" >

    使用: Lint


    tools:locale

    此属性可以设置在资源文件的根元素上,并且应该对应于一种语言或一个地区。这会让工具知道文件的字符串被假定为哪种语言(区域)中的。例如, values/strings.xml 可以有此根元素:

    <resources xmlns:tools="http://schemas.android.com/tools"  tools:locale="es" >
    现在我们知道默认值文件夹中的字符串用的语言是西班牙语,而不是英语。

    使用: Lint, Studio (以在非英语资源文件中禁用拼写检查)


    tools:context

    这个属性通常在一个布局XML文件的根元素中设置,记录了这个布局关联到哪一个activity(因为显然一个布局在设计时可以被多个布局使用)(例如它会用于布局编辑器中以推断默认的主题,由于主题定义在Manifest中,并与activity而不是布局相关联。你可以和在manifests中一样使用点前缀,来指定activity类,而不需要使用完整的程序包名作为前缀。
    <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"
         tools:context=".MainActivity"  ... >

    使用:Studio 和 Eclipse的布局编辑器,Lint


    tools:layout

    此属性通常设置在一个 <fragment> 标签中,用来记录在设计时你想看到渲染的布局 (在运行时,将由这个标签所列的fragment的类的操作所决定)。
    <fragment  android:name="com.example.master.ItemListFragment" tools:layout="@android:layout/list_content" />

    使用: Studio 和 Eclipse的布局编辑器


    tools:listitem / listheader / listfooter

    这些属性可用于在设计时的 <ListView>(或其他 AdapterView 的子类,比如 <GridView>,<ExpandableListView>等) 来指定布局使用的列表项,以及列表头部和列表底部。该工具将填充假的数据,以显示一个有一些类似内容的列表。
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:listitem="@android:layout/simple_list_item_2" />

    使用: Studio 和 Eclipse的布局编辑器


    tools:showIn

    该属性设置于一个被其他布局<include>的布局的根元素上。这让您可以指向包含此布局的其中一个布局,在设计时这个被包含的布局会带着周围的外部布局被渲染。这将允许您“在上下文中”查看和编辑这个布局。需要 Studio 0.5.8 或更高版本。更多信息请参阅发布声明
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         tools:showIn="@layout/activity_main"  />
    使用:Studio 的布局编辑器

    tools:menu

    这个属性在布局的根元素上设置,用于配置在 Action Bar中显示的菜单。Android Studio 通过查看这个布局文件所链接的activity(通过 tools:context)里的onCreateOptionsMenu()方法,尝试找出哪些菜单在 ActionBar 中使用。它允许您重写哪个搜索和显示声明的菜单用于显示。它的值是逗号分隔的 id 列表 (没有 @id/ 或任何这类前缀)。您还可以使用没有.xml 扩展名的菜单xml文件的名称。需要 Studio 0.8.0 或更高版本。
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         tools:menu="menu1,menu2"  />
    使用:Studio 的布局编辑器

    tools:actionBarNavMode

    这个属性在布局的根元素上设置,用于配置 Action Bar 使用的 导航模式。可能的值包括:“"standard”,“list”和“tabs”。需要 Studio 0.8.0 或更高版本。
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         tools:actionBarNavMode="tabs"  />
    使用:Studio 的布局编辑器

    其他属性: 设计时属性

    在布局中,任何其他属性可以是一个内置的 Android 属性别名。例如,这可以让您设置仅设计时的替换文字,用于工具中而不是运行时。详细信息,请参阅设计时布局属性


    展开全文
  • Android官方技术文档翻译——ApplicationId 与 PackageName

    万次阅读 多人点赞 2014-12-04 08:52:05
    本文译自androd官方技术文档《 ApplicationId versus PackageName 》,原文地址:http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename。 本文地址:...
  • 本文译自androd官方技术文档《 Apk Splits 》 ,原文地址 :http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits。 本文地址:...
  • 这一点在此文档中有更详细的说明。 然而,这样导致的后果之一是,一些已有的老项目,当使用ADT 14后将不再通过编译。其中的原因可能较难理解。有一个新的 quickfix 检测器就是为了解决这个问题,它可以寻找一个特定...
  • 本文译自Android官方技术文档《 Migrating from IntelliJ Projects 》,原文地址:http://tools.android.com/tech-docs/new-build-system/migrating-from-intellij-projects。 上一篇介绍了如何 上一篇介绍了...
  • Android官方技术文档翻译——Ant 任务

    千次阅读 2015-03-19 09:15:02
    本文译自Android官方技术文档《Ant Tasks》,原文地址:http://tools.android.com/tech-docs/ant-tasks。 因为是抽着时间译的,所以这篇文章我分了几个阶段才译完,且边译我的英语边成长,以致里面的表格里同样的...
  • 本文译自androd官方技术文档《 Build Workflow 》,原文地址:http://tools.android.com/tech-docs/new-build-system/build-workflow。 本文地址:...
  • 这篇文章从去年就开始翻译的了,无奈项目较赶我翻译的速度又慢,翻译期间Google官网又对它不断更新,以致拖到了现在。这一篇文档是对Android新构建系统的概述,列出了与它相关的一些文档,以及这个新构建系统的各...
  • 本文译自Android官方技术文档《Build Overview》,原文地址:http://tools.android.com/build。 因为《Android Lint Checks》这篇太长了,没译完,所以这次就发一下《Build Overview》的翻译好了。 这一篇是对...
  • 本篇文档介绍的是如何把一个Ecilpse上的Android项目,迁移到Android Studio。从Eclipse转Android Studio的同学可以看一下。 Eclipse 项目迁移 要将一个 Eclipse 项目迁移到 Android Studio 项目,您有两种选择: ...
  • 本文译自androd官方技术文档《 Designtime Layout Attributes 》:http://tools.android.com/tips/layout-designtime-attributes。 本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41541269。...
  • 本文译自Android官方技术文档《Gradle Plugin User Guide》,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide。 测试 构建一个测试应用程序已经集成到应用程序项目中了。所以已经没有...
  • 文档描述了大部分常见的变动,以帮助您迁移到 1.0.0。从1.0.0 及以后的版本起,我们将尽力不进行不兼容的更改。如果我们做到了,我们将打算编写 IDE 支持,以帮助自动迁移项目。 更新插件和 Gradle 版本号 构建...
  • 本文译自androd官方技术文档《 Non-constant Fields in Case Labels 》,原文地址:http://tools.android.com/tips/non-constant-fields。 本文地址:...
  • Android官方技术文档翻译——Gradle 插件用户指南(1-3) 》。 第四章见《 Android官方技术文档翻译——Gradle 插件用户指南(4) 》。 第五章见《 Android官方技术文档翻译——Gradle 插件用户指南(5...
  • Android官方技术文档翻译——Gradle 插件用户指南(1-3) 》。 翻译工作耗时费神,如果你觉得本文翻译得还OK,请点一下“顶”,我在精神上会倍受鼓励的,谢谢。翻译如有错讹,敬请指正。 ...
  • Android官方技术文档翻译——Gradle 插件用户指南(1-3) 》。 第四章见《 Android官方技术文档翻译——Gradle 插件用户指南(4) 》。 第五章见《 Android官方技术文档翻译——Gradle 插件用户指南(5...
  • 文档是 Gradle 插件 0.9 版本的文档。在 1.0 之前,我们所介绍的早期版本可能由于不兼容问题会有所不同。 新构建系统的目标 新的构建系统的目标是: 可以很容易地重用代码和资源 可以很容易地创建应用程序的几个...
  • 很多地方不是太明白,于是去官方网站上查看说明文档,发现真的很不方便,最痛苦的一点是由于官方技术文档全是英文编写,阅读太费劲,今天忽然在一个网站上发现了一个把MySQL官方技术文档翻译了,而且我看了一下,...
  • 微软和苹果合作开发的TrueType字体的技术文档的本人独家翻译。 文档来自 https://developer.apple.com
  • 关于技术文档翻译

    千次阅读 2006-09-22 21:15:00
    最近有人与我探讨有没有必要把时间花在技术文档翻译上面,我个人觉得是非常有必要的,理由如下:(1)提高英文的阅读能力和对单词的理解能力。翻译有个特点,就是要字斟句酌。所以翻译即是精读。你不会漏过任何一...
  • 翻译英文技术文档

    千次阅读 2015-12-19 02:08:43
     在并发网翻译的一些文章 传送门:http://ifeve.com/?p=22901&preview=true 以后也会继续在并发网发一些翻译文章,自己也会在博客更新自己翻译的一些文章
  • Juniper技术文档\Juniper Netscreen 防火墙 培训 地址翻译

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 138,280
精华内容 55,312
关键字:

技术文档翻译