Организация процесса компиляции и запуска проектов на платформе Android

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

Дипломная.doc

— 275.50 Кб (Скачать файл)

 

   Существуют некоторые ограничения, касающихся ресурсов. В Android поддерживается только линейный список файлов, находящийся в специальном каталоге, расположенном под каталогом res. Например, нельзя использовать вложенные каталоги, находящиеся под layout. Во-вторых, есть определенное сходство между каталогом assets и каталогом raw, который находится под res. В обоих каталогах могут содержаться RAW-файлы, но те файлы, которые находятся в каталоге raw, считаются ресурсами, а находящиеся в assets - нет. Таким образом, файлы каталога raw локализуются, к ним открывается доступ через ID ресурса и т. д.

Поскольку файлы каталога assets не считаются  ресурсами, в этом каталоге папки  и файлы могут иметь произвольную иерархию.

 

 

 

 

 

 

 

 

  1. Процесс компиляции и запуска проекта 

 

В процессе создания проект Android компилируется и упаковывается в файл .apk, который служит контейнером для бинарного кода приложения. Он содержит всю необходимую информацию для запуска приложения на устройстве или эмуляторе как компилированные .dex файлы (файлы .class преобразуются в байт код Dalvik), бинарную версию файла AndroidManifest.xml, компилированных ресурсов и не компилированных ресурс-файлов для приложения.

При разработке в Eclipse, ADT-плагин постепенно создает проект по мере изменений в исходном коде. Eclipse автоматически создает файл .apk, и разработчику не нужно что либо делать вручную. Аналогично и в других средах разработки (или все делается с помощью одной команды).

Для запуска приложения на эмуляторе или не устройстве, оно должно быть подписано либо как в отладочном режиме, либо в режиме выпуска.

Теперь подробно изучим процесс построения проекта Android. Процесс построения включает в себя множество инструментов и процессов, которые генерируют промежуточные файлы на этапах создания .apk файла. Как уже известно, при использовании различных сред разработки все этапы построения проходят автоматически. Но что же происходит «под этим»?

  Итак, ниже описана  диаграмма, подробно иллюстрирующая различные этапы построения: 

 

 

Ниже описаны основные этапы построения и их частичная реализация с использованием Android NDK (Native Development Kits):

    • Ресурс-файлы приложения, такие как AndroidManifest.xml, XML-файлы действий (Activities) передаются инструменту Android Asset Packaging Tool (aapt) , который компилирует их. Также генерируется файл R.java, для возможности доступа к ресурсам из Java-кода.

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_INT;

    if (apiLevel < 9)

    {

      System.out.println(G.Rstring(R.string.msg_aapt_build));

      System.out.println(G.Rstring(R.string.msg_aapt_your_api)+" "+apiLevel);

      System.out.println(G.Rstring(R.string.msg_aapt_warning));

    }

   

    if (G.fnCheckWorkDir(false)==false)

    {

      System.out.println(G.Rstring(R.string.msg_workdir_missing));

      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(stCommandLine);

  }

  catch (Throwable t)

  {

    rc = 99;

    System.err.println("Error occurred!\n"+t.getMessage());

    t.printStackTrace();

  }

  System.out.println("\nDone in "+(System.currentTimeMillis()-start)/1000+" sec.\n");

  System.out.println("ExitValue: "+rc);

  return rc;

 

    • Инструмент aidl преобразует имеющиеся интерфейсы .aidl в Java-интерфейсы.
    • Весь Java-код, включая файл R.java и полученные интерфейсы компилируются компилятором Java и получаются файлы типа .class.

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.compiler.batch.Main ecjMain;

 

  try

  {

    start = System.currentTimeMillis();

    System.out.println("Compilation arguments:");

    for (i=0;i<args.length;i++) System.out.println(args[i]);

    System.out.println("");

   

    ecjMain = new org.eclipse.jdt.internal.compiler.batch.Main(new PrintWriter(System.out), new PrintWriter(System.err), false, null, null);

    ok = ecjMain.compile(args);

    if (ok) rc = 0;

    else rc = 3;

    if (ecjMain.globalWarningsCount>0) rc = 1;

    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()-start)/1000+" sec.\n");

  System.out.println("ExitValue: "+rc);

  return rc;

}

 

    • Инструмент dex преобразует файлы .class в байт код Dalvik (.dex). Все сторонние библиотеки и файлы .class, прикрепленные к проекту, также преобразуются в файлы .dex, для дальнейшей их упаковки в файл .apk.

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.main(args);

  }

  catch (Throwable t)

  {

    rc = 99;

    System.out.println("Error occurred!\n"+t.getMessage());

    t.printStackTrace();

  }

  System.out.println("\nDone in "+(System.currentTimeMillis()-start)/1000+" sec.\n");

  System.out.println("ExitValue: "+rc);

  return rc;

}

 

    • Все не компилированные (например рисунки) ресурсы, компилированные ресурсы и файлы .dex передаются инструменту apkbuilder для упаковки в .apk файл.

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.ApkBuilderMain.main(args);

  }

  catch (Throwable t)

  {

    rc = 99;

    System.out.println("Error occurred!\n"+t.getMessage());

    t.printStackTrace();

  }

  System.out.println("\nDone in "+(System.currentTimeMillis()-start)/1000+" sec.\n");

  System.out.println("ExitValue: "+rc);

  return rc;

}

 

    • После получения файла .apk его нужно подписать в режиме отладки или выпуска, до того как он сможет быть установлен на устройство.

