android 4.2 系统编译小结
1、InputManager.java 类问题
由于 InputManager 类路径及函数都发生了变化,所以用法有所不同
long now = SystemClock.uptimeMillis();
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, eventCode,0);
KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, eventCode, 0);
4.0 版本:
import android.os.SystemClock;
import android.view.IWindowManager;
import android.view.KeyEvent;
try {
(IWindowManager.Stub.asInte易做图ce(ServiceManager
.getService("window"))).injectInputEventNoWait(down);
(IWindowManager.Stub.asInte易做图ce(ServiceManager
.getService("window"))).injectInputEventNoWait(up);
} catch (RemoteException e) {
e.printStackTrace();
}
4.2 版本:
import android.os.SystemClock;
import android.view.KeyEvent;
import android.hardware.input.InputManager;
InputManager.getInstance().injectInputEvent(down,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
InputManager.getInstance().injectInputEvent(up,
InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
2、NDK jni头文件路径变化问题
jni.h 头文件存放路径发生变化:
根目录: libnativehelper\include\nativehelper 下面 【jni.h 及 JNIHelp.h】
注意路径,否则可能会导致incluse文件失败
3、ProGuard 问题
ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。
可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、
字段、方法和属性。
ProGuard的使用是为了:
1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
2.创建的程序和程序库很难使用反向工程.
3.所以它能删除来自源文件中的没有调用的代码
4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.
在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了。
所以,在JNI应用中该慎用progurad
解决方法:
a、应用的 android.mk 中加入
LOCAL_PROGUARD_ENABLED := disabled
b、按照指定的规则不优化 加一个配置文件,proguard.flags
1、在Android.mk中加入一行:
LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags
2、创建proguard.flag文件,里面写入不需要proguard优化的类和方法。例如:
-keep class tv.ipanel.join.app.dtv.merge.IPanel30PortalActivity {
*
}
建议所有的jni类都要加上,不然会被 proguard 优化掉。从而导致找不到native接口。
更多的使用规则请看:
http://proguard.sourceforge.net/index.html#
也可以参照 build/core/proguard.flags 看一下具体的用法例子
4、memcpy 问题
原型: void *memcpy (void *dest, const void *src, size_t copy_amount)
copy_amount 不能大于 src 实际长度
举例说明:
char buff[512],p[1024];
snprintf(buff,512,"%s","oi2u3ort29035trlskjglsfwo39052sfkljhso3u205tlsnv03lsnvso2305nlsvs");
memcpy(p,buff,1024);
error: call to '__memcpy_src_size_error' declared with attribute error: memcpy called with size bigger than source
修改 memcpy(p,buff,512);
5、ALOGX 打印函数问题
打印函数变更名称,但其实现与原来还是一样
最简单方式:
system\core\include\cutils 路径下新定义一个 log_legacy.h
实现如下:
#ifndef __LOG_LEGACY_H__
#define __LOG_LEGACY_H__
#define LOGV ALOGV
#define LOGD ALOGD
#define LOGI ALOGI
#define LOGW ALOGW
#define LOGE ALOGE
#define LOGV_IF ALOGV_IF
#define LOGD_IF ALOGD_IF
#define LOGI_IF ALOGI_IF
#define LOGW_IF ALOGW_IF
#define LOGE_IF ALOGE_IF
#define IF_LOGV IF_ALOGV
#define IF_LOGD IF_ALOGD
#define IF_LOGI IF_ALOGI
#define IF_LOGW IF_ALOGW
#define IF_LOGE IF_ALOGE
#endif /* __LOG_LEGACY_H__*/
然后在 log.h 中最后引用一下即可
#include "log_legacy.h"
如下所有的地方都不用变更
6、编译android遇到java虚拟机堆内存不够的问题 java.lang.OutOfMemoryError
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:155)
at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:112)
at java.util.zip.ZipOutputStream.write(ZipOutputStream.java:272)
at com.android.signapk.SignApk.copyFiles(SignApk.java:496)
at com.android.signapk.SignApk.main(SignApk.java:557)
make: *** [out/target/product/Hi3716CV200ES/Nand/update.zip] 错误 1
应用 build\tools\signapk 源码
/**
* Copy all the files in a manifest from input to output. We set
* the modification times in the output to a fixed time, so as to
* reduce variation in the output file and make incremental OTAs
* more efficient.
*/
private static void copyFiles(Manifest manifest,
JarFile in, JarOutputStream out, long timestamp) throws IOException {
byte[] buffer = new byte[4096];
int num;
Map<String, Attributes> entries = manifest.getEntries();
ArrayList<String> names = new ArrayList<
补充:移动开发 , Android ,