您的位置:首页 > 移动开发 > Android开发

Android Develop Tips(个人开发踩坑汇总)

2017-12-22 17:08 344 查看

ButterKnife app:transformResourcesWithMergeJavaResForDebug

Error:Execution failed for task
':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/services/javax.annotation.processing.Processor
File1: C:\Users\trascyliu\.gradle\caches\modules-2\files-          2.1\com.google.auto.service\auto-service\1.0-rc2\51033a5b8fcf7039159e35b6878f106ccd5fb35f\auto-service-1.0-rc2.jar
File2: C:\Users\trascyliu\.gradle\caches\modules-2\files-2.1\com.jakewharton\butterknife-compiler\8.1.0\1738ff5263b279bb0c99bf4be595b8480314d4ec\butterknife-compiler-8.1.0.jar




解决办法:

在build.gradle文件中android{}中加入下面这段代码

packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
}




Android Studio中Setting 没有 Android SDK

如图



需要安装插件 SDK Updater



这小东西能搞死个人

android:descendantFocusability属性

如果你的自定义ListViewItem中有Button、ImageButton或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus。所以常常当点击item时变化的是子控件,item本身的点击没有响应。

android:descendantFocusability="blocksDescendants" //viewgroup会覆盖子类控件而直接获得焦点android:focusable="false"
android:descendantFocusability="beforeDescendants" //viewgroup会优先其子类控件而获取到焦点
android:descendantFocusability="afterDescendants"   //viewgroup只有当其子类控件不需要获取焦点时才获取焦点


Android4.2以上版本 getPackageSizeInfo()改变

在Android4.2以上版本中, PackageManager.getPackageSizeInfo(String packageName, IPackageStatsObserver observer)不可用,

改为PackageManager.getPackageSizeInfo(String packageName, int userHandle, IPackageStatsObserver observer), 至于增加的参数userHandle的解释是:The user whose size information should be retrieved。下面是PackageManager内部的用法

public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);


}

最后更改为:

private void getPacakgeStats(String pkgName) {
if (pkgName != null) {
try {
Method getPackageSizeInfo = mPm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,
int.class, IPackageStatsObserver.class);
/**
* after invoking, PkgSizeObserver.onGetStatsCompleted() will be called as callback function. <br>
* About the third parameter ‘Process.myUid() / 100000’,please check:
* <android_source>/frameworks/base/core/java/android/content/pm/PackageManager.java:
* getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
*/
getPackageSizeInfo.invoke(mPm, pkgName, Process.myUid() / 100000, new PkgSizeObserver());
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}


}

测试后,可用。通过查阅资料,其中Process.myUid() / 100000的解释为:

表示多用户中的某一个用户,因为一个用户装的apk可以有100000个,用uid表示,uid/100000的商就是某个特定的用户id也叫userId或者userHandle。

https://segmentfault.com/q/1010000004956250

jsoup with proguard force close 强制退出

Android studio 进行代码混淆时,如果你有用到jsoup 的第三方jar

Android Studio中proguard-rules.pro 文件中添加 -keep class org.jsoup.**

windowSoftInputMode=”adjustResize”

如果你在 manifest 中把一个 activity 设置成

android:windowSoftInputMode=”adjustResize”,


那么 ScrollView(或者其它可伸缩的 ViewGroups)会缩小,从而为软键盘腾出空间。但是,如果你在 activity 的主题中设置了

android:windowFullscreen=”true”,


那么 ScrollView 不会缩小。这是因为该属性强制 ScrollView 全屏显示。然而在主题中设置

android:fitsSystemWindows=”false” 也会导致 adjustResize 不起作用;


Android studio下 找到SystemProperties

SystemProperties

在android.os下,可以用于获取系统属性(wifi)但这个类是隐藏的,上层程序开发无法直接使用。

要使用这个类,有两种方法导入layoutlib.jar 和 反射(反射可能会出现很多问题)。

导入layoutlib.jar

在build.gradle文件定义个变量,获取SDK_DIR路径。然后在

String SDK_DIR = System.getenv("ANDROID_SDK_HOME")
if(SDK_DIR == null) {
Properties props = new Properties()
props.load(new FileInputStream(project.rootProject.file("local.properties")))
SDK_DIR = props.get('sdk.dir');
}

dependencies {
provided files("${SDK_DIR}/platforms/android-20/data/layoutlib.jar")
}


如何在AIDL中用正确的姿势unbindService()

1.注意保持Context对象的一致性,bind和unbind是同一个上下文对象。

2.判断mBind,来确保unbind的时候service对象不为null.

private ServiceConnection mConnection= new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iWeather = IWeather.Stub.asInterface(service);
mBind = true;
}

@Override
public void onServiceDisconnected(ComponentName name) {
mBind = false;
}
};


https://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android

https://stackoverflow.com/questions/6645254/when-should-i-use-unbindservice-and-how-should-i-use-it-properly-to-unbind-fr

android:configChanges属性

android:configChanges=”locale|layoutDirection”

“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变


R.string.xml占位符避免硬解码(Hardcode)

String name = "张三";
int age = 21;
tx2.setText("名字是"+name+",年龄是"+age+"的用户");//不规范用法
tx2.setText(String.format("名字是%s,年龄是%d的用户",name,age));//规范用法


并添加上参数位置,如拼接的第一个参数是%1s,s表示为字符串类型。

<string name="info">名字是%1$s,年龄是%2$d的用户</string>


Error: Your project contains C++ files but it is not using a supported native build system

在从eclipse工程导入AS时,如果原工程含有JNI,经常会出现如下错误



解决办法:

将如下代码加在build.gradle(app),放在buildTypes{}之上,适用于不需要重新编译so的情况。

sourceSets { // 禁用自动执行ndk-build
main {
jni.srcDirs = []
}
}


目前没有找到这行代码的合理解释。



https://stackoverflow.com/questions/40065871/error-your-project-contains-c-files-but-it-is-not-using-a-supported-native-bu

拓展阅读

Android Studio 开发JNI笔记–①

向您的项目添加 C 和 C++ 代码

/dev/kvm is not found on Mac OS

Mac环境下模拟器不能正常使用

1.Go to: System Preferences > Security & Privacy > General


There should be a message like “System software from developer xxx was blocked from loading.”

2.Click Allow


https://stackoverflow.com/questions/46565353/dev-kvm-is-not-found-on-mac-os
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: