android hal学习——测试整个流程

一、参考
需要参考在源码中如何编译apk。
http://my.oschina.net/u/572562/blog/62011
http://www.xuebuyuan.com/1557315.html
在packages/apps/目录下有不少app,可以参考。

二、测试
1、写app
1)在android studio中写好空的工程
2)编辑strings.xml

<resources>
    <string name="app_name">example1</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="value">value</string>
    <string name="hint">hint</string>
    <string name="read">read</string>
    <string name="write">write</string>
    <string name="clear">clear</string>
</resources>

3)编辑activity_main.xml,结果为:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <LinearLayout
            android:layout_width="fill_parent"
           android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center">
            <TextView
                            android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/value">
            </TextView>
            <EditText
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/edit_value"
                    android:hint="@string/hint">
            </EditText>
        </LinearLayout>
         <LinearLayout
            android:layout_width="fill_parent"
           android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center">
            <Button
                    android:id="@+id/button_read"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/read">
            </Button>
            <Button
                    android:id="@+id/button_write"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/write">
            </Button>
            <Button
                    android:id="@+id/button_clear"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/clear">
            </Button>
        </LinearLayout>
    </LinearLayout>

4)编辑activity类,结果为:

package com.example.gumh.example1;
import android.app.Activity;
import android.os.Bundle;
import android.os.IExampleService;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

import com.example.gumh.example1.R;




public class MainActivity extends Activity implements OnClickListener {
    private final static String LOG_TAG = "com.example.gumh.example1.MainActivity";

    private IExampleService exampleService = null;

    private EditText valueText = null;
    private Button readButton = null;
    private Button writeButton = null;
    private Button clearButton = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        exampleService = IExampleService.Stub.asInterface(
                ServiceManager.getService("example"));

        valueText = (EditText)findViewById(R.id.edit_value);
        readButton = (Button)findViewById(R.id.button_read);
        writeButton = (Button)findViewById(R.id.button_write);
        clearButton = (Button)findViewById(R.id.button_clear);

        readButton.setOnClickListener(this);
        writeButton.setOnClickListener(this);
        clearButton.setOnClickListener(this);

        Log.i(LOG_TAG, "Example Activity Created");
    }

    @Override
    public void onClick(View v) {
        if(v.equals(readButton)) {
            try {
                int val = exampleService.getVal();
                String text = String.valueOf(val);
                valueText.setText(text);
            } catch (RemoteException e) {
                Log.e(LOG_TAG, "Remote Exception while reading value from example service.");
            }
        }
        else if(v.equals(writeButton)) {
            try {
                String text = valueText.getText().toString();
                int val = Integer.parseInt(text);
                exampleService.setVal(val);
            } catch (RemoteException e) {
                Log.e(LOG_TAG, "Remote Exception while writing value to example service.");
            }
        }
        else if(v.equals(clearButton)) {
            String text = "";
            valueText.setText(text);
        }
    }
}

5)在android源码下的app下新增example1文件夹:
packages/apps/example1

6)新增Android.mk文件:

[zzz@localhost example1]$ cat Android.mk 

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS:=optional

LOCAL_SRC_FILES:=$(call all-java-files-under,src)

LOCAL_PACKAGE_NAME:=example1

LOCAL_CERTIFICATE:=platform

include $(BUILD_PACKAGE)

7)复制工程部分文件到这里(因为有些gradle的东西和结构不需要)
结果为:

[zzz@localhost example1]$ pwd
/home/zzz/opensource/android-src/packages/apps/example1
[zzz@localhost example1]$ ll
-rw-rw-r--.  1 zzz zzz  691 Nov 17 11:30 AndroidManifest.xml
-rw-rw-r--.  1 zzz zzz  217 Nov 17 11:41 Android.mk
drwxrwxr-x. 11 zzz zzz 4096 Nov 17 11:30 res
drwxrwxr-x.  3 zzz zzz 4096 Nov 17 11:38 src
[zzz@localhost example1]$ ll src/com/example/zzz/example1/MainActivity.java 
-rw-rw-r--. 1 zzz zzz 2434 Nov 17 12:03 src/com/example/zzz/example1/MainActivity.java

2、编译app

