android导出apk

1.在r19之后,Android SDK Tool Export的时候遇到is not translated in的问题

这是因为Android SDK Tool 將 ANDROID_LINT_COMPLETE_REGIONS 改为了默认需要检查。
临时解决方法:
Eclipse > Preference > Android > Lint Error Checking的Correctness: Messages > MissingTranslate
将 Severity 值由 Fetal 改为 Warning。

2.>proguard.cfg 混淆文件出错, Obsolete proguard file;

修改 proguard.cfg
把有错行的 “keepclasseswithmembernames” 改为 “keepclasseswithmembers”
重编绎 (点Lint Warnings view里的refresh灯泡左边的按钮)

3.导出apk完成前报unresolved references to program class members.

在proguard.cfg文件中加入-ignorewarnings就可以跳过这个错误了。

启动模拟器

命令行到sdk/tools目录下

emulator -avd xxx -scale 0.75

#其中xxx是C:\Users\用户名\.android\avd\目录下xxx.avd

 安装apk到模拟器

运行完成模拟器,命令行到sdk/platform-tools目录下

adb install xx.apk

1.root手机
下载tcpdump
……

查看apk中源码

把classes.dex文件反编译为.jar文件

下载dex2jar,解压,把class.dex 拷贝到 dex2jar.bat 所在目录,拖动 class.dex 到 dex2jar.bat,生成 classes_dex2jar.jar

从jar文件中查看源码

下载JD-GUI,用JD-GUI打开classes_dex2jar.jar,查看源码

混淆

ProGuard是一个SourceForge的开源项目。官网网址是:http://proguard.sourceforge.net/。
Java的字节码一般是非常容易反编译的。为了保护Java源代码,要对编译好的class文件进行混淆处理。ProGuard的主要作用是混淆,它还能对字节码进行缩减体积、优化等。
在Android 2.3以后,Google将这个工具加入到了SDK的工具集里。具体路径:SDK\tools\proguard。

混淆规则文件proguard-project.txt
工程属性文件project.properties
在project.properties中设置proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
即启用了sdk中的proguard-android.txt混淆规则文件和工程中的proguard-project.txt混淆规则文件。
通过Android Tools导出Application Package时,Proguard就会自动启用优化混淆代码。

从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及com.android.vending.licensing.ILicensingService,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等。

在工程中的proguard-project.txt中增加自定义的忽略混淆:
忽略R文件的混淆:
-keep class **.R$* {*;}
忽略某个包的混淆:
-keep class packagename1.** {*;}

http://www.blogjava.net/zh-weir/archive/2011/07/12/354190.html

Android

资源文件大小问题

在assets或res/raw中的单个资源文件超过1M会读取失败,但修改文件名为.png则可以读取成功。在模拟器上测试通过。

iPhone比android顺滑的原因

很多Andorid手机的内存都比iPhone的内存大,但很多人都知道Android手机在使用的时候总感觉没有iPhone顺滑,这并非Java GC导致暂停,也不是因为Android运行的是Java编译的bytecode而iOS运行的native code,根本的原因是iOS的UI渲染采用实时优先级,而Android的UI渲染遵循传统电脑模式的主线程普通优先级。
在iPad或iPhone上打开Safari加载一个复杂的网页,当网页加载到一半时,用手指在屏幕上并且四处移动,会发现所有的渲染立刻停止。在拿开手指后,网页才继续加载。
除了UI渲染,Android缺乏有效的的硬件加速也是一个原因,在不同的Android手机上的硬件加速存在巨大差异,而苹果是唯一一个既做硬件又做软件的手持设备公司,只有苹果可以在硬件中插入对软件的优化,使得基于苹果芯片的设备不仅省电,而且流畅。
实际上,Android的开发工作在第一代iPhone发布之前就已经开始了,原始Android原型体被设计成为使用键盘手机的设备,也就是黑莓手机的竞争对手。UI渲染优先级别在有键盘的手机上并没有那么重要。但是在iPhone发布之后,Android小组为了快速推出能与iPhone竞争的产品,迅速将Android改成触摸屏手机系统,但那时重写UI框架已经不可能了。因为如果这样Android应用市场中的所有程序将变得不可用,这种关系将一直处于恶性循环之中。

Android的系统架构

