category为:android.intent.category.HOME 表示随home应用启动的activity。
cts 测试:
http://developer.android.com/tools/device.html
./android-cts/tools/cts-tradefed
CTS Signature Android Java VM RefApp Performance
run cts --plan Android 运行某个测试计划。
start --plan Android -p android.acceleration 运行某个包
Start –plan [test plan name]–c [plan_package_name].[class_name]#[plan_package_test_name] 运行某个测试项
list packages list plans list invocations list commands list results list devices
not responsive to adb shell command skip adding to available pool
错误,可能是因为网络不好,没有连接上。
设置是否优化apk为odex,build/core.main.mk文件WITH_DEXPREOPT := true
查看签名:
jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar
google搜索
Windows 8″ filetype:pdf | filetype:pptx | filetype:docx | filetype:ppt | filetype:doc | filetype:rtf site:download.microsoft.com | inurl:”ftp://”
adb shell monkey -v 5000
(-p packages)
am broadcast -a android.intent.action.ActionName
am start -n com.android.settings/com.android.settings.Settings
多关注events日志。
判断系统重启,boot_progress_ams_ready
iptables -F清除所有规则
快捷方式,快速打开资源管理器和服务,
资源管理器 devmgmt %windir%\system32\devmgmt.msc
服务 services.msc %windir%\system32\services.msc
内存问题
top -m 5 -s cpu -n 1
top,procrank,ps
ps -x 得出的u: s: 为utime和stime应该是用户时间和系统时间
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
• RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
• PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
• USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
procrank
- VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
/proc/cpuinfo
系统CPU的类型等多种信息。
/proc/meminfo 系统内存使用信息
dumpsys meminfo
"adb shell dumpsys meminfo com.teleca.robin.test" 将得到com.teleca.robin.test进程使用的内存的信息:
top | grep app名称
ps | grep app名称
procrank | grep app名称
dumpsys meminfo app名称
前两个命令只能查到VSS RSS内存占用信息
而后面两个命令可以查出 PSS USS内存占用.
dumpsys meminfo 可以查出native和dalvik分别占用多少内存
dumpsys 用来给出手机中所有应用程序的信息,并且也会给出现在手机的状态。
dumpsys [Option]
meminfo 显示内存信息
cpuinfo 显示CPU信息
account 显示accounts信息
activity 显示所有的activities的信息
window 显示键盘,窗口和它们的关系
wifi 显示wifi信息
ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
am.getMemoryInfo(outInfo);
outInfo.availMem即为可用空闲内存。
判断系统进程:
1.可以通过uid来过滤系统系统的安装包,因为android系统中的uid从 1000 ~ 9999 都是给系统程序保留的,所以只要判断package的uid > 10000即可判定该程序是非系统程序。
2.ApplicationInfo appInfo = p.applicationInfo;
/**
* Value for {@link #flags}: if set, this application is installed in the
* device's system image.
*/
if
((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) >
0
)
//系统程序
else
//不是系统程序
3.通过获取的安装包(包括安装的与系统自身的应用程序),对其android.content.pm.PackageInfo的packageName 进行过滤,
但是Anrodi与google的包比较容易过滤掉,但需要对不同产商进行适配;
记录日志信息 adb shell "su xxxlogcat -v time -f /data/logcat.log -r 1000 " &
导出日志先修改权限,su xxx chmod 777 /data/logcat.log
adb shell tcpdump -i rmnet0 -vv -s 0 -w /mnt/sdcard/output.cap &
查看电量:/sys/class/power_supply/bq27541
MTP无法用:
安装windows player 11
设置c:\windows\inf\wpdmtp.inf增加%GenericMTP.DeviceDesc%=MTP, USB\VID_XXXX&PID_XXXX&MI_00
反编译odex 和apk:
1.
java -jar baksmali-1.2.2.jar -x <a.odex>
a)UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: bad magic value: 64 65 79 0a 30 33 36 00
b)smali 版本不对导致。2.3.5的需要用1.2.8版本。
org.jf.dexlib.Util.ExceptionWithContext: regCount does not match the number of a
rguments of the method
2. 将 class 生成为 classes.dex 文件。
命令: java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex
3.把 classes.dex 放入 apk 里面
查看apk签名:
jarsigner -verbose -certs -verify apk
安装apk异常
Android: INSTALL_FAILED_UPDATE_INCOMPATIBLE错误解决措施
以前uninstall应用的时候,没有做彻底,执行adb uninstall
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
有时候我们在APK安装时由于工程制定了UID,换过签名后可能出现类似 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 或 INSTALL_FAILED_UPDATE_INCOMPATIBLE 的错误,对于后者我们可以通过Logcat看到具体的比如说 has no signatures that match those in shared user 这样的关键字,这是由于使用了sharedUserId后你使用了不同的签名造成的
git ls-files > filelist.txt
find > filelist.txt
getevent /dev/input/event1
adb logcat -t file -r 1000 //设置日志文件大小,1000k,超过了则记录到下一个文件中。
shell脚本:
1.for循环:
for i in `busybox seq 10000`
do
done
2.发送touch事件:
touch 83 718 //坐标点位置,通过getevent 从/dev/input/event1中获取,
/dev/input/event1: 0003 0039 00000000
/dev/input/event1: 0003 0035 0000016e //
注意需要进行转换。16e 和 1ea 从十六进制 -->十进制。
/dev/input/event1: 0003 0036 000001ea
/dev/input/event1: 0003 003a 000000c8
touch()
{
sendevent /dev/input/event1 3 57 35
sendevent /dev/input/event1 3 53 $1
sendevent /dev/input/event1 3 54 $2
sendevent /dev/input/event1 3 58 200
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 1 330 1
sendevent /dev/input/event1 0 0 0
#sendevent /dev/input/event2 3 57 0
#sendevent /dev/input/event2 3 53 $1
#sendevent /dev/input/event2 3 54 $2
sendevent /dev/input/event1 3 58 200
sendevent /dev/input/event1 0 2 0
#sendevent /dev/input/event2 0 0 0
#sendevent /dev/input/event2 0 2 0
sendevent /dev/input/event1 1 330 0
sendevent /dev/input/event1 0 0 0
sleep 1
}
使用procrank查看进程内存
# echo standby > /sys/power/state 命令系统进入休眠
echo PowerMana > wake_unlock 解除加锁。
echo
mem
>
/sys/power/state
使系统进行睡眠
echo on > /sys/power/state
使系统从睡眠中唤醒过来
标志性:Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done
Android在Linux内核原有的睡眠唤醒模块上基础上,主要增加了下面三个机制:
Wake _Lock 唤醒锁机制;
Early _Suspend 预挂起机制;
Late _Resume 迟唤醒机制;
http://blog.sina.com.cn/s/blog_759dc36b0100stax.html
强制亮屏:
PowerManager.WakeLock mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE/*PowerManager.PARTIAL_WAKE_LOCK*/, "AlarmReceiver");
KeyguardManager km=(KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
//解锁
KeyguardLock kl= km.newKeyguardLock("unLock");
kl.disableKeyguard();
//重新启用自动加锁
kl.reenableKeyguard();
杀死应用:
ActivityManager am = (ActivityManager)getActivity().getSystemService(
Context.ACTIVITY_SERVICE);
for (int i = 0; i < mPackages.length; i++) {
am.forceStopPackage
(mPackages[i]);
}
不允许应用重启:
Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART
,
Uri.fromParts
("package", mPackages[0], null));
intent.putExtra(Intent.EXTRA_PACKAGES
, mPackages);
intent.putExtra(Intent.EXTRA_UID, mUid);
getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver
, null,
Activity.RESULT_CANCELED, null, null);
public static boolean RootCommandDumpstate(String command)
{
Process process = null;
DataOutputStream os = null;
try{
//process = Runtime.getRuntime().exec("su");
process = Runtime.getRuntime().exec("suapk");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
}catch (Exception e){
Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
return false;
} finally{
try{
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e){
}
}
Log.d("*** DEBUG ***", "Root SUC ");
return true;
}
CDMA 与 GSM切换出错问题:
无法判断sim卡类型导致。
现在在UiccCardApplication.update 方法中通过AppType 类型来判断 sim卡类型。
此处优先于ServiceStateTracker.updateIccAvailability ()
流程:
EVENT_ICC_STATUS_CHANGED
事件-->EVENT_GET_ICC_STATUS_DONE 事件-->
UiccManager.onGetIccCardStatusDone
-->
1.mUiccCards[index].update(mContext, mCi[index], status);
2.mIccChangedRegistrants.notifyRegistrants -->ServiceStateTracker.updateIccAvailability