[zzz@localhost android-src]$  mmm packages/apps/example1/ 
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=6.0
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.10.0-229.14.1.el7.x86_64-x86_64-with-centos-7.1.1503-Core
HOST_CROSS_OS=windows
HOST_BUILD_TYPE=release
BUILD_ID=MASTER
OUT_DIR=out
============================================
Unknown option: -C
usage: git [--version] [--help] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
make: Entering directory `/home/gumh/opensource/android-src'
Running kati to generate build-aosp_arm-mmm-packages_apps_example1_Android.mk.ninja...
No need to regenerate ninja file
Starting build with ninja
ninja: Entering directory `.'
[ 83% 5/6] build out/target/product/ge...le1_intermediates/oat/arm/package.odex
dex2oatd W 19919 19919 art/runtime/arch/arm/instruction_set_features_arm.cc:96] Unknown instruction set features for ARM CPU variant (generic) using conservative defaults
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1944] out/host/linux-x86/bin/dex2oatd --runtime-arg -Xms64m --runtime-arg -Xmx512m --boot-image=out/target/product/generic/dex_bootjars/system/framework/boot.art --dex-file=out/target/product/generic/obj/APPS/example1_intermediates/oat/arm/package.odex.input --dex-location=/system/app/example1/example1.apk --oat-file=out/target/product/generic/obj/APPS/example1_intermediates/oat/arm/package.odex --android-root=out/target/product/generic/system --instruction-set=arm --instruction-set-variant=generic --instruction-set-features=default --include-patch-information --runtime-arg -Xnorelocate --no-generate-debug-info --abort-on-hard-verifier-error
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:692] Dumping image sections
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:696] SectionObjects start=0x70000000 size=3015800 range=0-3015800
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:696] SectionArtFields start=0x702e0478 size=544436 range=3015800-3560236
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:696] SectionArtMethods start=0x7036532c size=1993956 range=3560236-5554192
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:696] SectionDexCacheArrays start=0x7054c010 size=2139552 range=5554192-7693744
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:696] SectionInternedStrings start=0x707565b0 size=114840 range=7693744-7808584
dex2oatd I 19919 19919 art/runtime/gc/space/image_space.cc:696] SectionImageBitmap start=0x70773000 size=49152 range=7811072-7860224
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1742] dex2oat took 1.030s (threads: 4) arena alloc=137KB java alloc=56KB native alloc=267KB free=436KB
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1742] Code dedupe: 0 collisions, 0 max hash collisions, 0/3 probe distance, 3783 ns hash time
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1742] Mapping table dedupe: 0 collisions, 0 max hash collisions, 0/0 probe distance, 0 ns hash time
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1742] Vmap table dedupe: 0 collisions, 0 max hash collisions, 0/3 probe distance, 847 ns hash time
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1742] GC map dedupe: 0 collisions, 0 max hash collisions, 0/0 probe distance, 0 ns hash time
dex2oatd I 19919 19919 art/dex2oat/dex2oat.cc:1742] CFI info dedupe: 0 collisions, 0 max hash collisions, 0/0 probe distance, 0 ns hash time
dex2oatd W 19919 19919 art/runtime/runtime.cc:233] Current thread not detached in Runtime shutdown
[100% 6/6] Install: out/target/product...tem/app/example1/oat/arm/example1.odex
make: Leaving directory `/home/zzz/opensource/android-src'

#### make completed successfully (8 seconds) ####

[zzz@localhost android-src]$ ll out/target/product/generic/system/app/example1/
total 32
-rw-rw-r--. 1 zzz zzz 24758 Nov 17 12:03 example1.apk
drwxrwxr-x. 3 zzz zzz  4096 Nov 17 12:03 oat
[zzz@localhost android-src]$ 

可以看到,在输出目录已经有example1.apk了。

3、运行虚拟机
实际上,我在out/target/product/generic/目录下用指令:

emulator -sysdir ./ -system system.img -data userdata.img -kernel ~/opensource/android/goldfish/arch/arm/boot/zImage

虚拟机启动后,一直都是黑屏。
而用:

emulator -data userdata.img 

确很快可以进入系统,怀疑是我加的某些代码导致内核有问题或者system.img有问题。

于是重新去对整个系统进行编译:

[zzz@localhost android-src]$ make -j4
...

Note: Recompile with -Xlint:unchecked for details.
[  2% 49/1736] target Java: icu4j (out...LIBRARIES/icu4j_intermediates/classes)
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: external/icu/icu4j/main/classes/core/src/com/ibm/icu/impl/Relation.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[  5% 88/1736] Docs droiddoc: out/target/common/docs/api-stubs
DroidDoc took 85 sec. to write docs to out/target/common/docs/api-stubs
[  5% 90/1736] Docs droiddoc: out/target/common/docs/system-api-stubs
DroidDoc took 83 sec. to write docs to out/target/common/docs/system-api-stubs
[  5% 92/1736] Checking API:  checkpublicapi-current
FAILED: /bin/bash -c "(true) && ( out/host/linux-x86/bin/apicheck -JXmx1024m -J\"classpath /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.2.1.el7_1.x86_64/bin/../lib/tools.jar:out/host/linux-x86/framework/doclava.jar:out/host/linux-x86/framework/jsilver.jar\"  -error 2 -error 3 -error 4 -error 5 -error 6 -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 -error 25 -error 26 -error 27  frameworks/base/api/current.txt  out/target/common/obj/PACKAGING/public_api.txt  frameworks/base/api/removed.txt  out/target/common/obj/PACKAGING/removed.txt || (  cat build/core/apicheck_msg_current.txt ; exit 38 ) ) && (mkdir -p out/target/common/obj/PACKAGING/) && (touch out/target/common/obj/PACKAGING/checkpublicapi-current-timestamp)"
out/target/common/obj/PACKAGING/public_api.txt:23087: error 3: Added class IExampleService to package android.os
out/target/common/obj/PACKAGING/public_api.txt:23092: error 3: Added class IExampleService.Stub to package android.os

******************************
You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
      errors above.

   2) You can update current.txt by executing the following command:
         make update-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
******************************



[  5% 92/1736] Checking API:  checksystemapi-current
FAILED: /bin/bash -c "(true) && ( out/host/linux-x86/bin/apicheck -JXmx1024m -J\"classpath /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.2.1.el7_1.x86_64/bin/../lib/tools.jar:out/host/linux-x86/framework/doclava.jar:out/host/linux-x86/framework/jsilver.jar\"  -error 2 -error 3 -error 4 -error 5 -error 6 -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 -error 25 -error 26 -error 27  frameworks/base/api/system-current.txt  out/target/common/obj/PACKAGING/system-api.txt  frameworks/base/api/system-removed.txt  out/target/common/obj/PACKAGING/system-removed.txt || (  cat build/core/apicheck_msg_current.txt ; exit 38 ) ) && (mkdir -p out/target/common/obj/PACKAGING/) && (touch out/target/common/obj/PACKAGING/checksystemapi-current-timestamp)"
out/target/common/obj/PACKAGING/system-api.txt:25032: error 3: Added class IExampleService to package android.os
out/target/common/obj/PACKAGING/system-api.txt:25037: error 3: Added class IExampleService.Stub to package android.os

******************************
You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
      errors above.

   2) You can update current.txt by executing the following command:
         make update-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
******************************



[  5% 92/1736] Building with Jack: out...k_intermediates/with-local/classes.dex
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1
[zzz@localhost android-src]$ pwd


看到有几个错误:
out/target/common/obj/PACKAGING/public_api.txt:23087: error 3: Added class IExampleService to package android.os
out/target/common/obj/PACKAGING/public_api.txt:23092: error 3: Added class IExampleService.Stub to package android.os

out/target/common/obj/PACKAGING/system-api.txt:25032: error 3: Added class IExampleService to package android.os
out/target/common/obj/PACKAGING/system-api.txt:25037: error 3: Added class IExampleService.Stub to package android.os

用make update-api来解决,或在方法前增加 /*{@hide}/

1、增加 hide
在那个
frameworks/base/services/core/java/com/android/server/ExampleService.java
的接口的方法setVal和getVal上增加了:
/*{@hide} /
public void setVal(int val) {

再编译还是有问题,可能没有加对地方,先放过。

2、执行make update-api

[ 99% 281/282] Docs droiddoc: out/target/common/docs/doc-comment-check
DroidDoc took 416 sec. to write docs to out/target/common/docs/doc-comment-check
[100% 282/282] Copying current.txt
Copying removed.txt

3、再次编译:

make j4

...
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[100% 1449/1449] host Java: ahat-test-.../ahat-test-dump_intermediates/classes)
Note: art/tools/ahat/test-dump/Main.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details

但运行虚拟机还是有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值