从高到低分为4层:应用层、应用框架层、系统运行库层、Linux内核层
应用层由各个应用程序组成。
应用框架层即开发时使用的API框架。
系统运行库是一些c/c++库,来支持应用框架层的API。

Java虚拟机与Dalvik虚拟机

dex是Dalvik虚拟机专用的文件格式,dex把所有class文件整合到一个文件中。
一个应用是一个进程,也是一个虚拟机实例。

Android Support V4, V7, V13

Support库的作用:
使低版本上可以支持高版本上推出的某些新功能;
使一些代码可以向下兼容,而不需要区分Android版本。
提供了一些所有andrid版本之外的功能;
Android Support V4, V7, V13区别:
Android support v4包是为Android 1.6(API版本为4)及以上的版本设计的,而从android-support-v4-24.2.0开始,V4包支持的最低版本是Android 2.3(API Level 9)。
android.support.v4的工作方式:
a.当运行在Android版本是4-10手机上,手机Android框架没有提供Fragmeng提供的功能:则android.support.v4支持库会调用自身android.support.v4.app.Fragment;
b.当运行在Android版本是11及以上的手机上,手机Android框架提供了Fragmeng提供的功能:则android.support.v4支持库会调用手机Android框架android.app.Fragment。
也就是说,如果应用调用其中一个支持类的方法,则支持库的行为将取决于运行应用的手机的Android 版本。如果手机Android框架提供必要的功能,则支持库将通过调用手机Android框架执行任务。如果应用在旧版本的 Android 上运行,且手机Android框架未提供所需的功能,则支持库自身可能会尝试提供相应的功能或什么都不做。无论是哪一种情形,应用通常都不需要检查其在哪一版本的 Android 上运行,而是通过支持库执行检查并选择适当的行为。
还有一些android.support.v4中类,比如ViewPager等,不管在Android那个版本,都没有这个类,所以要用到ViewPager,就必须引用android.support.v4包了。
随着系统的迭代Android 1.6的设备已经很少了,官方在Support Library 24.2.0版本的时候移除了对Android 2.2(API Level 8)及以下版本的支持,所以从Android Support v4 24.2.0开始,V4包支持的最低版本是Android 2.3即API Level 9,我们可以发现android-support-v4后面都跟着版本号:比如android-support-v4-23.0.0 (对应Android Api Level 23)。

http://www.jianshu.com/p/d36a1e5bf246

关于mtp模式下看不到新建的文件和文件夹的问题

Android设备以文件传输(mtp模式)方式连接pc时,在Android文件传输工具中发现在手机上新建的文件格文件夹不能显示出来,但是重启Android设备就可以显示出来…
https://www.jianshu.com/p/5937d341a698
https://blog.csdn.net/qq_29654885/article/details/80436847

布局文件可以通过两种方式装载(动态和静态),Intent只能传递简单数据类型。

Android开发资源

Render After Effects animations natively on Android and iOS
https://github.com/airbnb/lottie-android

7.推荐的下拉刷新组件 chrisbanes / Android-PullToRefresh
https://github.com/chrisbanes/Android-PullToRefresh
http://blog.csdn.net/wwhh393/article/details/9722199

8. onTouchEvent和setOnTouchListener中onTouch的区别
从sdk中的代码来看就可以明白了
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
http://www.cnblogs.com/shitianzeng/articles/2467533.html

9.addHeaderView
addHeaderView要在setAdapter之前调用,
HeaderView不要设置setLayoutParams

EditText editText=new EditText(this);
editText.setText(“abc”);
listView.addHeaderView(editText);

10.给列表提供empty view
这个emptyview必须是被加入到listview的父级中的view
//代码方式
TextView emptyView = new TextView(this);
emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
emptyView.setText(“还没有分组”);
emptyView.setTextSize(20);
emptyView.setVisibility(View.GONE);
emptyView.setGravity(Gravity.CENTER);

ViewGroup vg=(ViewGroup)listView.getParent();
vg.addView(emptyView);

listView.setEmptyView(emptyView);

11.一些listView常用动态设置
listView.setCacheColorHint(0);//滚动时透明
Drawable color=new ColorDrawable(0xFF000000);//或使用Color.parseColor(“#FFFFFF”),使用0x00FFFFFF显示不出来。
listView.setDivider(color);
listView.setDividerHeight(1);
listView.setTextFilterEnabled(true);

layout

1.在布局xml中使用 标签重用layout代码

