小编rpa*_*abi的帖子

在成熟的项目中引入测试驱动开发(TDD)是否可行?

  • 假设我们已经意识到TDD的价值太晚了.项目已经成熟,很多客户开始使用它.
  • 假设使用的自动化测试主要是功能/系统测试,并且有大量的自动GUI测试.
  • 假设我们有新的功能请求和新的错误报告(!).所以很好的发展仍在继续.
  • 请注意,已经存在大量业务对象,没有或几乎没有单元测试.
  • 它们之间的协作/关系过多,只能通过更高级别的功能/系统测试进行测试.没有集成测试本身.
  • 大型数据库到位,有大量的表,视图等.为了实例化单个业务对象,已经进行了大量的数据库往返.

我们怎样才能在这个阶段引入TDD?

嘲弄似乎是要走的路.但是我们在这里需要做的嘲弄似乎太多了.听起来需要为现有的东西(BO,数据库等)工作的模拟系统开发精心设计的基础设施.

这是否意味着TDD只有从头开始才是合适的方法?我很想知道在已经成熟的产品中引入TDD的可行策略.

tdd unit-testing mocking

37
推荐指数
4
解决办法
3991
查看次数

使用垃圾收集有什么缺点?

大多数现代语言都内置了垃圾收集(GC).例如Java,.NET语言,Ruby等.事实上,GC以多种方式简化了应用程序开发.

我很想知道用GCed语言编写应用程序的限制/缺点.假设GC实施是最佳的,我只是想知道我们可能会受到GC的限制,无法做出一些优化决策.

garbage-collection

17
推荐指数
3
解决办法
2万
查看次数

如果renderscriptTargetApi> 20,则Renderscript不生成librs.xx.so

我正在使用renderscript进行音频dsp处理.它运行良好,直到我决定将renderscriptTargetApi版本从19提升到24,试图以向后兼容的方式使用更新的renderscript API.

编译没有问题,但在运行时,logcat会显示这样的错误