public int fnSignApk (String commandLine)

{

  return fnSignApk(fnTokenize(commandLine));

}

 

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()-start)/1000+" sec.\n");

  return rc;

}

 

    • И наконец, если приложение было подписано в режиме выпуска, файл .apk должен быть выровнен с помощью инструмента zipalign, для сокращения используемой памяти при запуске на устройстве.
  1. Графическая среда разработки

 

В данной работе решено создать графическую  среду разработки, работающую на устройстве Android. Как уже было рассмотрено выше, для получения из исходного проекта готового .apk архива, требуется провести ряд операций при помощи различных инструментов. Все эти инструменты могут работать на платформе Android. В проектируемой графической среде разработки требуется реализовать всю «цепочку», поэтапное построение приложения (.apk файла). Данная среда должна будет предоставлять удобный интерфейс для разработки, инструменты, позволяющие максимально упростить процесс создания приложения.

В результате, программист сможет создавать конечные Android-приложения на самом устройстве Android, не прибегая к помощи посторонних средств.

 

 

 

 

 

 

  1. Полученные результаты и дальнейшее развитие

На данном этапе разработки имеется  начальный пользовательский интерфейс, имеющий возможность редактирования 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.OnClickListener;

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(savedInstanceState);

        setContentView(R.layout.main);

        codeBox = (EditText)findViewById(R.id.codeBox);

        openButton = (Button)findViewById(R.id.openButton);

        openButton.setOnClickListener(new OnClickListener() {

 

public void onClick(View v) {

//Shows the content of programm.java

MyIDEActivity.this.openFile(FILENAME);

}

});

       

        saveButton = (Button)findViewById(R.id.saveButton);

        saveButton.setOnClickListener(new OnClickListener() {

 

public void onClick(View v) {

MyIDEActivity.this.saveFile(FILENAME);

 

//Checking saved file content

MyIDEActivity.this.openFile(FILENAME);

//End

}

});

       

        runButton = (Button)findViewById(R.id.runButton);

        runButton.setOnClickListener(new OnClickListener() {

 

public void onClick(View v) {

//Previously save the code

MyIDEActivity.this.saveFile(FILENAME);

 

//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.toString());

      }

     }

     catch (Throwable t)

     {

      Toast.makeText(getApplicationContext(),

"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.X509Certificate;

 

import kellinwood.security.zipsigner.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("\nArguments can be:");

    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.provider.BouncyCastleProvider'");

    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().toURL();

      sigBlockTemplate = signer.readContentAsBytes(sbtUrl);

      privateKeyUrl = new File(keyfilename).toURI().toURL();

      privateKey = signer.readPrivateKey(privateKeyUrl, keypass);

      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;

}

}

 

 

 

 

 

 

 

 

  1. Литература

 

    • С.Хашими, С.Коматинени, Д.Маклин – Разработка приложений для Android
    • Голощапов А. - Google Android программирование для мобильных устройств
    • http://developer.android.com/guide/
    • http://android-shark.ru/hirurgiya-android-classes-dex/
    • http://developer.alexanderklimov.ru/android/

Информация о работе Организация процесса компиляции и запуска проектов на платформе Android