通过include标签也可以覆写一些属性的值:

2.设置背景透明
android:background=”@android:color/transparent”
或 android:background=”#00000000″ 即alpha为0

3.安卓有一些内置的id,在使用系统组件时有的必须在布局文件中提供定义为这些id的组件。
例如:ListView android:id=”@id/android:list”
TextView android:id=”@id/android:empty”
在代码中使用的方式例如 android.R.id.empty

4.android:layout_weight
LinearLayout为竖直方向时设置某个子控件的android:layout_height=”0dp” android:layout_weight=”1″,此子个控件占用剩余空间的比例为:本控件weight值 / LinearLayout内所有控件的weight值的和,最大为100%。

style=”?android:attr/progressBarStyleSmall”

对于能够显示文字的控件(如TextView EditText RadioButton Button CheckBox Chronometer等等),有时需要控制字体的大小。Android平台定义了三种字体大小。
“?android:attr/textAppearanceLarge”
“?android:attr/textAppearanceMedium”
“?android:attr/textAppearanceSmall”

使用方法为:
android:textAppearance=”?android:attr/textAppearanceLarge”
android:textAppearance=”?android:attr/textAppearanceMedium”
android:textAppearance=”?android:attr/textAppearanceSmall”

style=”?android:attr/textAppearanceLarge”
style=”?android:attr/textAppearanceMedium”
style=”?android:attr/textAppearanceSmall”

tools:标签

tools属性主要针对开发预览,编译中不会起作用。
tools:context=”.MainActivity”
tools:text=”Sample Text”

http://blog.csdn.net/xiabing082/article/details/50563559

AndroidManifest.xml

1.标签中添加
表示此Activity为默认运行的主Activity。

2.在声明Activity时加上属性android:screenOrientation,属性取值landscape为固定横屏、portrait为固定纵屏幕。

3.
这句可防止,在页面载入时输入框立即获取焦点并弹出输入法。同时可以使,在输入框激活时页面自动向上移动适应输入面板的高度。
参考
http://yezhiqiu-love-yeah-net.iteye.com/blog/1007901
http://www.android123.com.cn/androidkaifa/522.html
http://zhoubo526.javaeye.com/blog/736133

4.Application context
要在整个应用中共享全局数据,在java中一般是采用静态变量,而在android中有个更优雅的方式是使用Application context。
通过写一个继承Android.app.Application的类,来保存全局变量,它不会因为Activity的生命周期结束而消失。static数据可能会像Activity一样在某些时候被android系统强行销毁。所以在应用程序运行期间,静态数据值可能会丢失,或得到一些错误值。
在manifest的Application标签中添加属性 android:name=”.MyApplication”
MyApplication myApplication = (MyApplication)getApplicationContext();
参考 http://www.pin5i.com/showtopic-android-application-level-variable-global-variable.html
http://www.eoeandroid.com/thread-163-1-1.html
http://androidstudy.iteye.com/blog/776127

5. uses-sdk
在AndroidMenifest.xml中

在default.properties中,
target=android-10

如果目标设备的API版本小于minSdkVersion,或者大于maxSdkVersion,程序将无法安装。一般没有必要设置maxSdkVersion。
targetSdkVersion,如果设置了此属性,在程序执行时,如果目标设备的API版本等于此数值,系统会认为此程序在此版本已经过充分测,不必为此程序开启兼容性检查判断工作。

在default.properties中的target是指在编译时使用的sdk版本。

这四个值作用于不同时期:
target API level在编译的时候起作用,指定使用哪个API版本(SDK版本)进行编译。
minSdkVersion和maxSdkVersion在程序安装的时候起作用,指定哪些版本的设备可以安装此应用。
targetSdkVersion在程序运行的时候起作用,提高指定版本的设备上程序运行体验。

http://www.jb51.net/article/38774.htm

Android工程配置

引用工程外的代码

在java build path/source中,link source,选择外部代码所在的src目录,修改目录名。
或者添加lib,在Android/Library中添加,
把工程设置为lib工程,只需勾选lib工程的Is Library。

使用.so

把so文件放到jni\prebuilt中,并在其中新建Android-um.mk,输入内容

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
LOCAL_MODULE := mppay
LOCAL_SRC_FILES := libmppay.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := entryex
LOCAL_SRC_FILES := libentryex.so
include $(PREBUILT_SHARED_LIBRARY)