如果您想了解有关Android Gradle插件设置的更多信息,请查看android-gradle
文档 。
如果您对替代模拟器感兴趣,可以查看Genymotion 。它提供免费计划,需要较少的RAM。
版 | API级别 | 版本代码 | 发布日期 |
---|---|---|---|
1.0 | 1 | BASE | 2008-09-23 |
1.1 | 2 | BASE_1_1 | 2009-02-09 |
1.5 | 3 | CUPCAKE | 2009-04-27 |
1.6 | 4 | DONUT | 2009-09-15 |
2.0 | 五 | ECLAIR | 2009-10-26 |
2.0.1 | 6 | ECLAIR_0_1 | 2009-12-03 |
2.1.x的 | 7 | ECLAIR_MR1 | 2010-01-12 |
2.2.x中 | 8 | FROYO | 2010-05-20 |
2.3 | 9 | GINGERBREAD | 2010-12-06 |
2.3.3 | 10 | GINGERBREAD_MR1 | 2011-02-09 |
3.0.x的 | 11 | HONEYCOMB | 2011-02-22 |
3.1.X | 12 | HONEYCOMB_MR1 | 2011-05-10 |
3.2.x中 | 13 | HONEYCOMB_MR2 | 2011-07-15 |
4 | 14 | ICE_CREAM_SANDWICH | 2011-10-18 |
4.0.3 | 15 | ICE_CREAM_SANDWICH_MR1 | 2011-12-16 |
4.1 | 16 | JELLY_BEAN | 2012-07-09 |
4.2 | 17 | JELLY_BEAN_MR1 | 2012年11月13日 |
4.3 | 18 | JELLY_BEAN_MR2 | 2013年7月24日 |
4.4 | 19 | KITKAT | 2013年10月31日 |
4.4W | 20 | KITKAT_WATCH | 2014-06-25 |
5 | 21 | LOLLIPOP | 2014年11月12日 |
5.1 | 22 | LOLLIPOP_MR1 | 2015年3月9日 |
6 | 23 | M (棉花糖) | 2015年10月5日 |
7 | 24 | N (牛轧糖) | 2016年8月22日 |
7.1 | 25 | N_MR1 (牛N_MR1 糖MR1) | 2016年10月4日 |
8 | 26 | O (开发者预览版4) | 2017年7月24日 |
这是一个极简主义的Hello World示例 ,仅使用最基本的Android工具。
这个例子假设Linux。您可能必须调整自己平台的语法。
解压缩SDK版本后:
使用SDK管理器安装其他软件包。不要按照捆绑的Readme.txt中的指示使用android update sdk --no-ui
;它下载了大约30 GB的不必要文件。而是使用交互式SDK管理器android sdk
来获得建议的最小包。
将以下JDK和SDK目录附加到执行PATH。这是可选的,但下面的说明假定它。
创建Android虚拟设备。使用交互式AVD管理器( android avd
)。您可能需要调整一下并寻求建议; 现场说明并不总是有用。
(您也可以使用自己的设备)
运行设备:
emulator -avd DEVICE
如果设备屏幕似乎已锁定,则滑动以将其解锁。
在编写应用程序时让它保持运行。
切换到空工作目录。
制作源文件:
mkdir --parents src/dom/domain
touch src/dom/domain/SayingHello.java
内容:
package dom.domain;
import android.widget.TextView;
public final class SayingHello extends android.app.Activity
{
protected @Override void onCreate( final android.os.Bundle activityState )
{
super.onCreate( activityState );
final TextView textV = new TextView( SayingHello.this );
textV.setText( "Hello world" );
setContentView( textV );
}
}
添加清单:
touch AndroidManifest.xml
内容:
<?xml version='1.0'?>
<manifest xmlns:a='http://schemas.android.com/apk/res/android'
package='dom.domain' a:versionCode='0' a:versionName='0'>
<application a:label='Saying hello'>
<activity a:name='dom.domain.SayingHello'>
<intent-filter>
<category a:name='android.intent.category.LAUNCHER'/>
<action a:name='android.intent.action.MAIN'/>
</intent-filter>
</activity>
</application>
</manifest>
为声明的资源创建一个子目录:
mkdir res
暂时把它留空。
生成资源声明的源。在这里替换SDK的正确路径,以及要构建的已安装API (例如“android-23”):
aapt package -f \
-I SDK/platforms/android-API/android.jar \
-J src -m \
-M AndroidManifest.xml -S res -v
资源声明(下面进一步描述)实际上是可选的。同时,如果res /仍为空,则上述调用不执行任何操作。
将源代码编译为Java字节码(.java→.class):
javac \
-bootclasspath SDK/platforms/android-API/android.jar \
-classpath src -source 1.7 -target 1.7 \
src/dom/domain/*.java
将字节码从Java转换为Android(.class→.dex):
首先使用Jill(.class→.jayce):
java -jar SDK/build-tools/LATEST/jill.jar \
--output classes.jayce src
杰克(.jayce→.dex):
java -jar SDK/build-tools/LATEST/jack.jar \
--import classes.jayce --output-dex .
Android字节码曾被称为“Dalvik可执行代码”,因此称为“dex”。
如果你愿意的话,你可以用一次电话取代Jack替换步骤11和12;它可以直接从Java源代码编译(.java→.dex)。但是使用javac
进行编译有一些优势。它是一个更好的已知,更好的文档和更广泛适用的工具。
打包资源文件,包括清单:
aapt package -f \
-F app.apkPart \
-I SDK/platforms/android-API/android.jar \
-M AndroidManifest.xml -S res -v
这导致部分APK文件(Android应用程序包)。
使用ApkBuilder
工具制作完整的APK:
java -classpath SDK/tools/lib/sdklib.jar \
com.android.sdklib.build.ApkBuilderMain \
app.apkUnalign \
-d -f classes.dex -v -z app.apkPart
它警告说,“这个工具已被弃用。有关更多信息,请参阅--help。”如果--help
失败并出现ArrayIndexOutOfBoundsException
,则不传递任何参数:
java -classpath SDK/tools/lib/sdklib.jar \
com.android.sdklib.build.ApkBuilderMain
它解释了不推荐使用CLI( ApkBuilderMain
),而是直接调用Java API( ApkBuilder
)。 (如果您知道如何从命令行执行此操作,请更新此示例。)
优化APK的数据对齐( 推荐做法 ):
zipalign -f -v 4 app.apkUnalign app.apk
将应用安装到Android设备:
adb install -r app.apk
启动应用:
adb shell am start -n dom.domain/.SayingHello
它应该运行并打个招呼。
就这样。这就是用基本的Android工具打招呼所需要的。
此部分是可选的。简单的“hello world”应用程序不需要资源声明。如果您的应用程序不需要它们,那么您可以通过省略步骤10并从步骤13中删除对res /目录的引用来稍微简化构建。
否则,这是一个如何声明资源以及如何引用它的简短示例。
添加资源文件:
mkdir res/values
touch res/values/values.xml
内容:
<?xml version='1.0'?>
<resources>
<string name='appLabel'>Saying hello</string>
</resources>
从XML清单引用资源。这是一种声明式的参考风格:
<!-- <application a:label='Saying hello'> -->
<application a:label='@string/appLabel'>
从Java源引用相同的资源。这是一个必要的参考:
// v.setText( "Hello world" );
v.setText( "This app is called "
+ getResources().getString( R.string.appLabel ));
通过重建,重新安装和重新运行应用程序来测试上述修改(步骤10-17)。
它应该重新启动并说“这个应用程序叫做Saying hello”。
adb uninstall dom.domain
Android应用程序是用Java编写的。 Android SDK工具将代码,数据和资源文件编译为APK(Android包)。通常,一个APK文件包含应用的所有内容。
每个应用程序都在自己的虚拟机(VM)上运行,以便应用程序可以与其他应用程序隔离运行。 Android系统使用最小权限原则。每个应用程序只能访问其工作所需的组件,而不是更多。但是,有一些应用程序可以与其他应用程序共享数据,例如通过在应用程序之间共享Linux用户ID,或者应用程序可以请求访问SD卡,联系人等设备数据的权限。
应用程序组件是Android应用程序的构建块。每个组件在Android应用程序中扮演特定角色,该应用程序具有不同的用途并具有不同的生命周期(组件创建和销毁的方式和时间流程)。以下是四种类型的应用程序组件:
Android系统的一个独特之处在于,任何应用程序都可以启动另一个应用程序的组件(例如,如果您想要拨打电话,发送短信,打开网页或查看照片,有一个应用程序已经这样做,您的应用程序可以利用它,而不是为同一个任务开发一个新的活动)。
当系统启动一个组件时,它会启动该应用程序的进程(如果它尚未运行,即每个应用程序在Android系统上的任何给定时间只能运行一个前台进程)并实例化该组件所需的类。因此,组件在其所属的应用程序的进程上运行。因此,与其他系统上的应用程序不同,Android应用程序没有单个入口点(没有main()
方法)。
由于系统在单独的流程中运行每个应用程序,因此一个应用程序无法直接激活其他应用程序的组件,但Android系统可以。因此,要启动另一个应用程序的组件,一个应用程序必须向系统发送一条消息,指定启动该组件的意图,然后系统将启动该组件。
android.content.Context
类的实例提供与执行应用程序的Android系统的连接。需要Context的实例来访问项目的资源以及有关应用程序环境的全局信息。
让我们有一个易于理解的例子:假设你在酒店,你想要吃点东西。你打电话给客房服务,并要求他们带给你东西或为你清理东西。现在想想这个酒店作为一个Android应用程序,你自己作为一项活动,然后客房服务人员就是你的背景,它可以让你访问酒店资源,如客房服务,食品等。
还有一个例子,你坐在一张桌子上的餐厅,每张桌子都有一个服务员,当你想订购食品时,你要求服务员这样做。然后服务员下订单,食物送到您的桌子上。再次在这个例子中,餐厅是一个Android应用程序,表或客户是应用程序组件,食品项目是您的应用程序资源,服务员是您的上下文,从而为您提供访问食品等资源的方法。
激活上述任何组件都需要上下文的实例。不仅仅是上述,而且几乎每个系统资源:使用视图创建UI(稍后讨论),创建系统服务实例,启动新活动或服务 - 都需要上下文。
更详细的描述写在这里 。
首先设置Android Studio ,然后打开它。现在,您已准备好制作首个Android应用程序了!
注意:本指南基于Android Studio 2.2,但其他版本的过程主要是相同的。
您可以通过两种方式启动新项目:
Start a New Android Studio Project
”。 New Project
,请导航到File
→ New Project
。 接下来,您需要填写一些字段来描述您的应用程序:
应用程序名称 - 此名称将显示给用户。
示例: Hello World
。您可以随后在AndroidManifest.xml
文件中进行更改。
公司域 - 这是项目包名称的限定符。
示例: stackoverflow.com
。
包名称 (又名applicationId
) - 这是完全限定的项目包名称。
它应该遵循反向域名表示法 (又名反向DNS ): 顶级域名 。 公司域名 。 [ 公司细分 。 ] 申请名称 。
示例: com.stackoverflow.android.helloworld
或com.stackoverflow.helloworld
。您始终可以通过在gradle文件中覆盖applicationId来更改它。
除非您不打算将您的应用程序提交到Google Play商店,否则请勿使用默认前缀“com.example”。包名称将是您在Google Play中的唯一applicationId 。
在下一个窗口中,您可以选择应用支持的外形规格,例如手机,平板电脑,电视,Wear和Google Glass。选定的形状因子成为项目中的app模块。对于每种外形规格,您还可以选择该应用的API级别。要获取更多信息,请单击“ 帮助我选择”
当前Android版本发行版的图表,当您单击“帮助我选择”时显示。
Android平台分发窗口显示运行每个Android版本的移动设备的分布,如图2所示。单击API级别以查看相应Android版本中引入的功能列表。这有助于您选择具有应用所需的所有功能的最低API级别,以便您可以访问尽可能多的设备。然后单击确定 。
现在,选择应用程序将支持的Android SDK平台和版本 。
目前,仅选择手机和平板电脑 。
最低SDK是您的应用程序的下限。这是Google Play Store
用于确定可以安装应用的设备的信号之一。例如, Stack Exchange的应用程序支持Android 4.1+。
Android Studio会告诉您(大约)在指定的最小SDK的情况下支持的设备百分比。
较低的API级别针对更多设备,但可用的功能较少。
在决定使用Minimum SDK时 ,您应该考虑Dashboards统计信息 ,它会为您提供有关上周访问Google Play商店的设备的版本信息。
来自:Android开发者网站上的Dashboards 。
现在我们将为我们的应用程序选择一个默认活动。在Android中, Activity
是一个将呈现给用户的单个屏幕。应用程序可以容纳多个活动并在它们之间导航。对于此示例,请选择Empty Activity
并单击next。
在这里,如果您愿意,可以更改活动和布局的名称。一个好的做法是将Activity
作为活动名称的后缀,并将activity_
作为布局名称的前缀。如果我们将这些保留为默认值,Android Studio将为我们生成一个名为MainActivity
的活动,以及一个名为activity_main
的布局文件。现在单击Finish
。
Android Studio将创建和配置我们的项目,这可能需要一些时间,具体取决于系统。
要了解Android的工作原理,让我们来看看为我们创建的一些文件。
在Android Studio的左侧窗格中,我们可以看到Android应用程序的结构 。
首先,让我们通过双击打开AndroidManifest.xml
。 Android清单文件描述了有关Android应用程序的一些基本信息。它包含我们活动的声明,以及一些更高级的组件。
如果应用程序需要访问受权限保护的功能,则必须声明它需要具有清单中<uses-permission>
元素<uses-permission>
。然后,当应用程序安装在设备上时,安装程序通过检查签署应用程序证书的权限并在某些情况下询问用户来确定是否授予所请求的权限。应用程序还可以使用权限保护自己的组件(活动,服务,广播接收器和内容提供商)。它可以使用Android定义的任何权限(在android.Manifest.permission中列出)或由其他应用程序声明。或者它可以定义自己的。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.stackoverflow.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
接下来,让我们打开位于app/src/main/res/layout/
的activity_main.xml
。此文件包含MainActivity的可视组件的声明。你会看到视觉设计师。这允许您将元素拖放到选定的布局上。
您还可以通过单击Android Studio底部的“文本”切换到xml布局设计器,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.stackexchange.docs.helloworld.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
您将在此布局中看到一个名为TextView
的小部件,其中android:text
属性设置为“Hello World!”。这是一个文本块,将在用户运行应用程序时显示。
您可以阅读有关布局和属性的更多信息。
接下来,我们来看看MainActivity
。这是为MainActivity
生成的Java代码。
public class MainActivity extends AppCompatActivity {
// The onCreate method is called when an Activity starts
// This is where we will set up our layout
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView sets the Activity's layout to a specified XML layout
// In our case we are using the activity_main layout
setContentView(R.layout.activity_main);
}
}
根据我们的Android清单中的定义,当用户启动HelloWorld
应用程序时, MainActivity
将默认启动。
最后,打开位于app/
名为build.gradle
的文件。
Android Studio使用构建系统Gradle来编译和构建Android应用程序和库。
apply plugin: 'com.android.application'
android {
signingConfigs {
applicationName {
keyAlias 'applicationName'
keyPassword 'password'
storeFile file('../key/applicationName.jks')
storePassword 'anotherPassword'
}
}
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.stackexchange.docs.helloworld"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
signingConfig signingConfigs.applicationName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:26.0.0'
}
此文件包含有关构建和应用程序版本的信息,您还可以使用它来向外部库添加依赖项。现在,我们不做任何改变。
建议始终选择可用于依赖项的最新版本:
compileSdkVersion
compileSdkVersion
是告诉Gradle用什么版本的Android SDK来编译你的应用程序的方法。使用新的Android SDK是使用该级别中添加的任何新API的要求。
应该强调的是,更改compileSdkVersion
不会改变运行时行为。虽然在更改compileSdkVersion
时可能存在新的编译器警告/错误,但您的compileSdkVersion
不包含在您的APK中:它纯粹在编译时使用。
因此,强烈建议您始终使用最新的SDK进行编译。您将获得对现有代码进行新编译检查的所有好处,避免新弃用的API,并准备好使用新API。
的minSdkVersion
如果compileSdkVersion
设置了最新的API,则minSdkVersion
是应用程序的下限 。 minSdkVersion
是Google Play商店用于确定应用程序可以安装在哪个用户设备上的信号之一。
它在开发过程中也扮演着重要角色:默认情况下,lint针对您的项目运行,当您使用minSdkVersion
上方的任何API时会发出警告,帮助您避免尝试调用不存在的API的运行时问题。在仅在较新的平台版本上使用API时,在运行时检查系统版本是一种常见技术。
targetSdkVersion
targetSdkVersion
是Android通过不应用行为更改来提供向前兼容性的主要方式,除非更新了targetSdkVersion
。这允许您在完成行为更改之前使用新的API。更新以定位最新的SDK应该是每个应用程序的高优先级。这并不意味着您必须使用所引入的每个新功能,也不应该盲目地更新targetSdkVersion
而不进行测试。
targetSDKVersion是Android的版本,它是可用工具的上限。如果targetSDKVersion小于23,则即使应用程序在API 23+上运行,应用程序也不需要在运行时为实例请求权限。 TargetSDKVersion 并不妨碍Android的版本采摘Android版本上面运行的应用程序。
您可以找到有关Gradle插件的更多信息:
现在,让我们运行我们的HelloWorld应用程序。您可以运行Android虚拟设备(可以使用Android Studio中的AVD Manager进行设置,如下例所示),也可以通过USB线连接自己的Android设备。
要在Android设备上从Android Studio运行应用程序,您必须在设备设置的Developer Options
中启用USB Debugging
。
Settings > Developer options > USB debugging
如果在设置中看不到“ Developer Options
”,请导航至“ About Phone
然后点击“ Build Number
七次。这将使Developer Options
显示在您的设置中。
Settings > About phone > Build number
您还可能需要更改build.gradle
配置以构建设备所具有的版本。
单击Android Studio顶部工具栏中的绿色Run
按钮。在出现的窗口中,选择要在其上运行应用程序的设备(如有必要,请启动Android虚拟设备,或者如果需要设置 ,请参阅设置AVD(Android虚拟设备) )并单击“ OK
。
在运行Android 4.4(KitKat)且可能更高的设备上,将显示一个弹出窗口以授权USB调试。单击“ OK
接受。
该应用程序现在将在您的Android设备或模拟器上安装并运行。
准备发布应用程序时,可以配置,构建和测试应用程序的发行版。配置任务很简单,涉及基本代码清理和代码修改任务,有助于优化您的应用程序。构建过程类似于调试构建过程,可以使用JDK和Android SDK工具完成。测试任务可作为最终检查,确保您的应用程序在实际条件下按预期执行。准备好发布应用程序后,您将拥有一个已签名的APK文件,您可以将其直接分发给用户或通过Google Play等应用程序市场进行分发。
Android Studio
由于在上面的示例中使用了Gradle,因此生成的APK文件的位置为: <Your Project Location>/app/build/outputs/apk/app-debug.apk
的IntelliJ
如果您在切换到Studio之前是IntelliJ的用户,并且直接导入IntelliJ项目,则没有任何更改。输出的位置将在下面相同:
out/production/...
注意:这有时会在1.0左右被弃用
日食
如果您直接导入Android Eclipse项目,请不要这样做!只要您的项目(罐子或库项目)中有依赖项,这将无效,您的项目将无法正确设置。如果你没有依赖关系,那么apk将与你在Eclipse中找到它的位置相同:
bin/...
TL; DR它基本上允许我们模拟真实设备并在没有真实设备的情况下测试我们的应用程序。
根据Android开发者文档 ,
通过Android虚拟设备(AVD)定义 ,您可以定义要在Android模拟器中模拟的Android手机,平板电脑,Android Wear或Android TV设备的特征。 AVD Manager可帮助您轻松创建和管理AVD。
要设置AVD,请按照下列步骤操作:
1.单击此按钮以显示AVD管理器:
2.你应该看到这样的对话:
3.现在单击+ Create Virtual Device...
按钮。这将打开虚拟设备配置对话框:
4.选择所需的任何设备,然后单击“ Next
:
5.在这里,您需要为您的模拟器选择Android版本。您可能还需要先单击“ Download
下载它。选择版本后,单击“ Next
。
6.在此处输入模拟器的名称,初始方向以及是否要在其周围显示框架。选择所有这些后,单击“ Finish
。
7.现在您已准备好新的AVD,可以在其上启动您的应用程序。
Android Studio是Android开发的IDE,由Google正式支持和推荐。 Android Studio捆绑了Android SDK Manager ,这是一个下载开始开发应用程序所需的Android SDK
组件的工具。
安装Android Studio和Android SDK
工具:
如果您需要处理使用较旧SDK版本构建的旧项目,则可能还需要下载这些版本
从Android Studio 2.2开始,最新的OpenJDK副本与安装捆绑在一起,是所有Android Studio项目的推荐JDK (Java开发工具包)。这消除了安装Oracle JDK包的要求。要使用捆绑的SDK,请执行以下操作:
Android Studio通过“ 帮助”菜单提供对两个配置文件的访问:
您可以根据自己的喜好进行更改。 File->Settings->Editor->Colors & Fonts->
并选择一个主题。您也可以从http://color-themes.com/下载新主题。下载.jar.zip
文件后,转到File -> Import Settings...
并选择下载的文件。
在Android Studio中创建新项目或打开现有项目,然后按绿色“播放”按钮在顶部工具栏上运行它。如果它是灰色的,您需要等待一秒钟以允许Android Studio正确索引某些文件,其进度可以在底部状态栏中看到。
如果要从shell创建项目,请确保您具有local.properties
文件,该文件由Android Studio自动创建。如果您需要在没有Android Studio的情况下创建项目,则需要以sdk.dir=
开头的行,然后是SDK安装的路径。
打开一个shell并进入项目目录。输入./gradlew aR
并按Enter键。 aR
是assembleRelease
的快捷方式,它将为您下载所有依赖项并构建应用程序。最终的APK文件将在ProjectName/ModuleName/build/outputs/apk
,并将被称为ModuleName-release.apk
。