android编码规范
❶ Android studio注释乱码UTF-8和GBK设置都没用,怎么办
情况一:编辑器内的中文注释乱码。
解决办法:在界面的右下角找到 UTF-8 ,单击之,在弹出的列表中选中GBK 在弹出框内选中Reload
总结:导致这样的原因是你这个.java文件本身是GBK编码的,你当然可以用GBK方式可以读,可是最好把从根本上把这个文件编码成UTF-8的!而且很多人出现这种情况是因为从eclipse复制,或导入文件到了android studio中。Eclipse的时候它可以自动识别,到了as就不可以了故出现这些错误。
情况二:用虚拟机运行应用时APP界面文字乱码。
解决办法:在Gradle Scripts -> build.gradle中的如下下图位置添加:
android{compileOptions.encoding="GBK"}
或者
compileOptions.encoding="GBK"
情况三:Gradle Build 中出现如下乱码,且编辑器的中文注释有乱码
需要工具:SublimeText 或者 Notepad++ 或者 EidtPlus 总之是那些能把你的文件改成UTF-8 without DOM 编码的编辑器,本人用的是Sublime Text2
①双击如下乱码提示的任意一行,它将会弹出一个.java文件给你,比如:我弹出的了AbInnerViewPager.java这个文件的编辑窗口,其中的中文注释都是乱码
/**其实下面乱码的每一行代表一处你某个类或其他文件中的中文乱码,一个类可能产生好几行下面那种乱码*/
②在左边的目录框右键那个类->点击show in explorer(就是找到这个文件在电脑中的位置)
③以sublimeText的格式打开这个.java文件,点击File->Save with Encoding->UTF-8
④返回android studio等一下(不用rebuild什么的,文中的乱码自己会变成了正常的中文)
⑤rebuild一下,重复以上步骤,知道把那些GBK格式的文件都改为UTF-8为止
总结:
1、Sublime Text2有个缺点,不能一次全选再改格式!!!虽然可以用ctrl全选然后在Save with Encoding,但最终你会发现只有一个文件改了编码方式而已,而且你可以从sublime界面最下那个提示横栏看到是哪一个,不知为何,可能是我打开的方式有问题吧==!,或者是一个Bug,请后来试过的同学跟我说下你们可以不。。。
2、千万不要用微软自带的记事本来另存为,然后再编码那里改成UTF-8就以为万事大吉,血的教训告诉你!这个UTF-8实际上是UTF-8 with DOM,然后你rebuild后会有如下错误提示,然后你最后还是要改成UTF-8 without DOM
3、最好把以后的文件都以UTF-8保存,查看
File->Setting->File->Editor->File Encodings如下设置
❷ 安卓开发Layout XML 下出现这种警告怎么解决
鼠标点到黄色敬告上就会弹出提示了嘛,类似于这种“
Buttons in button bars should be borderless; use style="?
adt的版本越来越高了,所以也要求规范了,一些属性官方要求是要写上的,比如style等,早期android1.5、1.6的时候就没这么多要求,可能随后发展这些属性不写就不是黄色警告了,就变红色错误了。
解决的方式是给每一个button或者其他控件加上style样式。
❸ android 图片转BASE64上传提示java.lang.OutOfMemoryError
我最近也碰到了这个问题,但是网上没有找到相关有效的直接解决方法。
后来看到了一篇解释base64编码原理的文章,研究了一番后解决了。
一般碰到这个问题的,都涉及到"大文件上传"的问题,"大文件上传"过程中除了base64编码时可能OOM,其实还有其他问题,虽然提问中没有提出,可能是因为这个问题还没有解决,所以还没有遇到其它问题,我就围绕着"大文件上传"来解决这个问题吧。
(提问时间在下看的清楚)
————————————————————
做项目的过程中碰到一个需求:
在java客户端,使用http通信,把客户端的本地文件通过http发送上传到服务器;
请求格式是xml(不管是json还是xml都是字符串,所以这个无所谓),中间包含[文件流字符串];
之前的做法是,把文件流通过base64编码转换为base64Byte,然后和其它字符串信息放到一起,post的时候通过HttpURLConnection的write方法写入到服务器中去,这个上传的过程就完成了。
——————————
但是碰到一个问题,当文件体积较大时,从文件流转换成base64Byte后,体积会很大,可能会导致OOM;
(以二进制流的方式保存,体积最小;以byte数组的方式保存,体积会相对变大一些;以String形式保存,体积最大;)
出错原因是:
FileInputStream fis = new FileInputStream(file); //这一步打开了一个对准file准备进行读取的文件指针,但是还没有开始读写,file的相关数据没有从本地加载到内存中来;所以即使file的体积有10G那么大,这一步也是不会OOM的
//把文件流转换为字节数组
byte[] fileBytes;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] byteBuf = new byte[1024];
int count;
while((count=fis.read(buf))!=-1)
{
baos.write(buf,0,count); //实际上,如果文件体积比较大的话,不用转码,在这一步就可能OOM了
}
fileBytes= baos.toByteArray();
byte[] base64Bytes = Base64.encodeBase64(fileBytes); //在这一步也可能OOM
(文件转换为byte[]时,是有可能OOM的;而转换为base64Bytes后,体积会增大1/3,所以有可能前一步没有OOM,却在这一步出现OOM;
为什么转码后体积会增大1/3,后面我会解释)
——————————
解决方法
既然file在本地没有加载到内存来的时候不会出现内存溢出的情况,我就想到了一个解决的方法:分段上传
(加大内存并不能从根本上解决内存溢出的问题,问题的根本原因不是内存不够大,而是代码有问题)
在本地的file通过HttpURLConnection的getOutputStream()进行write时,不是一次性全部写入,而是循环配合flush进行写入:
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
int count;
while((count = fis.read(buf)) != -1)
{
os.write(Base64.encodeBase64(buf), 0, count);
os.flush();
}
(我从本地读1024字节,然后马上上传到服务器,清空本地缓存,然后再从本地读1024字节,这样循环读取,即使文件有20G,理论上也不有OOM问题出现,因为我从本地文件中读到的数据不会在内存中驻留)
——————————
解决问题的思路对了,但是出现了其他的细节问题
os.write(Base64.encodeBase64(buf), 0, count); //这一行代码报错了,出现了OOM
我搜集了一下资料,发现原因是:
HttpURLConnection的getOutputStream的实际对象是sun.net.<a href="http://www.http.PosterOutputStream" target="_blank">www.http.PosterOutputStream</a>,这个对象的flush方法代码是空的,write配合flush,并没有达到即时上传数据的效果。PosterOutputStream其实是自己在本地维护了一个缓冲区,你通过write写入的数据其实还是在这个本地的缓冲区里,只有当你getInputStream后,HttpURLConnection才会把这段缓冲区中的数据上传到服务器上。而flush达不到上传数据,清空本地缓存的效果。
——————————
(我是不能通过getInputStream来刷新缓冲流的,因为那就不是分段上传而是"分次"上传了)
那这就不是我的思路的问题了。再去搜索解决方法后,得知:
在创建HttpURLConnection对象的时候,要调用一个方法
hurlc.setChunkedStreamingMode(1024); //设置分块流模式 也就是分块上传 1024是getOutputStream维护的本地缓冲区的大小
调用该方法后,只要本地缓存区满了,HttpURLConnection就会自动把缓冲区里的数据发送到服务器,同时清空本地缓存(ps:HttpURLConnection的getOutputStream似乎是个抽象的工厂方法,在调用setChunkedStreamingMode方法后,我发现getOutputStream获取到的实例对象从sun.net.<a href="http://www.http.PosterOutputStream" target="_blank">www.http.PosterOutputStream</a>变成了sun.net.<a href="http://www.protocol.http.HttpURLConnection$StreamingOutputStream" target="_blank">www.protocol.http.HttpURLConnection$StreamingOutputStream</a>)
——————————
果然,调用setChunkedStreamingMode方法后,os.write(Base64.encodeBase64(buf), 0, count);没有再出现OOM异常了
但是,又出现了一个新的问题
我发现
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024];
int count;
while((count = fis.read(buf)) != -1)
{
os.write(Base64.encodeBase64(buf), 0, count);
os.flush();
}
这段分段编码写入的代码,其编码所得结果,与非分段编码所得结果是不一样的
通过分段编码上传的图片内容出现了错误
我通过下面代码测试:
//分段编码
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] buf1 = new byte[1024];
int count1;
while((count1 = file1.read(buf1)) != -1)
{
os1.write(Base64.encodeBase64(buf1), 0, count1);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
//非分段编码
ByteArrayOutputStream os2 = new ByteArrayOutputStream();
InputStream file2 = new FileInputStream(path);
byte[] buf2 = new byte[1024];
int count2;
while((count2 = file2.read(buf2)) != -1)
{
os2.write(buf2, 0, count2);
os2.flush();
}
file2.close();
System.out.println(new String(Base64.encodeBase64(os2.toByteArray())));
两者的结果:
/9j/4AAQSkZJR...wDtUAVs7eF...
/9j/4AAQSkZJR...wDt89ymnxJ...
前面一段还是相同的,转到后面,就开始南辕北辙了
——————————
原因我去网上找了一下但是没有找到直接答案,但是看到一篇解释base64编码原理的文章
原文链接:<a href="http://www.cnblogs.com/luguo3000/p/3940197.html" target="_blank">http://www.cnblogs.com/luguo3000/p/3940197.html</a>
假设有文件A(txt文件,包含文本内容"ABCDEFG"),转换为InputStream->byte[]后
它们的ASIIC码分别对应65、66、67、68、69、70、71
二进制表现形式为:
1000001 1000010 1000011 1000100 1000101 1000110 1000111
对高位补零后:
01000001 01000010 01000011 01000100 01000101 01000110 01000111
在内存中的实际表现:
而base64编码,使用的字符包括(A-Z、a-z、0-9、+、/、=)这些常规可读字符,使用base64编码的原因,用途,在于把一些乱码字符、不可读字符转换为常规可读字符;
(因为java底层的通信协议、或者说其它的通信协议,很多地方用到远程通信这一块的,对一些乱码字符不支持传输,所以需要把乱码字符转换成常规可读字符才能进行传输)
比如对于'矙'这个字符,部分传输协议的编码集就不认识它,所以无法直接传输,必须base64转码
'矙'的UTF-8编码值为30681,二进制表现形式为111011111011001->(0)111011111011001
需要两个字节来存储01110111 11011001
base64编码只有(A-Z、a-z、0-9、+、/、=)这些字符来表示。需要强调的是,在base64编码规范中,字符'A'不等于65、'B'也不是66...。base64字符与数值(二进制值)的对应关系如下:
也就是说,常规字符'A'=65=01000001;而base64字符'A'=0=00000000;
base64字符代表的二进制值是无法直接表示'矙'这个字符的,因为base64字符的值范围在0~63之间(二进制值在(00)000000~(00)111111之间)。
那如何通过(00)000000~(00)111111之间的数值来表示01110111 11011001呢?
这就是base64的编码算法了
一个base64字符的二进制值在(00)000000~(00)111111之间,也就是说它可以表示000000~111111之间的二进制数,一个base64字符的有效位为后6位。如何通过以6bit为单位的base64字符表示以8bit为单位的常规字节?
6和8的最小公倍数为24,即 每4个base64字符可以表示3个常规字节;
回到刚才的文件A,编码过程:
(初始文件A)->"ABCDEFG"
(转UTF-8码 int)->65 66 67 68 69 70 71
("ABCDEFG"的二进制表示;7字节)->1000001 1000010 1000011 1000100 1000101 1000110 1000111
(高位补零)->01000001 01000010 01000011 01000100 01000101 01000110 01000111
(连写)->
(按6bit为单位对所有bit进行分割;得到10字节)->010000 010100 001001 000011 010001 000100 010101 000110 010001 11
(按6bit*4=8bit*3的对应关系再分割;得到3组6*4字节)->(010000 010100 001001 000011) (010001 000100 010101 000110) (010001 11)
(高位补2个零;末尾的低位也补零)->(00010000 00010100 00001001 00000011) (00010001 00000100 00010101 00000110) (00010001 00110000)
(二进制值换算成十进制)->(16 20 9 3) (17 4 21 6) (17 48)
(按base64编码的值-字符对应表,得出上面的十进制值对应的base64字符)->(Q U J D) (R E V G) (R w)
(每组base64字符都要求是4个,空白的位置补'='字符)->(Q U J D) (R E V G) (R w = =)
(文件A的最终转码结果)->QUJDREVGRw==
这里以文本文件作为演示,因为文本文件机器可读人也可读;实际情况中,很多时候转码的目标文件并不是文本文件,那就不能以可读字符串形式表示了,会直接以二进制格式表示
体积增大的原因,是因为3字节=24bit=分割成4个6bit-,对4个6bit高位补零后,就得到4个字节
也就是说3个常规字节经base64编码后会生成4个base64字节,这就是文件经base64转码后体积会增加1/3的原因
——————————
base64编码原理解释了,再看刚才的分段编码
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] buf1 = new byte[1024];
int count1;
while((count1 = file1.read(buf1)) != -1)
{
os1.write(Base64.encodeBase64(buf1), 0, count1); //可以发现一个问题:Base64.encodeBase64(buf1)编码后,体积会增加1/3,所以这里的Base64.encodeBase64(buf1)编码转换后的实际长度和count1并不相等,所以实际写入到os1中的base64字符数只有Base64.encodeBase64(buf1)编码产生的字符数的3/4
os1.flush();
}
file1.close();
System.out.println(os1.toString());
修改后:
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] byteBuf = new byte[1024];
byte[] base64ByteBuf;
while(file1.read(byteBuf) != -1)
{
base64ByteBuf = Base64.encodeBase64(byteBuf);
os1.write(base64ByteBuf, 0, base64ByteBuf.length);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
——————————
修改后,发现分段编码的结果发生了变化,跟之前不一样了
但仍然不是正确的结果
原因在于,base64字符的基础单位是(6bit*4=4字节),而3个常规字节(8bit*3)才能刚好产生4个base64字节
根本原因在于,如果进行编码的常规字节数不是3的倍数,最后就会余下1或2个字节,而这1、2个字节编码的结果就会产生'='字符;
使用1024作为分段编码缓冲时,编码的结果是3+3+3+...+1
也就是每次都会余1字节
而没有使用分段编码时,当编码到第1024个字节时,"余下"的1字节会跟后面的字节形成连续,就不会产生'='字符
(对一段byte字符进行base64编码时,中间是绝不会产生'='字符的,因为只有在结尾才可能余下1或2个字节,所以对一段byte字符进行编码时,只有结尾才可能产生1或2个'='补全字符)
——————————
解决方法是,使用3的公倍数作为缓冲区大小
修改后:
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] byteBuf = new byte[3*1000];
byte[] base64ByteBuf;
while(file1.read(byteBuf) != -1)
{
base64ByteBuf = Base64.encodeBase64(byteBuf);
os1.write(base64ByteBuf, 0, base64ByteBuf.length);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
测试结果再次发生了改变
中间不再有'='字符了,因为中间每次都是3字节3字节的编码,没有余下多余的字节
对比之后发现,中间段的结果已经正常了
——————————
但是,发现,结尾处两个转码的结果有些许不同
原因在于,假设文件A的长度为3001个字节;
在第二次循环读取时,只读到1个有效字节,而byteBuf的剩余2999个字节都是无效字节,而此时编码时,却把多余的2999个无效字节也编码了进去
(如果是非分段转码,就不会出现这种情况)
解决方法:
ByteArrayOutputStream os1 = new ByteArrayOutputStream();
InputStream file1 = new FileInputStream(path);
byte[] byteBuf = new byte[3*1000];
byte[] base64ByteBuf;
int count1; //每次从文件中读取到的有效字节数
while((count1=file1.read(byteBuf)) != -1)
{
if(count1!=byteBuf.length) //如果有效字节数不为3*1000,则说明文件已经读到尾了,不够填充满byteBuf了
{
byte[] = Arrays.Of(byteBuf, count1); //从byteBuf中截取包含有效字节数的字节段
base64ByteBuf = Base64.encodeBase64(); //对有效字节段进行编码
}
else
{
base64ByteBuf = Base64.encodeBase64(byteBuf);
}
os1.write(base64ByteBuf, 0, base64ByteBuf.length);
os1.flush();
}
file1.close();
System.out.println(os1.toString());
至此,base64分段编码才算大功告成。大文件上传核心代码才算大功告成。
其实代码改起来非常简单,但是不知道原因不知道原理的话,是无法无中生有的
对我本人来说原本只是想随便答一下,但没想到答的过程中发现自己有很多坑没有发现。答的过程中把自己不懂的地方没有发现的坑也完善了。不说碰到一个知识点就要追根究底,但实际开发中,每一个自己能亲身碰到的实际问题都是锻炼自己的绝佳机会,这种近距离触碰问题、解决问题的机会是难得的。虽然开发中还有很多其它问题也很重要,但你没有亲手碰到过,是无法共鸣的。所以自己在开发中碰到了问题,还是建议大概弄清原因。
弄清原理后,即使以后出现这个问题的其它"变种",也能找到原因并自己解决,但仅仅粘贴复制无法做到这一点。
❹ android中的xml文件中文乱码怎么解决
一、android sax库遇到gbk或gb2312编码时
方法1. 可以显示的指明编码比如
InputSource is = new InputSource(inputStream); is.setEncoding("UTF-8");
方法2. 使用InputStreamReader转换 在SDK中可以查看有这样实例化方法,参数二为字符集
InputStreamReader(InputStream in, Charset charset)
具体使用可以是
InputSource is=new InputSource(new InputStreamReader(inputStream,"gb2312"));
有关InputSource的细节, 如果有字符流可用,则解析器将直接读取该流,而忽略该流中找到的任何文本编码声明。如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使 用在 InputSource 中指定的编码,或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接 。
二、android开发网提倡尽量在服务器上配置使用utf-8编码,虽然显示英文字符较为两非,但是兼容性是最好的,也是国际最主流的标准。
❺ Android培训课程有什么内容
第一阶段的课程一般都是Java编程开发
这一部分应该会和Java后台有相关联的地方,但是比Java后台简单,这一阶段一般要学习Java语法和Java面向对象思想、Java数据结构及算法、GUI界面编程、Java进程与线程、Java网络通信与流、设计模式、数据库和Javaweb,安卓在这一阶段的学习内容看似和后台关联性很大,但是这一部分我们只学习后台一些基础的东西和日后会用到的东西,我们要把基础奠定好。
第二阶段要学习的内容是安卓基础开发
主要的课程内容为Android界面编程(界面编程是Android入门的核心技术,内容纵多,涉及四大组件之一Activity、Wedget、自定义View、事件处理、动画处理、列表、图片处理、国际化、资源文件、菜单、通知、对话框、Tools/ActionBar/Fragment、样式/主题、Intent。)、进程与线程、服务与广播、数据存储、网络通信、多媒体以及硬件相关,这一阶段更注重安卓入门基础的培训,一定要好好的把握。
接下来学习的内容是一个进阶阶段,主要学习的是安卓的高级开发,一般的课程内容为HOME开发、NDK开发等、地图开发项目发布等等,以上就算是安卓培训的所有学习内容,但是你掌握了学习内容之后还是远远不够的,一般的培训班都会给我们安排项目实战的,这是一种思想的锻炼,我们做什么就要有什么的思维做后台的有做后台的思维,做前端的有做前端的思维,我们学安卓的进行手机端APP开发的就要有安卓的思维,这一阶段也是很重要的,就好比我们在华清远见学完整体的内容之后也参与了一些项目的实战。
我把每一阶段要学习的课程都给你整理了,你可以现在有准备的去看一些基础的视频或者相关的书籍了。
安卓培训视频资料都有
❻ android super.ondestroy;放在前面好还是修改代码的后面好
生命周期的方法执行都是在主进程中是同步的,即先写先执行,后写后执行。super是重写父类的标识,一般情况super放前后都不会有什么问题,比如基本数据的加减不涉及到UI的操作。但不妨想一想,如果第一个生命周期oncreate的super没有执行,即该Activity初始化都没完成,你让它加载布局行吗?答案是NO,肯定会报错,所以特殊情况下系统会要求你必须Super初始化放前面。另外,按照Android编码规范,super初始化也是要求写前面的。
❼ 怎样快速理清一个android工程
确实没有发现好的工具,我说下我个人的意见吧,其实这个得根据个人的实际情况来看。
首先,你需要理解你们的项目需求,也即是你们的项目需要干啥,有哪些功能,这个需要看项目的需求文档。不过,有的公司,这个环节可能没文档,故只能做第二步了,如果没有功能文档需求,原型图,高保真总有吧,这个一定要看看,起码心里得有谱,这个项目到底到底会做成啥样。
然后,你就需要了解这个项目的功能模块划分了。项目有几个功能模块,前面的开发人员是如何划分,找前面的coder问下,这个时候还是先别看代码,不要太急,最好自己理个列表出来,然后再看下他们在每个模块下包含了哪些功能,这个需要多问前面的coder。
接着,要做的是,项目的是怎么组织的,这个时候,你可以开始关注代码了。你需要了解项目中层次是怎么划分的,各个层次间是怎么交互组织在一起,一般而言,我们需要关注下面几个层次:
1、网络层,即项目的网络层是怎么组织的,如何发起网络访问的。如果你需要做的功能较多,就有必要顺带看下他们的服务器接口文档。
2、数据库层,也即项目的数据库这块,有几张表,怎么执行增删改查等操作的。
3、项目中的实体模型有哪些,数据结构是如何组织的。
4、项目的视图层是如何和网络层、数据库层结合的,也即activity或fragement中如何调用网络和数据库,如何进行数据的处理的。简单说,就是数据是如何处理的,怎么来、到那里去。
下一步,就是开始理清他们的coder中,哪些类对应了哪些模块的哪些功能,一般是以包为单位或者通过命名区分的,这个时候,有必要了解下他们的编码规范和命名规则了,应该通过文件和资源的名称,很多时候,很好理清代码。这个时候,最好关注下他们有哪些基本的基类,你后面能直接用到的功能有哪些是他们已经写过了,或者可以直接从基类继承的。
经过上面的步骤后,我觉得,这个项目也差不多能理个头绪了,接着,你就可以尝试着写点或修改些功能了,可以先模仿别人的,然后再尝试着自己写写
❽ 如何优雅地使用Android Studio
1:快捷键不要恋旧用Eclipse的,还是耐心的学习IntelliJ IDEA的快捷键吧。(ls有快捷键的pdf文档下载地址)
2:如果团队之前使用Eclipse,现在仍有人使用Eclipse的话。建议下载Eclipse Code Formatter插件,导入之前Eclipse下自定义的代码格式规范。
3:本人并不习惯darcula的配色,所以下载了monokai的配色。
下载地址:OtaK/jetbrains-monokai-sublime · GitHub
下载后解压。在Android Studio中file->import setting 选择解压目录下的Monokai-Sublime.jar,勾选导入color scheme。注意在导入monokai配色方案之前先将主题设为darcula。
4:力荐Genymotion,速度真的很快。当然大部分时候我依然使用真机调试。
5:学会使用梯子。
6:内存8G以上,硬盘最好使用SSD。
7:查看有什么好用的Android Studio的插件值得推荐? - Android 开发
❾ android 和java fileinputstream 的区别
不可以简写,要有编码规范。 DataInputStream是数据输入流,读取的是java的基本数据类型。 FileInputStream是从文件系统中,读取的单位是字节。
❿ 如何把android-formatting.xml和android.importorder导入eclipse中
项目要Android移终端发代理软件Agent涉及API没加SDK所要源代码发用eclipse+ADT作android发工具说便HelloActivity程序我觉eclipse功能强我用eclipse发android源码我直接android源码工程导入eclipse般说都现错误说许类库(包)找参考
今找关于使用eclipse发android源码官文档:该文档实践总结几点:
1、使用eclipse编辑JAVA程序、检查错误(主要类库包含语面)能eclipse编译运行android源码shellmake(或mm或mmm)
2、android源码文件夹提供些eclipse配置文件
.claapath:eclipse工程配置文件便我直接android源码相应文件JAVA包导入工程
android-formatting.xmlandroid.importorder:重要主要用规范我编码风格更容易使我代码风格致
3、android源码作工程导入eclipse必须注意两点
1)、新建工程必须javaproject能androidproject否则破坏android源码(般添加文件/文件夹)
2)、导入前检查.classpath文件android源码否相应文件(文件夹)否则破坏android源码(般添加文件/文件夹)
总说:
1、用eclipse编辑代码、检查错误
2、eclipse编译、运行android源码程序能命令行通make(或mm或mmm)编译android源码
3、eclipse调试android源码程序(原理:eclipse通ddms服务器emulator进行调试)并单步调试、断点调试
面官文档总结具体用eclipse发android源码
1、建立基本android发环境
请参考官文档或<android模拟器ubuntu8.10安装>
2、编译android源码
android源码根目录通make进行编译请注意些配置具体参考<android源码编译>
3、eclipse工程配置文件复制android源码根目录
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the writable
4、修改eclipse程序配置
1)、修改eclipse缓存设置
eclipse.ini(eclipse软件安装目录)3值改面值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、android-formatting.xmlandroid.importorder导入eclipse
android-formatting.xml、.classpathandroid.importorder都放development/ide/eclipse/
android-formatting.xml用配置eclipse编辑器代码风格;android.importorder用配置eclipseimport顺序结构
window->preferences->java->Codestyle->Formatter导入android-formatting.xml
window->preferences->java->Codestyle->OrganizeImports导入android.importorder
3)、安装anyedit插件(选)
载并导入eclipse
5、android源码作工程导入eclipse
导入前先检查.classpath文件android源码否相应文件(文件夹)否则破坏android源码(般添加文件/文件夹).classpath余路径删除
新建JavaProject(androidproject否则破坏android源码)选择已存工程导入工程名任意完
导入eclipse要build工程比较慢导完般都没错误
6、eclipse调试android程序
先执行:
cd android源码目录
. build/envsetup.sh
lunch 1 # to build the emulator
emulator & # you should see a GUI picture of a phone
ddms & # you should get a splufty debugging console
eclipse配置调试类型端口:
Run->Debug Configurations->Remotejavaapplication双击Host:设 localhostPort:设8700ConnectionTypeStandard(SocketAttach)
Apply
注意点击Debug苦错说8700端口占用DDMS程序关掉重新打DDMSOK提供连VM错误请注意要先DDMS选某进程(应某应用程序)才能eclipse执行Debug
eclipse调试设断点、单步调试估计google团队发、调试android应用程序
7、编译android源码
执行:
cd android源码目录
. build/envsetup.sh
mm/mmm等命令mm/mmm用编译模块(包括C、C++、JAVA程序)我直接android源码根目录执行make模块名编译模块
类: Android-app, Android-SourceCode