http://m.blog.csdn.net/blog/u011494050/38464815#


在尝试获取APP耗电量时遇到了好多坑,拿出来跟大家共享下~~ 1.开始以为

【android】两类不能在SDK中使用的API------@hide和internal API介绍

Android有两类API在SDK中不能使用。

第一类就是位于包com.android.internal的API,这些API被称为内部API。第二类API就是用@hide标记的类和函数,虽然严格说这不是一个API而是一系列隐藏API的集合,我仍然假定这是一个API,称为隐藏API。

所以您只要看到@hide属性,这就是一个隐藏API。

内部API和隐藏API的不同

隐藏API隐藏是为了防止开发人员使用SDK中未完成或者未稳定(接口和架构方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隐藏起来了。当该API稳定下来,google的开发人员移除@hide属性,在API Level 5中就有Bluetooth API了。还有很多东西在Level 4和5之间发生了变化。如果程序依赖于某些隐藏API,可能会在新版本的Android OS上运行出现问题。

而内部API则不计划对外开放。这是android的内部餐厅,开发人员可以视为黑盒子。这里面的东西同样可能发生改变。同样的,如果您的程序依赖于内部API,在新的Android发布后,可能遇到麻烦。

下面总结它们之间的不同:

[html]  view plain copy
  1. 隐藏API = 正在开发中;  
  2.   
  3. 内部API = 黑盒  

内部和隐藏API的编译时和运行时对比

当您使用Android SDK进行开发时,会引用一个非常重要的jar文件android.jar。它位于Android SDK的平台目录SDK_DIR/platforms/platform-X/android.jar(其中X为API Level,可以是5或者10或其它的数字)。在android.jar中,com.android.internal中所有的类移除了,同样的,所有标记为@hide的类、枚举、字段、方法也移除了。

但是当您在设备中运行应用程序时,加载的是framework.jar(大约等价于android.jar),它没有被裁减,包含所有的内部类和隐藏API。所以您可以使用反射机制来访问隐藏API和内部API(当然,这种方法使用起来不太方便,下面我将介绍不使用反射机制访问这些API的方法)。

关于内部API还有一些特别。Eclipse的ADT插件增加了一条额外规则,禁止使用来自com.android.internal包的任何东西。所以,即使您使用了原始(未裁减)的android.jar,也不容易在eclipse中使用内部API。

您可以自己检查一下。在eclipse中创建一个新的Android工程(或使用现有的),查看它的引用库(右键点击工程,Properties –> Java Build Path –> Libraries)。



重要总结:在SDK中内部API和隐藏API处理方式基本上相同(都从android.jar中移除),但内部API在Eclipse ADT插件中显示禁止了。

不过,我们可以用反射使用内部API和隐藏API。

但是如果您使用这些非公开的API,必须意识到存在一个巨大的风险。首先不能保证这些API在Android OS升级后不会变化,其次也不能保证在不同厂家的不同设备上有一致的行为。这完全取决您自己。


http://www.yeetrack.com/?p=1045

Android CPU耗电量测试

在测试Android app时,不仅仅要关注app的功能,也好关注app的性能指标,cpu、内存、流量、电量等。简单介绍下电量测试中的cpu耗电。

影响耗电的因素

  • CPU
  • Screen
  • Network (3G/wifi)
  • sensor & gps
  • WakeLock

电量测试方法

  1. 安装电池管理的软件,管家、卫士一类的软件。
  2. 自己读取Android的内核日志,电量变化广播等。
  3. 物理设备,安培轮等

这里主要介绍读取内核文件,计算出cpu的电量消耗。

步骤主要如下:

  1. 抓取指定app占用的cpu时间
  2. 获取cpu在各个频率下的运行时间
  3. 根据不同频率下的不同耗电功率,计算出总的耗电消耗。

POWER_PROFILE.XML

每个Android设备都存在这样的一个文件,这个文件定义了各个硬件的功率。不同的手机,内容不同。我的如下(单位mAh,意思是一个小时,能耗电多少mAh):

    <?xml version="1.0" encoding="utf-8"?>            0        71        17        0.3        380        0.3        96        70        44        280        250        82        1                    3.4            3.4                            12000000            10000000            800000            500000            200000                4                        577            408            249            148            55                2100    

如何得到power_profile.xml文件

该文件存在手机的/system/framework/framework-res.apk包里,需要使用apk-tool对apk进行反编译,反编译后,在$output/res/xml文件夹中。

获取APP执行时间

  1. 获取pid, adb shell ps | grep {appName}或者adb shell top -n 1 | grep ${appName}
  2. 获取pid执行时间,cat /proc/${pid}/stat, 这个文件中的第14列到17列相加得到的就是从开机到此刻,app一共占用多少cpu时间(设这里值为T1),这里的单位是jiffies, 这个单位的意思是cpu的运算次数,如果cpu的频率为1G,那么1 jiffies = 1/1G 秒。
  3. 不断去cat /proc/${pid}/stat,获取cpu占用时间,减去第二步的T1,就是这段时间app的cpu占用时间。
  4. 获取cpu在不同频率下的工作几率。android的cpu会在不同主频下工作,/sys/devices/system/cpu/cpu0/cpufreq/stats/time_instate
    放了cpu在各个频段的占用时间,注意是整个系统占用时间,根据这个几率,计算出cpu的每个频率下的工作时间,然后再乘以power_profile.xml中定义的单位耗电,累加得到cpu消耗。
易踪网:每天进步一点点

转载请保留链接地址: http://www.yeetrack.com/?p=1045



1.jar:

JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。


Jar包甚至可以直接在Android上运行:

在android系统中运行jar操作步骤:

1.       打包编译jar包

2.       将jar包导入android设备中

adb push test.jar  /data/local/tmp     //将PC端编译好的jar包push到android设备中的/data/local/tmp目录下

3.       设置CLASSPATH

export CLASSPATH=/data/local/tmp/apt.jar

4.       启动jar 

app_process /data/local/tmp  com.app.process.test.Test      // data/local/apt.jar包所在路径,com.app.process.test.Test含有main方法的类名


OK  就这样jar包运行了…..有图有真相


Jar包结构:


Test.java:


按上述操作步骤得出的结果:


android系统源码目录system/framework下各个jar包的用途 

  • am.jar:终端下执行am命令时所需的java库。源码目录:framework/base/cmds/am
  • android.policy.jar:锁屏界面需要用到的jar包,该包引用了android.test.runner.jar,源码目录:framework/base/policy
  • android.test.runner.jar:测试应用所需的jar包,该包引用了core.jar,core-junit.ajr以及framework.jar,源码目录:framework/base/test-runner
  • bmgr.jar:adb shell命令下对Android Device所有package备份和恢复的操作时所需的java库。官方文档:http://developer.android.com/guide/developing/tools/bmgr.html。不过这个android服务默认是Disabled,而且要backup的应用必须实现BackupAgent,在AndroidManifest.xml的application标签中加入android:backupAgent属性。源码目录:framework/base/cmds/bmgr
  • bouncycastle.jar: java三方的密匙库,网上资料说用来apk签名、https链接之类,官网 :http://www.bouncycastle.org/java.html
  • com.android.future.usb.accessory.jar:用于管理USB的上层java库,在系统编译时hardware层会调用到。源码目录:frameworks/base/libs/usb
  • com.android.location.provider.jar:
  • com.android.nfc_extras.jar:NFC外部库。android/nfc/NfcAdapter.java会调用到包中的NfcAdapterExtras.java。源码目录:frameworks/base/nfc-extras
  • core-junit.jar :junit核心库,在运行*Test.apk时被调用。
  • core-junitrunner.jar:未知,公司话机上有。



http://blog.chinaunix.net/uid-24439730-id-355883.html

2.dex: Android系统中的.apk文件和dex文件

1. apk文件

APK是Android Package的缩写,即Android安装包。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件组合成一个应用程序包(APK)。Dex是Dalvik VM executes的全称,即Android Dalvik执行程序。

  • META-INF\ Jar文件
  • res\ 存放资源文件
  • AndroidManifest.xml 应用全局配置文件
  • *.dex Dalvik虚拟机字节码(应用程序)
  • resources.arsc 编译后的二进制资源文件

     Android在运行程序时首先需要解压apk文件,然后获取编译后的androidmanifest.xml文件中配置信息,执行dex程序。

2.dex文件

Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,通常执行时都进行优化 。优化后的文件大小会有所增加(调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域 验证DEX文件中的所有类 对一些特定的类进行优化,对方法里的操作码进行优化 。优化后的文件大小会有所增加,应该是原Android DEX文件的1-4倍。)。 优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件)。 而后通过工具软件DX把所有的字节码文件转成Android DEX文件(classes.dex)。最后使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件(二进制格式)组合成一个应用程序包(APK)。应用程序包可以被发布到手机上运行。

3.

更多相关文章

  1. Android显示PDF文件之PDFviewer
  2. android NDK mk文件模板
  3. 4.0 Android中资源文件
  4. android的apk文件的xml提取
  5. Android系统图标设计原则
  6. 从系统角度理解Android的界面绘制

随机推荐

  1. Android 笔记.代码段
  2. Android(安卓)JVM的运行过程
  3. Android上传图片裁剪功能
  4. Android例子—常用系统Intent合集
  5. Android 开发技巧集合
  6. android 本地化和国际化
  7. android xml操作
  8. android列表为空时提示语
  9. Android逐帧动画的实现
  10. android 权限库,拿来就能用