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

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

Paste_Image.png

解决办法:
在build.gradle文件中android{}中加入下面这段代码

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

Paste_Image.png


Android Studio中Setting 没有 Android SDK

如图
Paste_Image.png

需要安装插件 SDK Updater
Paste_Image.png

这小东西能搞死个人


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));//规范用法

并添加上参数位置,如拼接的第一个参数是%1 s 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,经常会出现如下错误
image.png

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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值