Автор работы: Пользователь скрыл имя, 13 Сентября 2013 в 15:56, дипломная работа
Данная работа была направлена на изучение компьютерной платформы Android, сравнительно новой на рынке информационных технологий, ее основным концепциям для создания пользовательских приложений, организации поэтапного компилирования и запуска проектов и проектированию графической среды разработки приложений на платформе Android.
1. Цель дипломной работы……………………………………….……..3
2. Актуальность задачи………………………………………………….4
3. Операционная система Android……………………………………..6
3.1. История Android…………………………………………………6
3.2. Изучение платформы Android…………………………………..9
3.3. Структура проекта Android……………………………………11
4. Процесс компиляции и запуска проекта…………………………….15
5. Графическая среда разработки………………………………………18
6. Полученные результаты и дальнейшее развитие…………………....19
7. Литература…………………………………………………………….25
Существуют некоторые ограничения, касающихся ресурсов. В Android поддерживается только линейный список файлов, находящийся в специальном каталоге, расположенном под каталогом res. Например, нельзя использовать вложенные каталоги, находящиеся под layout. Во-вторых, есть определенное сходство между каталогом assets и каталогом raw, который находится под res. В обоих каталогах могут содержаться RAW-файлы, но те файлы, которые находятся в каталоге raw, считаются ресурсами, а находящиеся в assets - нет. Таким образом, файлы каталога raw локализуются, к ним открывается доступ через ID ресурса и т. д.
Поскольку файлы каталога assets не считаются
ресурсами, в этом каталоге папки
и файлы могут иметь
В процессе создания проект Android компилируется и упаковывается в файл .apk, который служит контейнером для бинарного кода приложения. Он содержит всю необходимую информацию для запуска приложения на устройстве или эмуляторе как компилированные .dex файлы (файлы .class преобразуются в байт код Dalvik), бинарную версию файла AndroidManifest.xml, компилированных ресурсов и не компилированных ресурс-файлов для приложения.
При разработке в Eclipse, ADT-плагин постепенно создает проект по мере изменений в исходном коде. Eclipse автоматически создает файл .apk, и разработчику не нужно что либо делать вручную. Аналогично и в других средах разработки (или все делается с помощью одной команды).
Для запуска приложения на эмуляторе или не устройстве, оно должно быть подписано либо как в отладочном режиме, либо в режиме выпуска.
Теперь подробно изучим процесс построения проекта Android. Процесс построения включает в себя множество инструментов и процессов, которые генерируют промежуточные файлы на этапах создания .apk файла. Как уже известно, при использовании различных сред разработки все этапы построения проходят автоматически. Но что же происходит «под этим»?
Итак, ниже описана диаграмма, подробно иллюстрирующая различные этапы построения:
Ниже описаны основные этапы построения и их частичная реализация с использованием Android NDK (Native Development Kits):
public int fnAapt (String commandLine)
{
return fnAapt(fnTokenize(commandLine)
}
public int fnAapt (String[] args)
{
long start=0;
int i, rc = 99, apiLevel;
String stCommandLine;
Aapt oAapt;
try
{
apiLevel
= android.os.Build.VERSION.SDK_
if (apiLevel < 9)
{
System.out.println(G.Rstring(
System.out.println(G.Rstring(
System.out.println(G.Rstring(
}
if (G.fnCheckWorkDir(false)==fals
{
System.out.println(G.Rstring(
return 99;
}
start = System.currentTimeMillis();
stCommandLine="aapt";
for (i=0;i<args.length;i++) stCommandLine += "\t"+args[i];
System.out.println("");
oAapt = new Aapt ();
if (!oAapt.isInitialized()) return 2;
rc=oAapt.fnExecute(
}
catch (Throwable t)
{
rc = 99;
System.err.println("Error occurred!\n"+t.getMessage());
t.printStackTrace();
}
System.out.println("\nDone in "+(System.currentTimeMillis()-
System.out.println("ExitValue: "+rc);
return rc;
public int fnCompile (String commandLine){
return fnCompile (fnTokenize(commandLine));
}
public int fnCompile (String[] args)
{
long start=0;
int i, rc=99;
boolean ok;
org.eclipse.jdt.internal.
try
{
start = System.currentTimeMillis();
System.out.println("
for (i=0;i<args.length;i++) System.out.println(args[i]);
System.out.println("");
ecjMain
= new org.eclipse.jdt.internal.
ok = ecjMain.compile(args);
if (ok) rc = 0;
else rc = 3;
if (ecjMain.globalWarningsCount>
if (ecjMain.globalErrorsCount>0) rc = 2;
}
catch (Throwable t)
{
rc = 99;
System.out.println("Error occurred!\n"+t.getMessage());
t.printStackTrace();
}
System.out.println("\nDone in "+(System.currentTimeMillis()-
System.out.println("ExitValue: "+rc);
return rc;
}
public int fnDx (String commandLine)
{
return fnDx (fnTokenize(commandLine));
}
public int fnDx (String[] args)
{
long start=0;
int i, rc=99;
try
{
start = System.currentTimeMillis();
System.out.println("Dx arguments:");
for (i=0;i<args.length;i++) System.out.println(args[i]);
System.out.println("");
rc = com.android.dx.command.Main.ma
}
catch (Throwable t)
{
rc = 99;
System.out.println("Error occurred!\n"+t.getMessage());
t.printStackTrace();
}
System.out.println("\nDone in "+(System.currentTimeMillis()-
System.out.println("ExitValue: "+rc);
return rc;
}
public int fnApkBuilder (String commandLine)
{
return fnApkBuilder (fnTokenize(commandLine));
}
public int fnApkBuilder (String[] args)
{
long start=0;
int i, rc = 99;
try
{
start = System.currentTimeMillis();
System.out.println("ApkBuilder arguments:");
for (i=0;i<args.length;i++) System.out.println(args[i]);
System.out.println("");
rc = com.android.sdklib.build.
}
catch (Throwable t)
{
rc = 99;
System.out.println("Error occurred!\n"+t.getMessage());
t.printStackTrace();
}
System.out.println("\nDone in "+(System.currentTimeMillis()-
System.out.println("ExitValue: "+rc);
return rc;
}
public int fnSignApk (String commandLine)
{
return fnSignApk(fnTokenize(
}
public int fnSignApk (String[] args)
{
long start=0;
int i, rc = 99;
try
{
start = System.currentTimeMillis();
System.out.println("SignApk arguments:");
for (i=0;i<args.length;i++) System.out.println(args[i]);
System.out.println("");
rc = SignApk.main(args);
}
catch (Throwable t)
{
rc = 99;
System.out.println("Error occurred!\n"+t.getMessage());
t.printStackTrace();
}
System.out.println("\nDone in "+(System.currentTimeMillis()-
return rc;
}
В данной работе решено создать графическую среду разработки, работающую на устройстве Android. Как уже было рассмотрено выше, для получения из исходного проекта готового .apk архива, требуется провести ряд операций при помощи различных инструментов. Все эти инструменты могут работать на платформе Android. В проектируемой графической среде разработки требуется реализовать всю «цепочку», поэтапное построение приложения (.apk файла). Данная среда должна будет предоставлять удобный интерфейс для разработки, инструменты, позволяющие максимально упростить процесс создания приложения.
В результате, программист сможет создавать конечные Android-приложения на самом устройстве Android, не прибегая к помощи посторонних средств.
На данном этапе разработки имеется начальный пользовательский интерфейс, имеющий возможность редактирования Java-файла , компиляции и запуска проекта на устройстве.
В дальнейшем предусматривается адаптированный текстовый редактор, возможность доступа ко всем компонентам проекта и создание проектов на самих устройствах с ОС Android.
Далее представлены фрагменты кода:
package com.artash.ide;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MyIDEActivity extends Activity {
private EditText codeBox;
private Button openButton;
private Button saveButton;
private Button runButton;
private static final String FILENAME = "programm.java";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(
setContentView(R.layout.main);
codeBox = (EditText)findViewById(R.id.
openButton = (Button)findViewById(R.id.
openButton.setOnClickListener(
public void onClick(View v) {
//Shows the content of programm.java
MyIDEActivity.this.openFile(
}
});
saveButton = (Button)findViewById(R.id.
saveButton.setOnClickListener(
public void onClick(View v) {
MyIDEActivity.this.saveFile(
//Checking saved file content
MyIDEActivity.this.openFile(
//End
}
});
runButton = (Button)findViewById(R.id.
runButton.setOnClickListener(
public void onClick(View v) {
//Previously save the code
MyIDEActivity.this.saveFile(
//Should run the saved file by compiler
}
});
this.openFile(FILENAME);
}
private void openFile (String fileName)
{
try
{
InputStream inStream = openFileInput(fileName);
if(inStream != null)
{
InputStreamReader sr = new InputStreamReader(inStream);
BufferedReader reader = new BufferedReader(sr);
String str;
StringBuffer buffer = new StringBuffer();
while((str = reader.readLine()) != null)
{
buffer.append(str + "\n");
}
inStream.close();
codeBox.setText(buffer.
}
}
catch (Throwable t)
{
Toast.makeText(
"Exception: " + t.toString(), Toast.LENGTH_LONG).show();
}
}
import com.t_arn.lib.io.taGetOpt;
import java.io.File;
import java.net.URL;
import java.security.PrivateKey;
import java.security.cert.
import kellinwood.security.zipsigner.
public class SignApk
{
int ExitValue;
taGetOpt getopt;
String mode = null;
String infilename = null;
String outfilename = null;
String provider = null;
String keyfilename = null;
String keypass = null;
String certfilename = null;
String templatefilename = null;
public SignApk (String[] args)
{
ExitValue = 255;
getopt = new taGetOpt(args, "MIO", "hPKWCT");
}
private boolean fnCheckParams()
{
boolean ok;
int count;
ok = getopt.paramsOK();
if (getopt.getOption('h')!=null) ok = false;
fnReadParams();
count=0;
if (keyfilename!=null) count++;
if (keypass!=null) count++;
if (certfilename!=null) count++;
if (templatefilename!=null) count++;
if ((count!=0)&&count!=4) ok = false;
if (!ok)
{
System.out.println("\nUse: iExitValue = SignApk.main(arguments)");
System.out.println("\
System.out.println("-h help show this help");
System.out.println("-M keymode auto, auto-testkey, auto-none, media, platform, shared, testkey, none");
System.out.println("-I unsignedAPK filename of the unsigned APK file");
System.out.println("-O signedAPK filename of the signed APK file");
System.out.println("-P provider
Alternate security provider class - e.g., 'org.bouncycastle.jce.
System.out.println("-K key filename of the PCKS#8 encoded private key file");
System.out.println("-W keypass Private key password");
System.out.println("-C cert filename of the X.509 public key certificate file");
System.out.println("-T template filename of the Signature block template file");
System.out.println("\nRequired arguments are -M, -I, -O");
System.out.println("Options -K, -W, -C and -T must always be used together. If used, the provided -M option is ignored.");
System.out.println("\nReturns following exit values:");
System.out.println("0: OK");
System.out.println("1: invalid or missing parameters");
System.out.println("2: signing error");
System.out.println("255: undefined");
}
return ok;
}
private void fnReadParams ()
{
mode = getopt.getOption('M');
infilename = getopt.getOption('I');
outfilename = getopt.getOption('O');
provider = getopt.getOption('P');
keyfilename = getopt.getOption('K');
keypass = getopt.getOption('W');
certfilename = getopt.getOption('C');
templatefilename = getopt.getOption('T');
}
private int fnSignApk()
{
int rc = 255;
ZipSigner signer;
PrivateKey privateKey = null;
URL privateKeyUrl, certUrl, sbtUrl;
X509Certificate cert = null;
byte[] sigBlockTemplate = null;
try
{
signer = new ZipSigner();
if (provider!=null) signer.loadProvider(provider);
if (keyfilename!=null)
{
certUrl = new File( certfilename).toURI().toURL();
cert = signer.readPublicKey(certUrl);
sbtUrl = new File(templatefilename).toURI()
sigBlockTemplate = signer.readContentAsBytes(sbtU
privateKeyUrl = new File(keyfilename).toURI().
privateKey = signer.readPrivateKey(
signer.setKeys("custom", cert, privateKey, sigBlockTemplate);
}
else
{
signer.setKeymode(mode);
}
signer.signZip(infilename, outfilename);
rc = 0;
}
catch (Throwable t)
{
rc = 2;
t.printStackTrace();
}
return rc;
}
public static int main (String[] args)
{
int rc = 255;
boolean ok;
SignApk main = new SignApk(args);
ok = main.fnCheckParams();
if (!ok) return 1;
rc = main.fnSignApk();
return rc;
}
}
Информация о работе Организация процесса компиляции и запуска проектов на платформе Android