05-31 19:40:23.097 8661-8734/com.example.audio.test E/RenderScript:无法打开共享库(/data/user/0/com.example.audio.test//lib/librs.xx .so):dlopen失败:未找到库"libRSSupportIO.so"

如果我有renderscriptTargetApi19或20,我的apk有librs.xx.so没有错误.如果我将它碰到21,23或24,librs.xx.so则不会生成,因此我有此运行时错误.

我正在通过NDK使用renderscript,即C++.也使用CMake.我没有找到通过NDK使用renderscript支持库的指令.所有指令都假定支持库是通过Java使用的.

这是来自 build.gradle

    ndk {
        abiFilters 'armeabi-v7a', 'x86'
    }

    renderscriptTargetApi 24
    renderscriptSupportModeEnabled true
    renderscriptNdkModeEnabled true
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt 具有

add_library (dsp SHARED
  ${SRC_PATH}/dsp.cpp
  ${SRC_RS_PATH}/xx.rs ${SRC_RS_GENERATED_PATH}/ScriptC_xx.cpp)

target_compile_options(dsp PRIVATE 
  -std=c++11 -stdlib=libc++ -fno-rtti -fexceptions -Ofast)

target_link_libraries(dsp RScpp_static dl ${log-lib})
Run Code Online (Sandbox Code Playgroud)

这是 xx.rs

#pragma version(1)
#pragma rs java_package_name(com.example.audio)
#pragma rs_fp_relaxed

float RS_KERNEL my_kernel(float in, uint32_t x) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这就是从C++调用内核的方式

sp<RS> rs = new RS();
rs->init(app_cache_dir);

sp<const Element> e …
Run Code Online (Sandbox Code Playgroud)

android android-ndk renderscript android-support-library android-rendering

14
推荐指数
0
解决办法
408
查看次数

Espresso - 在全屏活动上执行操作失败 - InjectEventSecurityException

我浪费了两天时间尝试在全屏活动上执行点击操作.

重现步骤

  1. 使用全屏活动代码模板在android studio中创建一个新项目
  2. 为活动写一个espresso测试以执行点击

    public class FullscreenActivityTest 
                  extends ActivityInstrumentationTestCase2<FullscreenActivity> {
    public FullscreenActivityTest() {
        super(FullscreenActivity.class);
    }
    
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        getActivity();
    }
    
    public void testClickingOnLayout() {
        onView(withId(R.id.fullscreen_content)).perform(click());
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

  3. 在模拟器上运行此测试(从姜面包到棒棒糖的任何Android版本).

失败

android.support.test.espresso.PerformException: 
Error performing 'click' on view 'with id: com.example.espressodefect:id/fullscreen_content'
...
Caused by: android.support.test.espresso.PerformException: 
Error performing 'Send down montion event' on view 'unknown'.
...
Caused by: android.support.test.espresso.InjectEventSecurityException: java.lang.SecurityException: 
Injecting to another application requires INJECT_EVENTS permission
Run Code Online (Sandbox Code Playgroud)

满堆栈在这里.

试着

我试过以下没有运气:

  • 模拟器上没有锁定屏幕.(还使用更新的活动WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD)
  • 所有动画都关闭了
  • 没有屏幕键盘,或任何覆盖在应用程序顶部的任何东西. …

android android-testing android-espresso

13
推荐指数
1
解决办法
3329
查看次数

InApp Billing:java.lang.SecurityException需要READ_PHONE_STATE

我在谷歌商店的应用程序崩溃报告中遇到了很多例外.有人能解释一下可能导致这种情况的原因吗?我使用的是android:targetSdkVersion = 19

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10131 nor current process has android.permission.READ_PHONE_STATE.
    at android.os.Parcel.readException(Parcel.java:1546)
    at android.os.Parcel.readException(Parcel.java:1499)
    at com.android.vending.billing.IInAppBillingService$Stub$Proxy.getSkuDetails(IInAppBillingService.java:251)
    at com.inapp.util.IabHelper.querySkuDetails(IabHelper.java:920)
    at com.inapp.util.IabHelper.queryInventory(IabHelper.java:550)
    at com.inapp.util.IabHelper.queryInventory(IabHelper.java:522)
    at com.inapp.util.IabHelper$2.run(IabHelper.java:617)
    at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

android securityexception in-app-purchase in-app-billing

12
推荐指数
1
解决办法
1297
查看次数

你是如何原型的?

我们对设计GUI进行原型设计,仅用于分析特定问题,概念证明等.有时我们会丢弃原型,有时它最终会出现在生产代码中.我们使用不同的语言,技术,策略和样式进行原型设计.

您通常采用哪种不同的原型以及如何进行原型设计?有什么好资源可以掌握这个技术吗?

prototyping

7
推荐指数
2
解决办法
734
查看次数

如何在YAML中指定范围?

我可以表达

第3页是标题页

在YAML

title: 3
Run Code Online (Sandbox Code Playgroud)

以下怎么样?

第10至15页包含第1章

一种方法是

chapter 1: [10, 11, 12, 13, 14, 15]
Run Code Online (Sandbox Code Playgroud)

我更喜欢这里的射程.在YAML中有类似的东西吗?

chapter 1: (10..15)
Run Code Online (Sandbox Code Playgroud)

**更新**

如果在YAML中没有范围这样的东西,以下将是我的选择

chapter 1:
   start page: 10
   end page: 15
Run Code Online (Sandbox Code Playgroud)

syntax yaml

7
推荐指数
2
解决办法
8391
查看次数

如果USAGE_SHARED,则在启用GPU的驱动程序上Renderscript失败

我们使用renderscript进行音频dsp处理.它很简单,并且对我们的用例显着提高了性能.但是USAGE_SHARED,对于具有启用GPU执行的自定义驱动程序的设备,我们遇到了一个恼人的问题.

您可能知道,USAGE_SHAREDflag使renderscript分配重用给定的内存,而不必创建它的副本.因此,它不仅可以节省内存,在我们的情况下,可以将性能提高到所需的水平.

以下代码USAGE_SHARED在默认的renderscript驱动程序(libRSDriver.so)上工作正常.使用自定义驱动程序(libRSDriver_adreno.so)USAGE_SHARED不会重用给定的内存,从而重用数据.

这是使用USAGE_SHARED和调用renderscript内核的代码

void process(float* in1, float* in2, float* out, size_t size) {
  sp<RS> rs = new RS();
  rs->init(app_cache_dir);

  sp<const Element> e = Element::F32(rs);
  sp<const Type> t = Type::create(rs, e, size, 0, 0);

  sp<Allocation> in1Alloc = Allocation::createTyped(
                rs, t,
                RS_ALLOCATION_MIPMAP_NONE, 
                RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
                in1);

  sp<Allocation> in2Alloc = Allocation::createTyped(
                rs, t,
                RS_ALLOCATION_MIPMAP_NONE, 
                RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
                in2);

  sp<Allocation> outAlloc = Allocation::createTyped(
                rs, t,
                RS_ALLOCATION_MIPMAP_NONE, 
                RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, …
Run Code Online (Sandbox Code Playgroud)

performance android signal-processing renderscript android-renderscript

7
推荐指数
1
解决办法
252
查看次数

我是否需要扩展FirebaseInstanceIdService才能订阅FCM主题?

我想从客户端(Android应用程序)管理主题订阅.我目前正在onCreate()上进行活动.我想知道正确的方法是在InstanceIdService :: onTokenRefresh()上订阅/取消订阅,还是在任何方便(按钮点击等).

简而言之,如果我在客户端管理主题订阅(没有服务器),我是否仍然需要使用InstanceIdService?

不同的文档来源对Firebase Cloud Messaging(FCM)主题订阅提供了不同的看法.有些人提到InstanceIdService,有些则没有.他们来了:

  1. 使用Firebase控制台发送主题消息的 Firebase指南

在谈论主题订阅时,它没有提到InstanceIdService.

完成设置任务后,您可以添加客户端代码以订阅主题,然后处理发送到主题的消息.

客户端应用程序可以订阅任何现有主题,也可以创建新主题.当客户端应用程序订阅新主题名称(Firebase项目尚不存在)时,将在FCM中创建该名称的新主题,随后任何客户端都可以订阅该主题.

要订阅主题,客户端应用程序会使用FCM主题名称调用Firebase Cloud Messaging subscribeToTopic():

FirebaseMessaging.getInstance().subscribeToTopic("news");
Run Code Online (Sandbox Code Playgroud)
  1. Firebase Android Codelab

MyFirebaseInstanceIdService类将是用于处理FCM逻辑的服务.此服务用于在生成新的InstanceID令牌时警告应用程序,并检索生成的令牌.

修改它以扩展FirebaseInstanceIdService并覆盖onTokenRefresh方法以订阅主题.使用以下代码更新MyFirebaseInstanceIdService中的onTokenRefresh方法,如下所示:

public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {

   private static final String TAG = "MyFirebaseIIDService";
   private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage";

   /**
    * The Application's current Instance ID token is no longer valid 
    * and thus a new one must be requested.
    */
   @Override
   public void onTokenRefresh() {
       // If you need to handle the generation of a token, …
Run Code Online (Sandbox Code Playgroud)

android firebase firebase-cloud-messaging

6
推荐指数
1
解决办法
1942
查看次数

在什么情况下静态分配比动态分配更好?

我正在做一些制作Xara Xtreme的决定,这是一个开源的SVG图形应用程序.他们的内存管理决策对我来说非常有趣,因为我天真地认为按需动态分配是编写面向对象应用程序的方式.

文档中的解释是

静态分配如何才能有效?

如果您习惯于大型动态数据结构,这对您来说可能很奇怪.首先,我们所有的对象(以及分配大小)都比(例如Impression)程序中的每个动态区域分配小得多(平均).这意味着虽然内存中可能存在许多漏洞,但它们很小.此外,我们在内存中分配的对象要多得多,因此这些漏洞很快就会被填满.此外,虚拟内存管理器将释放任何不包含分配的内存页面,并将此内存返回给操作系统,以便可以再次使用它(由我们或其他任务).

每当我们以这种方式分配内存时,我们都无需移动任何内存.这证明了ArtWorks的一个瓶颈,它也同时使用了许多小的分配.更多

简而言之,存在大量小对象和防止内存移动的需要是选择静态分配的原因.我对上述原因并不清楚.

虽然这谈到静态分配,但我从粗略看一下代码看到的是,在应用程序启动时动态分配内存块并保持活动直到应用程序结束,大致模拟静态分配.

你能解释静态分配在什么情况下比按需动态分配更好,以便将其视为严肃应用中的主要分配方式?

memory memory-management

5
推荐指数
1
解决办法
806
查看次数